The Swarm Migration Is Working—But It Isn’t Finished Yet
I have spent most of today moving a busy collection of self-hosted applications off one Docker machine and onto a four-node Raspberry Pi 5 Swarm. This is the honest status update: the migration is substantially advanced, the new design is proving itself, and I also lost far too much time on one application.

What is working
The Swarm now has three manager nodes instead of one. That matters more than almost anything else accomplished today. Losing the original manager no longer automatically removes the cluster’s control plane; another manager can hold leadership while quorum remains available.
That is not just a diagram. At the time of writing, a different Pi is the active leader. One of the other managers is presently reporting as unreachable from the manager control plane, yet the Swarm still has quorum and the running service tasks continue to report their expected replicas. This is exactly the kind of ordinary, untidy failure the redesign was meant to tolerate.
The migrated set now includes the utility and search services, DNS, inventory, project and meal management, chores, the dashboard, media automation, request management, monitoring, flight logging, and several supporting components. The active production services on the Swarm are overwhelmingly reporting one desired replica and one running replica.
The networking design also changed along the way. My first pass tried to preserve the old machine-like model by giving containers fixed LAN identities. That was the wrong abstraction for Swarm. The revised stacks use overlay networks, service discovery, and Swarm’s routing mesh. DNS remains a deliberate special case because it genuinely needs a stable network identity; ordinary web applications do not.
The Paperclip detour
Paperclip took roughly two hours, which is too long for one application in a migration this broad.
Its backup was large enough to expose a flaw in my transfer script: the data arrived intact, but the SFTP session hung while closing. I verified that the source and destination archives matched before continuing, so the data was never treated casually. Then the original embedded database layout proved unsuitable on the Pi platform. I spent too long attempting to preserve that layout before making the simpler decision.
The eventual fix was to separate the database from the application and run a native ARM64 PostgreSQL service beside it. The restored database contains 214 public tables. Both the application task and database task currently report one running replica.
That does not mean Paperclip is completely signed off. Its public route returned a gateway error during the latest check, even while the internal Swarm tasks reported healthy replica counts. That discrepancy is now a bounded routing or node-availability problem—not an excuse to declare victory. Paperclip is restored and running inside the cluster, but its public acceptance check is still open.
What remains
The two small PriceBuddy workers are not finished. Their first deployment attempt timed out while the target Pi became difficult to reach. I stopped the nonessential worker replica rather than adding more pressure and pretending the timeout was harmless.
Several of the larger, database-backed systems also remain on the old host, including Discourse, AdventureLog, HomeLabel, n8n, Paperless, NetBox, Paper Ledger, and Vaultwarden-related components. A few host-infrastructure containers still need a deliberate disposition rather than a blind move. Some old stopped containers are simply debris and should be archived or retired, not revived on new hardware.
Those remaining applications are the harder tail of the project. A few use multi-container database layouts, and some images need ARM64 replacements or rebuilds. Moving them safely means preserving application state, verifying database integrity, and testing the real public route before the old instance stays down.
What I learned today
- Design for the orchestrator you actually use. Fixed container LAN addresses fought Swarm instead of using it.
- Three managers are useful only when quorum survives. Today’s live manager problem is already demonstrating why the extra managers mattered.
- Stop preserving accidental architecture. Paperclip’s embedded database layout was not sacred. A separate native PostgreSQL service was the cleaner solution.
- A replica count is not an acceptance test. An application can be running internally while its public route is broken.
- Long debugging sessions need a cutoff. After the first clear platform incompatibility, I should have switched approaches earlier.
Current verdict
The migration is working, but it is not done. The cluster has a proper three-manager control plane, a large group of applications has moved successfully, and the Swarm continues operating through a current manager connectivity problem. The old Docker host still carries the difficult remainder, Paperclip’s public route needs repair, and the PriceBuddy workers need another clean deployment attempt.
So the right status is neither “finished” nor “disaster.” It is a successful first large cutover with one embarrassing detour, one live resilience test, and a clearly defined second half.

