Cory Policht
← Back to the Devlog
DEVLOG · 2026-06-16 .. 2026-07-03 · BUILD

The homelab rebuilds its plumbing.

Eighteen days of infrastructure work: a k3s migration scaffold with its own pipeline automation, every secret moved out of the forge and into OpenBao, the ADP edge cut over to k3s, and a secret-vault epic closed along the way.

WINDOW
Start2026-06-16
End2026-07-03
Kindbuild
Projectshomelab-infrastructure
Delivered
  • homelab-infrastructure
    k3s migration scaffold — VM IaC, Ansible roles and Helm charts
    The cluster arrives as code: VM provisioning, configuration roles and charts in one scaffold rather than a hand-built box.
    homelab-infra · 8e1892f
  • homelab-infrastructure
    Full k3s pipeline automation — provision, bootstrap, deploy
    The pipeline does the whole lifecycle, so standing up the cluster is a workflow run rather than a session.
    homelab-infra · 7c128e2
  • homelab-infrastructure
    Every secret sourced from OpenBao, none left in the forge
    CI and runtime secrets both move to the vault — Gitea-held secrets removed from CI, and services reading theirs from OpenBao at runtime. Followed by IaC for the Grafana secrets as a k8s-secrets module.
    homelab-infra · 6a3d71chomelab-stacks · 4d7b32chomelab-infra · 30b9787
  • homelab-infrastructure
    The ADP edge is cut over to k3s
    Caddy routes the ADP UI, its API and websocket paths, the MCP server and AIService onto the cluster. The cut-over is accompanied by a non-AVX CPU pin for the document database, because the k3s VMs will not run the default image.
    homelab-stacks · #25homelab-stacks · #24
  • homelab-infrastructure
    Secret vault epic closes, with AIService reading from it
    Epic-Secret-Vault goes code-complete on 06-21 and done on 06-26, with the AIService integration story closing inside it.
    homelab-infra · 7c128e2
  • homelab-infrastructure
    Proxmox power control and a Cloudflare Tunnel ingress
    An IPMI-based power control container for the lightweight hosts, guest agents installed via cloud-init, and a public-ingress stack on a Cloudflare Tunnel.
    homelab-infra · a70db65homelab-infra · 7a2c9a4
  • homelab-infrastructure
    Observability stops lying about its own health
    A run of fixes gets the collector's logs to Grafana, pins the exporter mapping mode to one the search engine actually accepts on this version, and tolerates a yellow cluster state on a single-node install.
    homelab-stacks · #30homelab-stacks · #45homelab-stacks · #42

This is the window where the homelab stops being a set of machines and becomes something with a pipeline.

The k3s migration is the spine. It arrives as code in one scaffold — VM IaC, Ansible roles, Helm charts (8e1892f) — and then gets a pipeline that covers the whole lifecycle: provision, bootstrap, deploy (7c128e2). Standing up the cluster becomes a workflow run. That distinction matters more than the cluster itself; a cluster you can rebuild from a commit is a different asset from one you can only repair.

Secrets move to OpenBao across the same days. CI secrets come out of the forge (6a3d71c) and services start reading theirs from the vault at runtime (4d7b32c), with the Grafana secrets getting their own k8s-secrets module (30b9787). Epic-Secret-Vault goes code-complete on 06-21 and done on 06-26, with the AIService integration story closing inside it. Doing this before the migration rather than after is the reason the migration could be automated at all — anything else would have needed secrets copied by hand into the new cluster.

The ADP edge cuts over to k3s on 07-01 (#25): Caddy routing the UI, its API and websocket paths, the MCP server and AIService onto the cluster. It is accompanied by an unglamorous discovery — the k3s VMs have non-AVX CPUs, so the document database has to be pinned to mongo:4.4 with a TCP socket probe (#24). Hardware assumptions surfacing at deploy time, as they always do.

A run of observability fixes follows, and it is worth being blunt about what they were: the collector’s logs were not reaching Grafana at all (#30), the exporter’s mapping mode was set to a value this search engine version rejects until it is set to none (#44, #45), and readiness flapped on a single-node cluster because it expects quorum health (#42). An observability stack that cannot see its own failures actively misleads.

Two Power Management stories move in-progress → backlog on 06-29 — WoL and idle power. Deferring them is recorded, not hidden.

shared-workflows takes four minor releases across the window (v1.7.0 through v1.10.0) as the library absorbs the runner and pipeline automation it now has to support.

Lessons learned

  • Move secrets out of the forge before the migration, not after. Anything else turns an automated cluster bring-up into a manual secret-copying session, and the automation stops being trustworthy.
  • Pin images to what the hardware actually supports before you discover it in production. The non-AVX CPU was a deploy-time surprise that cost a PR, a probe change and a day.
  • An observability stack that cannot see its own failures is worse than none. A dashboard showing nothing because the collector is quietly broken reads exactly like a healthy quiet system.