← Back to Blog

My Home Lab So Far

May 2026

What I run at home — an old laptop, a cheap cloud VM, and a bunch of Docker containers.


I've been running a home lab for a while now, and it's reached a point where I'm happy with the architecture. This post is a walkthrough of what I have set up, why I made the choices I did, and how it all fits together.

The Hardware

There are two machines:

The laptop stays at home behind a NAT. The droplet gives me a public-facing entry point without having to open any ports on my home network.

Networking

Two things make the networking work:

  1. Tailscale — both machines are on the same Tailnet. The droplet is set up as an exit node. Prometheus on the droplet scrapes Node Exporter metrics from the laptop over Tailscale (it shows up as fedora:9100 in the config). The GitHub Actions runner also uses Tailscale to SSH into the laptop for deployments.

  2. Cloudflare Tunnel — instead of exposing the laptop directly, a Cloudflare tunnel on the droplet forwards incoming traffic on my domain (ryanngjk.dev) to the Nginx reverse proxy running on the laptop. No open ports, no dynamic DNS, no port forwarding.

The Services

Everything on the laptop runs in Docker Compose with a shared network. Here's what's containerized:

The online education subdomains I use are a separate project that also runs on the laptop — the Nginx config proxies to their Next.js containers with WebSocket support for hot module replacement.

Monitoring

The droplet handles observability:

All of this is provisioned by an Ansible playbook that installs Tailscale, Prometheus, Node Exporter, and Grafana on the droplet from a fresh Ubuntu image.

Infrastructure as Code

What I'd Change

The setup works, but there are a few things I want to improve:

Overall though, I'm happy with where things are. An old laptop and a $6/month droplet is enough to run a surprisingly useful set of services.