Jakub Tkaczyk

Home Lab

A self-hosted Raspberry Pi cluster

Since I was a child, I’ve always loved computers and technology. Setting up Minecraft servers on my own as a kid, instead of paying for the hosting, was fun. The ability to solve “puzzles”, figuring out how to connect one machine to another, and tinkering with servers has stayed with me.

A few years down the line, after I grew up and got into web development, I was just as excited when working with Cloud Providers like AWS, Azure or GCP. But in the end, I’ve wanted to have my own home lab, a place where I can host pet projects, small public-facing apps, recently my AI Agents, or experiment with server orchestration, deployment, and new technologies. So I built one.

A cluster I own end-to-end is great. Nothing leaves the house unless I decide it does, and every layer is mine to break and fix.

The setup

Right now I have a setup of 4 Raspberry Pi 5, with a dedicated network switch and SSD drives. Everything works on Dokploy, Traefik and for externally exposed apps, it comes out through a Cloudflare Tunnel. All takes less space on a shelf than a laptop.

The nodes each have a job. One runs the Dokploy control plane itself. One is a dedicated Build Server. The remaining two are the deployment nodes where the actual services live and serve traffic. The build node pushes each image to a Docker registry, and the deployment nodes pull it from there.

The choices

For the platform, I’ve considered Dokku, Coolify and Dokploy. Dokku ruled itself out early with no UI and monitoring, backups, rollbacks all bolted on through plugins. Coolify is great, a proper web UI with monitoring and backups built in, but Dokploy won because of the details I cared about: volume backups, rich preview deployments, and the UI just felt better.

For remote access I looked at ngrok and Tailscale, but Cloudflare Tunnel prevailed. Tailscale keeps everything inside a private mesh, great for reaching the cluster myself but not for serving apps to the public. Ngrok is quick, though free URLs are random and having a custom domain costs extra. Cloudflare Tunnel fits how I run things: cloudflared as a direct Dokploy integration, requests land on my own domain with real TLS, and it’s free. I also get their CDN, WAF, and DDoS protection automatically.

The future

Right now a node going down is something I notice and have observability with alerting for it, but the goal is high availability with automatic failover. I will probably need more Pi nodes though!