Five machines, one fleet
I design, build, and run a small self-hosted infrastructure: five machines, each with a defined role, meshed together and reachable from anywhere. This is the map of it: how the pieces connect, how it stays up when one of them doesn't, and what actually runs on it.
Solid line: the Tailscale mesh, every node reaches every other node directly. Dashed amber arc: the failover path, control plane and ingress duties can move to a standby if one node goes down. Dashed line on the right: the public ingress node's outbound Cloudflare Tunnel, the only path in from the internet.
- Control plane (Raspberry Pi): coordinates jobs across the fleet.
- Public ingress (Raspberry Pi): the one door in from the internet.
- GPU compute (a dedicated GPU box): runs the machine learning pipeline.
- Deploy host (a Mac mini): runs the apps I've shipped.
- NAS storage (network-attached storage): holds the data everything else reads and writes.
All five machines sit on the same private Tailscale mesh, so any one of them can reach any other directly without exposing anything to the open internet. The only door in from the outside is a Cloudflare Tunnel running on the ingress node. It makes a handful of self-hosted services reachable from anywhere without opening a single port on my home network.
Control plane and public ingress both run on interchangeable hardware on purpose, so either role can move to a standby if a machine goes down. That design got tested for real: when my control plane machine died mid-job, I moved its duties over and kept the fleet running instead of losing a night to it. The full account, including what broke along the way, is in the control plane outage post.
This fleet is the ground under everything else I've built. The orchestration relay hands work to whichever machine should run it and collects the result later, so I stopped babysitting jobs at a keyboard: more on how that works. A fleet dashboard and knowledge base keeps track of node health, running jobs, and my own project notes in one place. And the GPU box carries Loupe's machine learning pipeline, entirely on my own hardware: the writeup on that.