Migrate from Dokku
Dokku is a single-host “mini-Heroku” — great until you need more than one host. dockmesh is the natural next step if your reason for moving is scale, not PaaS features.
When to migrate
Section titled “When to migrate”- You’ve outgrown a single Dokku host and need multi-host
- You want git-push deploys + multi-host management
- You need RBAC/SSO (Dokku Pro is paid)
- You want backups managed by the orchestrator
When not to migrate
Section titled “When not to migrate”- You love git-push deploys and don’t need multi-host → stay on Dokku
- Your apps use Dokku’s buildpacks (Heroku buildpacks) and you don’t want to Dockerize → stay on Dokku
dockmesh is not a buildpack-based PaaS. You need Dockerfiles.
Step 1 — Dockerize your apps
Section titled “Step 1 — Dockerize your apps”If your Dokku apps are Docker-based already (dokku builder-dockerfile:set), skip this step.
If they use Herokuish/buildpacks, convert:
# Example for a Node.js appFROM node:20-alpine AS buildWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
FROM node:20-alpineWORKDIR /appCOPY --from=build /app ./EXPOSE 3000CMD ["node", "server.js"]Test locally:
docker build -t myapp .docker run -p 3000:3000 myappDo this for each app. The compose.yaml comes next.
Step 2 — Install dockmesh
Section titled “Step 2 — Install dockmesh”On a new host (or your existing Dokku host — they coexist):
curl -fsSL https://get.dockmesh.dev | bashStep 3 — Convert Dokku apps to Compose stacks
Section titled “Step 3 — Convert Dokku apps to Compose stacks”Each Dokku app becomes a dockmesh stack. A simple one:
services: app: image: ghcr.io/yourorg/myapp:latest restart: unless-stopped environment: DATABASE_URL: ${DATABASE_URL} NODE_ENV: production depends_on: [db]
db: image: postgres:16 restart: unless-stopped environment: POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - db_data:/var/lib/postgresql/data
volumes: db_data:For Dokku apps with attached databases (dokku postgres:link), add the DB as a service in the same compose file (as above).
Step 4 — Migrate data
Section titled “Step 4 — Migrate data”PostgreSQL databases
Section titled “PostgreSQL databases”# On Dokku hostdokku postgres:export myapp-db > myapp-db.sql
# Copy to dockmesh hostscp myapp-db.sql dockmesh-host:/tmp/
# Restoredocker exec -i myapp_db_1 psql -U postgres < /tmp/myapp-db.sqlPersistent storage
Section titled “Persistent storage”Dokku’s /storage mount becomes a named volume:
# On Dokku hosttar czf myapp-storage.tar.gz -C /var/lib/dokku/data/storage/myapp .
# On dockmesh hostdocker volume create myapp_storagedocker run --rm -v myapp_storage:/data -v /tmp/myapp-storage.tar.gz:/src.tar.gz alpine \ tar xzf /src.tar.gz -C /dataThen in compose:
services: app: volumes: - myapp_storage:/app/storage
volumes: myapp_storage: external: trueStep 5 — Domains + TLS
Section titled “Step 5 — Domains + TLS”Dokku uses nginx + Let’s Encrypt. dockmesh uses Caddy.
For each app in dockmesh:
- Stack detail → Proxy → Add route
- Domain: same as Dokku (e.g.
myapp.example.com) - Target: the app’s container
- TLS: Automatic
DNS doesn’t need to change if the dockmesh host IP is the same. If different, update DNS before cutting over.
Step 6 — Git push deploys (optional)
Section titled “Step 6 — Git push deploys (optional)”Dokku’s killer feature is git push dokku main. Replicate it with:
Option A: dockmesh Git integration
Section titled “Option A: dockmesh Git integration”Configure the stack as Git-backed: dockmesh polls a Git repo for compose.yaml changes + image tag updates.
Option B: CI builds, dockmesh deploys
Section titled “Option B: CI builds, dockmesh deploys”Use GitHub Actions or GitLab CI to:
- Build on push
- Push image to registry
- Call dockmesh API to redeploy
Result: git push still triggers a production deploy. More machinery, more flexible.
Step 7 — Retire Dokku
Section titled “Step 7 — Retire Dokku”Once all apps migrated and traffic cutover via DNS:
# On the old Dokku host, remove Dokku itself (if dedicated machine)apt remove dokkurm -rf /var/lib/dokkuKeep the host around for a week as rollback. Delete once confident.
Dokku features dockmesh doesn’t have
Section titled “Dokku features dockmesh doesn’t have”- Buildpacks — you need Dockerfiles
dokku logs --tailfrom CLI — use UI ordocker logsvia SSHdokku config:set— use dockmesh UI env vars (arguably better)dokku ps:scale web=3— dockmesh has Scaling with similar semantics- Plugin ecosystem — dockmesh has fewer plugins (it’s a different architecture)
Features Dokku doesn’t have
Section titled “Features Dokku doesn’t have”- Multi-host
- RBAC + SSO
- Audit log
- Backup target types beyond local
- Prometheus metrics
- Web UI (Dokku has the commercial Dokku Pro for this)
See also
Section titled “See also”- GitHub Actions — git-push-to-deploy pipeline
- Multi-Host — the reason you’re migrating
- Stack Templates — reuse common app patterns