The problem
I wanted to run my own services rather than rent them, and I wanted the reasons documented, because most self-hosting writeups stop at the point where it works once on one machine.
The hard part was never the first container. It was everything after: routing, certificates, failover, and what happens when one host goes down at three in the morning.
Constraints
- One person operates this. Anything that needs a team to run does not get run.
- It comes out of my own paycheck, so cost is a live design constraint.
- It is publicly reachable, which makes it a real target rather than a lab exercise.
What I built
A self-hosted stack behind Traefik with Cloudflare in front, plus the supporting tools that came out of operating it:
- cloudflare-load-balancer — load balancing at the edge.
- nginx-traefik-converter — translating existing nginx configuration into Traefik, which is the tedious half of any migration.
- warp-docker and openvpn-nat-routing — network routing for containers.
- logrotate-traefik — log rotation, written after logs filled a disk.
Every one of those started as a problem in front of me rather than a project idea.
Outcome
The stack is running now, and the live status page reports on it directly. Every number on it came from a live check. When the monitoring cannot reach a source, the tile disappears instead of showing the last thing it saw.
The written version of what this taught me is in Where single-node infrastructure breaks down.
There is no service count on this page on purpose. The lab page counts what it can reach, right now, and a number typed here would go stale and then contradict it.