You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Production-style runbooks for a multi-site homelab: three Proxmox hosts across
two sites, ZFS storage on TrueNAS SCALE, OPNsense edge routing over XGS-PON
fiber, verified off-site backups, and a containerized service stack.
These are working documents, not tutorials. Each one records what was actually
built, why the approach was chosen, what broke along the way, and how to rebuild
it from nothing.
Netdata’s nut_ups collector was failing against the remote NUT server. Disabled the redundant collector and used Netdata’s working nut collector with the remote UPS endpoint configured directly.
Workaround in place, root cause unresolved. Same-host VM-to-VM TCP flow silently dropped by vmbr0's intra-bridge forwarding for one specific VM pair, despite clean firewall/VLAN/FDB/physical-network state at every layer checked. Fixed by routing the flow through OPNsense instead of the local bridge.
Resolved. Root-cause runbook for a full hypervisor hang on swearengen (i5-10600K/48GB, primary Proxmox host) traced to a wedged USB controller shared between the UPS and other USB peripherals. Fix was moving the UPS off swearengen entirely — see UPS.md.
Declarative availability monitoring — monitors defined in YAML and reconciled into Uptime Kuma by a Python script, so the monitor set is version-controlled rather than click-configured
Migration of greenbean.org from a flat 10.x.x.N/24 to a segmented VLAN network on 10.79.x.x. Covers the CRS310, a new TL-SG108E access switch, OPNsense, both Proxmox hosts, and the EAP610 AP.
Redundant Pi-hole resolvers in separate failure domains, advertised by Kea DHCPv4 option 6 — address-space layout, Teleporter parity, the static-host audit procedure, and the failure modes DHCP resolver lists actually have
Rebuilding the DNS host off an orphaned Hardkernel vendor kernel onto maintained Armbian — why a release upgrade was rejected, U-Boot's fixed-filename boot flow, and the eMMC reflash with a rollback path
First-build procedure for the primary Pi-hole container on bare Armbian — freeing :53 from systemd-resolved, armhf image constraints, compose layout, and the initial Teleporter import
Multi-site overlay network — hub-and-spoke WireGuard through a cloud instance so neither residential endpoint needs inbound reachability, with subnet routing to a second site and full-tunnel roaming clients
30 TB storage migration — mdadm RAID5 → TrueNAS SCALE / ZFS RAIDZ1, with PCIe SATA controller passthrough, pool and dataset design, and dual SMB/NFS shares under a unified identity
Why the TrueNAS reporting page stays blank when NUT runs in netclient mode (NAS-132924) — the charts.d module that assumes a local upsd, a config override that fixes it without touching the immutable rootfs, and an init script to survive OS upgrades
Every doc follows the same shape: a summary block up top, numbered sections, a
"known limitations" or "caveats" section where the honest tradeoffs go, and a
Quick reference table at the end for the things you actually look up at 2am.
Sanitization is enforced by a pre-commit hook rather than by memory:
Rule
Internal addresses masked as 10.x.x.N
Secrets referenced as ${VAR} or <placeholder>, never literals
WAN / ISP / ONT / MAC details never committed
The hook lives at scripts/pre-commit and blocks commits
containing unmasked addresses, hardcoded credentials, private keys, tokens, MAC
addresses, or staged .env files. Install it after cloning — git hooks aren't
carried by a clone: