QRH
Homelab
Quick Reference Handbook
Read it before you need it. Follow it when you do.
The homelab's standard operating procedures: what gets done by hand, on a trigger, and is too easy to get wrong from memory. It is published on GitHub Pages, so it stays up when the homelab doesn't. Each card is a checklist: tick the steps as you go, and the page remembers them for a day.
Memory items
- The homelab is down and you are reading this: GitHub is up. Start at the Emergency tab.
- Roboform holds what no machine does: the ansible-vault passphrase, the OpenBao Shamir recovery keys (3 of 5) and the age key that decrypts the backups.
- Every runbook's source is public:
git clone https://github.com/pvginkel/Ansible. - Keep the offline copy (bottom of every page) on a laptop, for the day GitHub is down too.
Emergency
- E1Estate down, or a power cutAnsibleAll three PVE hosts restarted together, or everything is unreachable at once. The first sign is often healthchecks.io on Telegram: Prometheus's heartbeat stopped.
- E2No DHCP or DNS in the houseAnsibleTelegram shows DHCPNotAnswering or LoadBalancerNotAnnounced for dnsmasq-prd; devices can't get a lease; .home names don't resolve; or healthchecks.io says Prometheus's heartbeat stopped.
- E3Front-door nginx downAnsibleEvery .home, webathome.org and ginbov.nl host is unreachable at once while the cluster is up; or LoadBalancerNotAnnounced names nginx-prd/nginx.
- E4KubeCoder lost cluster accessKubeCoderEvery environment's kubectl is refused at once, on both contexts, and so is the controller's: after a cluster rebuild, or after the kubecoder ServiceAccounts or their token Secrets in kube-system were deleted.
- E5Kyverno refuses new podsAnsibleNew pods on prd are not created: rollouts stall, Jobs start nothing, and the FailedCreate events name the webhook mpol.validate.kyverno.svc-fail.
- E6OpenBao is down, or a secret is needed without itAnsibleAn srvvault node or the whole OpenBao cluster is lost, or a secret has to be read while there is no cluster to read it from.
Abnormal
- A1A disk is failingAnsibleA disk throws errors or dies: a Ceph OSD SSD, the NVMe behind zpool2, a PVE host's own NVMe, or the local-backup HDD.
- A2A Telegram alert firedAnsibleAn Alertmanager alert, a red or unstable scheduled IaC job, or a healthchecks.io message reaches Telegram.
- A3Jenkins builds stuck "All nodes of label … are offline"AnsibleBuilds queue one at a time with "All nodes of label '
_ -xxxx' are offline", although the Kubernetes cloud should run several agents at once. - A4Terraform state lock stuckAnsibleA Terraform run fails with "Error acquiring the state lock" and nothing is running that could hold it.
- A5YouTrack Hub calls fail with "Item of type AuthorityHolder … is not found"AnsibleEvery Hub API call on issues.webathome.org fails with that error while YouTrack's own
/api/*keeps working.
Normal
- N1After a hardware changeAnsibleA disk, RAM module, NIC or whole host was added, replaced or removed on pve, pve1 or pve2, or the network edge changed.
- N2Bringing srvk8sdev upAnsibleBefore starting srvk8sdev (VM 919 on pve), and before turning it off again.
- N3New Windows machineAnsibleA new Windows machine or VM the operator will use against homelab URLs.
- N4Promote KubeCoder to prd, or roll it backKubeCoderA change validated on dev goes to prd, or a prd regression has to be reverted.
- N5Shutting down a PVE hostAnsibleBefore powering off pve, pve1 or pve2.
- N6Terraform change that needs a node rebootAnsibleA terraform/prd change to a cluster member's memory, CPU, NICs, disks, BIOS or machine type: anything PVE applies only at the next power cycle.
Periodic
- P1Annual rotation of the bootstrap-tier secretsAnsibleOnce a year, when SecretRotator announces a bootstrap marker: Telegram warns 28, 21 and 14 days before it falls due and every night from 13 days, and
secret-rotator uilists its box. At once on suspicion that a workstation or Roboform is compromised. - P2Bump the microk8s channelAnsibleA new microk8s minor on the stable channel. One minor per round: the playbook refuses a bigger step, so two minors behind is two rounds of this card, with a soak between.
- P3Install a pushed plugin versionAIWorkflowAfter pushing a version bump of the dev plugin (AIWorkflow) or the kubecoder plugin (KubeCoderConfig) by hand, or when the nightly card pass's notification names a release it pushed. The pass never installs one itself: installing is the operator's call.
- P4Re-capture the claude stand-in's goldensKubeCoderAfter a Claude Code release: once the Claude Code binary in KubeCoder's local-home image has moved past the one the goldens record.
- P5Re-run prompt-audit on the dev pluginAIWorkflowAfter a model change: the model behind any dev-plugin role changes. Run it before reading the first slices run on the new model.
- P6Restore drills, yearlyAnsibleOnce a year, and after a change to a backup path. A round restores every backup somewhere harmless and proves the result is usable.
- P7Upgrade Argo CDAnsibleA new argo-cd Helm chart (argoproj/argo-helm) or Argo CD release. On 2026-10-06: chart 10.3.3, Argo CD v3.5.1 on argocd-prd.
Ansible runbooks
Mirrored from pvginkel/Ansible docs/runbooks as of 80f07c4 (2026-10-17).
- Adopting a host into Ansible management
- An external key fell due
- Argo CD operator runbook
- Backup freshness runbook
- Ceph VIP runbook
- Claude home restore runbook
- Estate cold boot
- Growing a managed VM's disk
- IaC agent cold-boot runbook
- IaC agent VM (srviac)
- Kyverno: memory requests at pod creation
- Moving a managed VM to a static address
- Moving an app into a deploy monorepo
- Notifications runbook
- OpenBao hygiene cutover (slice 044)
- OpenBao operator runbook
- Operator workstation setup
- Proxmox credentials for Terraform
- Rebuilding a Terraform-managed VM
- Rebuilding k8s VMs (drain → destroy → TF → Ansible)
- Rolling a microk8s cluster upgrade
- Runbook: expired internal_tls leaf certificate
- Runbook: expired SSH host certificate (host is UNREACHABLE to Ansible)
- Runbook: microk8s watch-cache freeze (k8s-dqlite watch stall)
- S3 mirror restore runbook
- Scratch VM lifecycle
- SecretRotator go-live (slice 045)
- SSH host CA rotation runbook
- step-ca bootstrap and lifecycle runbook
- step-ca root rotation runbook
- Workloads on a rebuilt cluster
- YouTrack restore runbook