The lab

The machines and the repository behind the posts. Nothing reaches these machines unless it went through a pull request first.

Five Proxmox nodes and a NAS

It used to be one box called yoda, with a few dozen containers managed by hand. Now Terraform describes the cluster, Ansible configures the hosts, and every application is a Compose file.

  • obifive

    Plex, apps, WordPress

    The node with the iGPU

  • obifour

    Home Assistant, state backend

    DNS, tunnel, CI runner

  • obithree

    Monitoring, CI runner

    The old Home Assistant box

  • obitwo

    My lab server

    Staging, game servers. Only on when I need it.

  • obisix

    CI runner, DNS

    yoda, wiped and rejoined

  • NAS

    Storage, backups

    Not a Proxmox node

How a change gets in

Plan on pull request, apply on merge. The Terraform plan is the real gate: I read it before I merge.

  1. Pull request
  2. Read-only checksTerraform plan as a comment, linting, rendered stacks, secret scanning
  3. I merge
  4. Fans out by pathterraform/** · ansible/** · apps/compose/**
  5. Proxmox cluster

Every nightDrift checksA GitHub issue opens on drift, closes when clean

What it runs on

Cluster
Proxmox, described in Terraform
Hosts
Configured by Ansible
Apps
One Compose file per stack
Updates
Renovate, every image pinned to an exact version
Way in
Cloudflare Tunnel, no open ports
Help
Claude Code proposes, I read and merge

Written up from the lab

  1. How Race to Dutch First is built and run
  2. My homelab runs through pull requests
  3. Charging an EV under the Belgian capacity tariff
  4. Quieter fans on a Dell R710 with local IPMI
  5. How this blog is built and shipped