Page:
Home
Pages
01 Image Mode and the itg base Golden Image
02 Storage on bootc NFS and Data Disks
03 Hostnames and DNS Registration on bootc
04 Container Registry on Forgejo
05 Forgejo Actions Runner as a bootc Image
06 The CI CD Pipeline
07 Nightly Auto Deploy with bootc
08 First Real Workload itg prd book
09 VSCode as the GitOps Cockpit
10 Hugo Website Auto Deploy
11 Cloudflare Migration Book Restore Kobo and MAM
12 Runner Creation and Ansible Provisioning
13 Tailscale Subnet Router on bootc
14 SWAG and the Website
15 Split DNS and LAN Only Services
16 Plex Media Server
17 Media Library Support
18 The Day After
19 Self Hosted Media
20 The Hypervisor Joins the Fleet
21 The Matrix Homeserver
DR Site and Backup Plan
Home
Homelab Sizing
Infra Principles
Post Migration Checklist
Someday
No results
4
Home
Eric Hendricks edited this page 2026-08-19 01:13:55 +00:00
Table of Contents
ITG Homelab Runbooks
How a single-node Fedora bootc homelab in a COLO became a full GitOps pipeline: I edit a file in VSCode, commit, and Forgejo Actions runners build and roll out new bootc images on a schedule. Written as notes-to-self that double as blog drafts.
Started as the bootc build. It now covers the whole estate, so it lives in the infra wiki rather than a repo-specific one.
The cast
- itg — the Proxmox host,
10.10.10.2, also my NFS server. - OPNsense (itg-net-opn) — DNS (Unbound), DHCP, and firewall for
10.10.10.0/24; public egress66.85.74.134. - itg-prd-web — SWAG reverse proxy at
10.10.10.83, fronts everything on 443. Patches at 02:30. - forge.itguyeric.com — Forgejo at
itg-prd-forge(10.10.10.24): git, container registry, and Actions. The fleet SPOF; patches in a slot of its own at 02:00, ahead of everyone else. - itg-prd-run01 / itg-prd-run02 — Forgejo Actions runners, themselves bootc images.
- itg-dev-bootc — the dev box, takes nightly updates with the herd.
- itg-prd-book — the book and media-reader host, VM 206,
10.10.10.226: Transmission, LazyLibrarian, Calibre-Web-Automated, AudioBookShelf, and Komga. - itg-prd-plex — Plex Media Server, native RPM with an RTX 2070 passed through from Proxmox.
- itg-prd-arr — the arr stack on bootc (Radarr, Sonarr, SABnzbd, Bazarr, Prowlarr, Recyclarr, Mylar3, Pinchflat, MeTube), vmid 202; the last legacy pet retired.
- itg-prd-game — the game-server box (Foundry, ddb-proxy, Valheim, Palworld, Starbound, ARK).
- itg-prd-tail — the Tailscale subnet router.
- Coulson —
10.10.10.162, old build box and the retired HTTP registry, now the persistent bastion tmux host. - itg-base — the golden base image everything else is built
FROM. - ansible@pve — the scoped Proxmox API service account that provisions VMs.
The build, in order
- Image Mode and the itg-base Golden Image — image mode explained, and what goes in the base.
- Storage on bootc: NFS and Data Disks — the
/mntsymlink trap, systemd mount units, first-boot data disks,nosharecache. - Hostnames and DNS Registration on bootc — why static hostname beats a kernel arg, and stopping NetworkManager from clobbering it.
- Container Registry on Forgejo — moving off the HTTP registry to the HTTPS Forgejo one, auth stores, and the bootc pull secret.
- Forgejo Actions Runner as a bootc Image — the runner as an image, and the registration that actually works on modern Forgejo.
- The CI/CD Pipeline — base build, children fan-out, lint gating, push.
- Nightly Auto-Deploy with bootc — the built-in updater and the real cadence (build 1, forge 2, web 2:30, fleet 3), plus the bug that hid inside it: hosts pulled at 3 while the build did not start until 4, so the fleet sat a day behind with every timer green.
- First Real Workload: itg-prd-book — Quadlets, data disk vs NFS, SELinux labels, and the Proxmox VM.
- VSCode as the GitOps Cockpit — settings, extensions, and commit-triggered push.
- Hugo Website Auto-Deploy — building the Hugo site in a throwaway runner container and rsyncing it to SWAG, plus the four mount/SELinux/uid gotchas that cost me a night.
- Cloudflare Migration, Book Restore, Kobo and MAM — the day I migrated DNS to Cloudflare, restored the book data, and wired up Kobo and MAM.
- Runner Creation and Ansible Provisioning — provisioning a runner from nothing: a scoped Proxmox token builds the VM, Forgejo's offline-registration CLI mints the runner, no clicks anywhere. Also the GPU resource-mapping lessons.
- Tailscale Subnet Router on bootc — advertising
10.10.10.0/24into the tailnet, with subnet-route SNAT on by default. - SWAG and the Website — the web/SWAG migration to bootc, and the pipeline overhaul into one
pipeline.yml. - Split-DNS and LAN-Only Services — split-DNS so LAN-only services resolve to SWAG internally; the nginx allowlist, and the Unbound redirect-zone trap a wildcard override springs.
- Plex Media Server — native Plex on bootc with NVIDIA GPU passthrough, the
%presystemd trap, and the/mediacanonical-path trap. - Media Library Support — the arr box, the last legacy VM: local disks for appdata and the SAB scratch, media stays on NFS.
- The Day After — post-migration papercuts. Reboot resilience, then the four that were wrong from day one and stayed green for months.
- Self-Hosted Media — the full ebook/audiobook/comics stack, plus MAM as the books workhorse.
- The Hypervisor Joins the Fleet - bringing itg into the inventory without pretending it is an image: Proxmox ships without sudo, Debian's admin group is
sudoand wants a password, the subscription nag and the assert that keeps the patch honest, and the two Ansible warnings I had been reading past for months (a pty from-ttturning the module's trailing newline into junk, and why pinning the interpreter globally breaks provisioning). - The Matrix Homeserver - a worker-mode Synapse built the bootc way: nine containers, the
:zvs:ZSELinux trap that cost the most, postgres collation you can only set at initdb, an nginx router that caches dead upstreams until you give it a resolver, federation delegation plus the split-DNS override so LAN clients stop hairpinning, and the five gates a Forgejo build crosses before it lands in a Matrix room. Bridges to be appended.
Reference
- Infra Principles — the rules everything above is supposed to follow.
- Post-Migration Checklist
- DR Site and Backup Plan
The through-line
Three facts about bootc shape everything: /usr is immutable and comes from the image, /etc is a 3-way merge that preserves your local edits, and /var is machine-local and never touched by the image. Almost every design decision in these posts falls out of those three rules.
Runbooks
The build
- Image Mode & Base
- Storage
- Hostnames & DNS
- Registry
- Actions Runner
- The Pipeline
- Nightly Auto-Deploy
- First Workload
- VSCode Cockpit
- Hugo Auto-Deploy
- Cloudflare & Kobo
- Runner Provisioning
- Tailscale Router
- SWAG & Website
- Split-DNS
- Plex
- Media Library Support
- The Day After
- Self-Hosted Media
- Hypervisor Joins the Fleet
- The Matrix Homeserver
Reference