This is the first post in a series on building out my homelab — a place to run the same platform infrastructure I work on professionally (Kubernetes, GitOps, observability) without a cloud bill attached to every experiment. Part 1 is the foundation: the physical hardware and how it’s wired together.

How it started — and why it grew

I’d been running a homelab on a couple of Raspberry Pis for a while. They were the perfect place to poke at things — small, cheap, low-power, and forgiving when I broke them.

Then AI agents took off, and I wanted to experiment with running models locally with Ollama. That’s where the Pis hit a wall: great for tinkering, not so great for anything compute- or memory-hungry. I wanted a real, multi-node environment I could run a proper Kubernetes cluster on — and host local LLMs without paying per token.

So I went shopping. The whole rule was cheap: everything here came off the secondhand marketplace, which is exactly why mini-PCs and a few small boxes beat a loud, power-hungry rack server.

The hardware

Four small machines, a switch, and a NAS — nothing rack-mounted.

Compute: 2× Dell OptiPlex 3070 Micro

The two workhorses, which I named plex1 and plex2. They’re identical, so here’s the spec for one node (both are the same):

Component Spec (per node)
CPU Intel Core i5-8500T — 6 cores / 6 threads, 35 W
RAM 24 GB DDR4
Boot disk ~256 GB NVMe
Data disk 2 TB SATA SSD
Hypervisor Proxmox VE 9.2.3

The 3070 Micro hits the homelab sweet spot: a 35 W “T” CPU sips power and runs silent, but six cores and 24 GB of RAM are plenty to host a multi-node cluster — and finally enough headroom to run Ollama. The 2 TB SSD in each node holds the VM disks (local-ssd); the smaller NVMe handles boot and Proxmox itself.

Two nodes instead of one bigger box was deliberate: it lets me split the Kubernetes control plane across physical hosts and actually learn multi-node clustering — the whole point of the exercise.

2× Raspberry Pi 5 — where it all started

The Pis are still around. They were the original homelab and my first set of experiments, and they’ve earned a permanent spot. These days they handle the lighter, always-on bits while the OptiPlex nodes do the heavy lifting.

Storage: Buffalo TeraStation 5200 NVR

Bulk storage and backups live on a secondhand Buffalo TeraStation 5200 NVR — a 2-bay business NAS, loaded with 2× 4 TB drives. It has dual Gigabit ports, so the box itself isn’t the bottleneck; in practice it runs well behind the node-local SSDs, which is exactly why it stays in the “cold storage / backups” tier and each compute node keeps its own local 2 TB SSD for anything live or performance-sensitive.

Everything sits on a single flat LAN:

                Internet
                   │
          ┌────────┴─────────┐
          │   home router     │  gateway, DHCP
          └────────┬─────────┘
                   │
          ┌────────┴─────────┐
          │  TP-Link switch   │  unmanaged, 5 V powered
          └────────┬─────────┘
         ┌─────┬────┴───┬──────┬───────┐
       plex1  plex2   Buffalo  rpi5    rpi5
                       NAS

The switch is a plain, unmanaged 5 V-powered TP-Link unit — the same low-power class of gear as the Pis themselves. No VLANs, no management, nothing fancy: the OptiPlex Micros each have a single onboard 1 GbE NIC, and the switch just ties the nodes, NAS, and Pis together off the home router. (Segmenting this into VLANs is on the list for a later post.)

Power & physical setup

It’s all low-power by design — those 35 W CPUs idle quietly. No UPS yet; that’s the next purchase, because the one thing this setup can’t currently survive gracefully is a power blip.

What’s actually running on it

To make the hardware concrete — here’s the current Kubernetes cluster, running as Proxmox VMs spread across the two nodes:

VM Role Host vCPU RAM
cp1 control plane plex1 4 4 GB
cp2 control plane plex2 4 4 GB
worker1 worker plex1 6 16 GB
worker2 worker plex2 6 12 GB
worker3 worker plex2 6 6 GB

Two control-plane nodes and three workers, with the control plane split across physical hosts so a single node reboot doesn’t take the cluster down. On top of this runs my GitOps/observability stack and the local-AI experiments that started this whole upgrade — the subject of later parts.

Decisions and trade-offs

  • Secondhand mini-PCs over a rack server — quiet, low-power, fits anywhere, and cheap. The cost is no IPMI/iLO and limited expansion, which I can live with.
  • Two nodes over one — redundancy and a real multi-node cluster to learn on, rather than one big single point of failure.
  • Node-local SSD + a NAS for cold storage — fast, node-local storage for anything live; the Buffalo NAS strictly for backups and bulk.

What’s next

With the metal racked (well, shelved) and on the network, Part 2 covers the virtualization layer: installing Proxmox, the plex1/plex2 setup, and how the Kubernetes VMs are laid out across them.

It’s all learning — and the whole world’s our stage, folks.