Homelab
Kubernetes infrastructure for personal data governance with a walled-garden for AI agents
When you think about it, a hobby is just a second job that costs money...
01 Overview
The homelab serves three purposes: keeping personal data under my own control while reducing reliance on cloud subscriptions, running the same kinds of tools I use professionally, and providing a place to experiment.
It consists of a Kubernetes cluster, two NAS units, several single-purpose hosts, and a GPU-equipped mini PC for local inference. The network is managed with UniFi and split into VLANs with zone-based firewall rules; connections between zones are denied by default and permitted only where a specific need exists. No services are exposed outside the home network.
The addresses and identifiers shown on this page are simplified and do not reflect the exact configuration nor is it exhaustive; but the overall data connections and flow is still accurate.
02 Hardware
Most compute and storage connects to the main network over a 6 GHz wireless bridge. The link is stable with only a few milliseconds of added latency.
| Host | Hardware | Accelerator | OS | VLAN | Role |
|---|---|---|---|---|---|
| turingpi-1…4 | Turing Pi 2.5, 4× Turing RK1 | RK3588 NPU | Ubuntu | 100 / 200 | k3s cluster |
| primeradiant | Synology DS423+ | DSM | 100 | Primary storage | |
| deepthought | ZimaCube 2 Pro | RTX Pro 2000 Blackwell | Unraid | 100 / 200 | Compute and storage |
| titan | GMKtec K11, Ryzen 9 8945HS | RTX 5070 Ti via OCuLink | Ubuntu | 200 | Inference host |
| homeassistant | Raspberry Pi 5 | HAOS | 100 | Home automation, Zigbee | |
| agent-sandbox | VM on deepthought | Ubuntu | 200 | Agent sandbox | |
| agent-devbox | VM on MacBook | Ubuntu | 200 | Agent sandbox |
03 Services
Services are reached through NGINX Proxy Manager, which terminates TLS using certificates issued through DNS challenge verification, so internal services use certificates from a trusted CA. Local DNS rewrites in AdGuard Home point service hostnames at the proxy.
There are two proxy instances. One on VLAN 100 handles the general services. A second instance on VLAN 200, a separate network for AI agents described below, proxies only the agentic services, including the llama.cpp servers, so agent-facing endpoints are served from within the agentic subnet.
Forgejo is the exception. It takes part in bootstrapping and deploying the rest of the infrastructure, so it should not depend on the proxy. Its hostname resolves directly to the Forgejo host, with routing configured in UniFi to support git over HTTPS.
04 Agentic VLAN
AI agents read untrusted content such as web pages, issues, and dependency code, and they act on it by running commands, cloning repositories, and triggering builds. Prompt injection, a faulty reasoning loop, or an ordinary mistake could lead an agent to probe parts of the network it has no reason to reach. For that reason, all agent traffic is confined to a dedicated VLAN.
Both agent sandboxes and both llama.cpp inference servers have an interface bound to VLAN 200 with an address on the agentic subnet, so model requests from the agents never leave that network. By default, hosts on VLAN 200 cannot initiate connections to the rest of the LAN. The one intentional exception is a route to the Forgejo git host, which lets agents work on repositories for their own development and assist with development work and pull request reviews.
Oh-My-Pi · interactive
Runs in an Ubuntu VM on my MacBook and is directed through a terminal interface. A single shared directory is the only link to the host filesystem. The VM has its own Docker daemon and toolchains, so builds and tests do not touch the host, and it can be rebuilt at any time.
Hermes · automation
Runs in a persistent VM on deepthought and handles automation without a human in the loop, responding to messages and local webhooks. Because nobody reviews its actions in real time, containment comes from the environment: the VM holds nothing of value and its network reach is limited to explicitly granted services.
Separate identities
Agents authenticate to Forgejo with dedicated accounts and organizations, and only see repositories they have been added to. Keys held by each agent are scoped to that agent and can be revoked without affecting my own credentials.
Separate CI
Agents trigger builds on their own Jenkins instance. Build pods are created on demand in an isolated namespace on a cluster node assigned to VLAN 200, so nothing persists between jobs or mixes with my own workloads.