gates / gates (push) Successful in 12m24s
R-232 dated note + a dated check for tonight's sweep; R-934 closed (the disk was pulled 2026-10-23); R-1250 fixed on main, live proof on demo-hp with a real seed; 08 §9 item 5. Evidence audits/dooplex-alarms-2026-10-24/.
Two DooPlex backup alarms, and every alarm the mail route delivers — 2026-10-24 (attended)
Brief: „two DooPlex backup alarms — find why, fix, and check every other alarm the new mail route now delivers".
Read first: runbooks/total-loss-of-dooplex.md, runbooks/RUNBOOK-hub-db-offsite-backup.md,
audits/dooplex-survival-2026-10-22/PLAN.md, R-232, the two rules in homelab mon-system/prometheus-rules.yaml, the
Alertmanager route, homelab HM-040…HM-049 and the 2026-10-23 window record.
| File | What it shows |
|---|---|
part1-2-diagnosis.txt |
The off-site job's FAILED: newest complete dump … 12 h old; the dump jobs (3 failed), the failed dump folders (only an empty globals.sql); the database log's 28P01 (48 failed logins in 24 h, all from the backup pods, first 2026-10-23 16:00:01Z); which secret the role accepts (ok/refused only); the ruled-out causes (tunnel, block list, disk, overlap) |
part1-2-fix.txt |
After homelab 531023d: the by-hand dump (13 files, pg_restore --list 1114 / 1660 / 753 entries), the CronJob's success time, the by-hand off-site push, the restore test (26 456 files, 12 repos git fsck), the snapshot on ep0, the clear times |
part3-alarms.txt, alerts-7d.json |
No alarm firing at 10:51Z; 7 days of ALERTS (Prometheus' whole window); the mail counter (60 sent, 0 failed); the silences; the routing read back from the running Alertmanager |
*.before |
The three homelab files as they were before this session's edits |
part4-*.txt |
R-1250's live proof (below) |
Why the two alarms fired — one cause
- The 2026-10-23 window reboot restarted
postgresql-2(13:50Z). - CNPG 1.29 sets the role
postgrestwice at each instance start (refreshCredentialsFromSecret): first from the superuser secretpostgresql-superuser, then from thebootstrap.initdbowner secretpostgres-superuser(owner: postgres). The second wins. - The dump CronJob read
postgresql-superuser→password authentication failedfrom 16:00Z →PostgresqlDumpStale(22:15Z). - The Gitea off-site push at 00:20 refused the 12 h old Gitea dump, as designed →
DooplexGiteaOffsiteStale(00:57Z).
Fix (operator's pick): the CronJob reads postgres-superuser (homelab 531023d, ArgoCD sync of that one CronJob).
PostgresqlDumpStale last firing sample 10:44:00Z; DooplexGiteaOffsiteStale 10:51:00Z.
Undo
- CronJob:
git -C homelab-manifests revert 531023d, then syncCronJob/postgresql-backupin appdatabase-system. - Routing:
git -C homelab-manifests revert 22d7697, sync ConfigMapsalertmanager-config-templateandprometheus-rulesin appmonitoring,curl -XPOST http://10.43.75.209:9090/-/reload,sudo kubectl -n mon-system rollout restart deploy/alertmanager.
For the homelab session (homelab findings — no HM numbers minted here)
- The two-writer race on the role
postgresstays. The Cluster still names two secrets for one role; only the CronJob was moved (operator's pick). Ifpostgresql-superuseris rewritten while the instance runs, the role flips back and the dump fails again (PostgresqlDumpStalecatches it in ~12 h). The lasting fix isspec.superuserSecret: {name: postgres-superuser}on the Cluster (both writers then write one value; the password in force does not change). - The routing change made: critical 1 h → 4 h, warning 4 h → 12 h, root 4 h → 12 h, one backup group mail
(
component: backup,PostgresqlDumpStalerelabelled), one mail per drive (homelab22d7697). Applied by a restart: Alertmanager cannot reload a ConfigMap change (envsubstinit container). - The silence for the pulled disk Z6A07P2G (
device=~.*_Z6A07P2G, until 2026-11-11) matches nothing now; expire it when convenient (Felhom R-934 closed). - Long-firing alarms in the 7 days:
DiskOfflineUncorrectable+DiskUncorrectableSectorson Z6A07P2G fired the whole window (≥ 145 h, critical) — silenced by the operator since 2026-10-12, so seen, and ended by the pull. Nothing else fired longer than 12.4 h. - The window's catch-all silence (
alertname=~.+, 2026-10-23 12:06–14:05Z) expired as planned; nothing to do.