Why I run it
Most of what I'm confident about at work, I broke at home first. The homelab is where I try things without a change window: new services, new ways to deploy them, and new ways to lock them down.
What runs on it
More than 30 open-source services, grouped roughly like this:
- Private cloud storage.
- Media streaming, with hardware transcoding on an NVIDIA GPU.
- Smart-home automation.
- Discord bots and small utilities.
- The platform pieces that keep the rest running: identity, monitoring and the tunnel connector.
Every service lives in Git
I moved past Unraid's built-in app templates early. Each service is a Docker Compose stack in a private GitHub repository, and Dockhand syncs those stacks to the server. A change is a commit, so I have history and can roll back, and if the server died I could rebuild the whole platform from the repo and the data.
No open ports
Nothing is published by forwarding ports on the router. The services I reach from outside go through a Cloudflare Tunnel, which the server opens outward to Cloudflare. Cloudflare then handles DNS, DDoS protection and the web application firewall in front of everything.
Passkeys, every time
Cloudflare Access sits in front of each published service, and its policy requires a passkey on every login from the internet. The identity provider is Pocket ID, which I host myself and which only supports passkeys, so there are no passwords to phish or reuse. Most internal services use Pocket ID for single sign-on as well, so one identity covers the whole lab.
Watching it
Grafana collects metrics from the server and services, and alert rules post to a Discord channel, so I hear about a full disk or a stopped container before I notice it myself.
The network around it
The home network is deliberately simple: a UniFi Cloud Gateway Ultra for routing and firewalling, and NextDNS as the DNS provider. The complexity lives on the server, where it's version-controlled.