Welcome to the Lab: A Tour of Everything I Run
Ten cloud instances, a Proxmox box, a Raspberry Pi and a bag of travel routers, all on one tailnet. Here's the map.
I've been in IT for over twenty-two years. Telecom, then sysadmin work, then cloud-native engineering, and these days I spend my day job deep in Kubernetes escalations. You'd think the last thing I'd want to do after work is run more infrastructure.
And yet.
Somewhere along the way the homelab stopped being a side hobby and became the place where I actually learn. Every certification I've picked up made more sense once I'd broken the thing it was describing on my own hardware. So this series is me finally writing it all down: what runs where, why it's built the way it is, the dumb mistakes, and the configs that ended up working.
This first post is the map. Everything after it is a deep dive into one piece.

The philosophy (such as it is)
Before the inventory, the handful of rules that shape every decision in here. They weren't planned. They're scar tissue.
- Tailscale is the floor. Every node joins one tailnet. Nothing depends on a home IP, a port forward or which Wi-Fi I happen to be on. If it's not on the tailnet, it doesn't exist.
- Bind mounts over named volumes. I want to be able to
lsmy data, back it up with plain tools and move it to another host by copying a folder. - Git is the source of truth. Kubernetes workloads are GitOps via ArgoCD. Dashboards and trackers are rendered from YAML by CI. If it isn't in a repo, I assume I'll lose it.
- Small scripts, not monoliths. Five scripts that each do one thing beat one clever script I'm scared to touch.
- Short hostnames. Every node gets a short, pronounceable name. MagicDNS turns it into a real hostname, so
ssh <name>works from anywhere on the tailnet.
Home
The Proxmox host
One Proxmox host with 8 cores and 62 GB of RAM carries most of the at-home weight:
- The Docker host โ an LXC running 90+ containers. Photos, documents, notes, location history, budgets, recipes. It gets its own post.
- Forgejo + its database โ the git forge everything else hangs off of.
- An Actions runner โ Forgejo Actions, using Podman for job containers.
- Home Assistant โ running as a VM.
- A few AI agents from my OpenClaw fleet, each in its own container.
The Pi that never sleeps
A Raspberry Pi 4 with 8 GB running DietPi. It's the always-on edge node: Vaultwarden, the Ghost instance serving this blog, a backup Forgejo, Navidrome, Syncthing (my Obsidian vault lives here) and MinIO. It also serves a handful of internal dashboards via tailscale serve. If the Proxmox box is down for maintenance, the Pi keeps the lights on.
The network edge
Home internet comes through a GL.iNet Puli AX on a cellular plan. A Firewalla sits alongside it as its own box. The rest of the GL.iNet family โ a Mudi 7, a Slate 7 and a couple of Brumes โ are my travel kit, and every one of them has Tailscale SSH enabled so I can fix them from anywhere.
The cloud
Ten Oracle Cloud instances across four regions, spread over four free-tier accounts to maximize what I can allocate. Two shapes: A1 (Ampere ARM, the beefy ones) and micro (AMD E2.1.Micro, tiny and always on).
| Region | A1 (ARM) | Micros (AMD) |
|---|---|---|
| Ashburn | K3s control plane + public ingress | DERP relay + primary tsidp ยท Technitium DNS |
| Phoenix | K3s worker | NetRelay VPN panel ยท Technitium DNS |
| Chicago | K3s worker | โ (no micro capacity, ever) |
| Frankfurt | K3s worker | Technitium DNS ยท general purpose |
The four A1s form a single K3s cluster that spans three countries' worth of latency. The micros do the small, always-on jobs: a three-node DNS cluster, a DERP relay, an identity provider, a VPN control plane.
What ties it together

- Portainer for Docker workloads across nodes.
- ArgoCD for everything in Kubernetes.
- Beszel agents on nearly every box โ including the GL.iNet routers โ for at-a-glance health.
- tsidp for single sign-on, running on an OCI micro with backups on the Docker host and the Pi.
- Pangolin for the few things I expose publicly, and
tailscale servefor everything that should stay private. - tsrecorder recording every Tailscale SSH session into MinIO.
- OpenClaw, a fleet of twelve specialist AI agents plus HermesDispatch as the brain, that keep an eye on all of the above. It gets two posts of its own.

The roadmap
Here's where the series is headed. Everything linked is live; the rest is coming.
- Tailscale is the floor I build on โ the tailnet, MagicDNS gotchas, DNS, identity, SSH recording.
- One LXC, 90+ containers โ how the Docker host is laid out and why it hasn't fallen over.
- A four-region ARM K3s cluster on Oracle's free tier โ Cilium over Tailscale, Longhorn, ArgoCD.
- Never lose a repo again โ Forgejo, a Podman runner and a mirror manager.
- Twelve specialists and a brain โ the OpenClaw AI agent fleet: who does what, where it runs, which model it thinks with.
- Agents propose, humans decide โ the ORDAR protocol, confirmation gates and the guardrails around the fleet.
- Five overlays, one panel โ NetRelay, my VPN control plane.
- Travel routers that phone home โ the GL.iNet fleet, Tailscale in 45 MB, and drift checks.
- Watching the watchers โ Wazuh, Suricata and the security layer.
- Coming: a low-collision IP addressing plan ยท Garage S3 across nodes ยท secrets with SOPS + age ยท Tailscale exit-node automation with Tasker ยท building MCAdmin for the family Minecraft server ยท the self-hosted Life360 replacement ยท the Ghost theme you're looking at.
If there's one you want sooner, tell me. Otherwise โ see you in Part 1.