Client project · Sep – Oct 2026
One deploy panel for 13 production servers
Put 13 servers and their apps under one self-hosted Dokploy panel, then moved 11 live apps over in two days with zero downtime.
- Role
- Infrastructure lead (for a client)
- Period
- Sep – Oct 2026
Results
Public figures and figures from the codebase, checked October 2026.
- 13servers attached to one panelfrom the codebase
- 11live apps moved in two days, with no downtimefrom the codebase
- 24commands in the fleet CLIfrom the codebase
- 402automated tests for the toolingfrom the codebase
The situation
A client’s products were spread over 13 servers at four hosting providers, each set up by hand: nginx here, Caddy there, apps started with pm2 or systemd. Deploying meant SSH and memory.
What I did
- Read before installing. Dokploy’s stock installer would have stopped on busy ports, left the servers’ cluster, and let its proxy grab ports 80 and 443 at boot — taking every site down. Instead I attached each server alongside its existing web server, with the panel’s proxy bound to a local port and guards so it can never take the public ports.
- A fleet CLI. 24 commands for snapshots, before/after diffs, external port probes, attaching servers and moving apps.
- Safe app moves. Each app is deployed side by side, tested against the running copy for every domain, and only then switched over; the old copy stays for seven days and rollback takes seconds. Secrets are compared by hash and never printed.
- Real client IPs. I fixed IP handling through the extra proxy hop so rate limits and logs stay correct.
Result
All 13 servers sit in one panel, and 11 production apps — SaaS backends, Next.js sites and APIs — moved over in two days, with responses checked identical before and after. Along the way I found and logged an expired certificate and a system updater that had been stuck for 165 days.
Stack
- Dokploy
- Docker Swarm
- Traefik
- nginx
- Caddy
- Bash
- bats