Add self-hosted Healthchecks stack for internal job monitoring (hybrid)

Self-hosted Healthchecks (ops/healthchecks/) as the hub for internal
cron/job heartbeats. The three host-down/backup watchdogs (Borg pre-hook,
baerchen nearline pull, monitoring watchdog #8) deliberately stay on
healthchecks.io cloud, since an on-host watcher cannot report a host outage.

- frontend_net + dedicated PostgreSQL 18 in healthchecks_internal
- native Healthchecks auth; ping/API exempt from Authelia (n8n/Komodo pattern)
- registered as middleware_exempt in ops/policy-checks/exceptions.json
- docs: DECISIONS, ARCHITECTURE (3.1/4.2/7.6/10), SERVICE_CATALOG,
  SECRETS_MAP, MASTER_TODO, README index

docker compose config validated (exit 0). Not yet deployed: host secret file,
appdata dir, Komodo stack + ENV and Gitea webhook remain operator steps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 20:09:56 +02:00
parent ee0d450a27
commit cbfbb8ca4f
9 changed files with 291 additions and 0 deletions
+40
View File
@@ -11,6 +11,46 @@ in `HOMELAB_ARCHITECTURE_MASTER_V2.md` §13, `docs/MASTER_TODO.md` (Geparkt),
---
## 2026-06-23 - Healthchecks Hybrid: self-hosted fuer interne Jobs, Cloud fuer Host-down-Waechter
**Entscheidung:** Job-/Cron-Monitoring per Healthchecks (Dead-Man's-Switch) wird
hybrid betrieben. Ein **self-gehosteter** Healthchecks-Stack (`ops/healthchecks/`,
`hc.kaleschke.info`) ist der Hub fuer die vielen **internen** Checks auf einem
laufenden Host ("lief Job X heute?": posture-check, restore-tests, Dump-Erzeugung,
gitea-bundle-mirror). Die drei host-down-/backup-still-Waechter
(Borg-Pre-Hook `ops/borg-ui/scripts/pre-borg.sh`, baerchen-Nearline-Pull
`ops/h-drive-nearline/pull-critical-backups.ps1`, geplanter Monitoring-Watchdog
Empf. #8) bleiben bewusst **extern** auf healthchecks.io-Cloud (Free-Tier).
**Kontext:** Die zwei bestehenden Borg-/Nearline-Pings waren bereits
endpoint-agnostisch verdrahtet (`docs/SECRETS_MAP.md`), nur die Spielart
(Cloud vs. self-host) war offen (`docs/homelab-optimierung.md` Offene Frage #4).
Ein Waechter, der auf demselben Unraid-Host laeuft, den er ueberwacht, kann einen
Host-Ausfall nicht melden — er ist dann selbst tot, Stille ist nicht von "alles
gut" unterscheidbar. Genau dafuer existieren diese drei Checks, daher muessen sie
extern bleiben. Fuer "lief Job X auf einem lebenden Host?" ist Self-Hosting
dagegen unbedenklich (Host-down ist separat ueber die externen Pings abgedeckt)
und bringt Datenhoheit + unbegrenzte Checks (Cloud-Free = 20).
**Umsetzung / Ausnahme:** `healthchecks` haengt in `frontend_net` (Traefik, native
Healthchecks-Auth, **ohne** pauschale `authelia@file`: Ping-`/ping/*`- und
API-Endpunkte muessen ohne ForwardAuth erreichbar sein, analog n8n/Komodo — in
`ops/policy-checks/exceptions.json` als `middleware_exempt_identities` registriert).
Dedizierte PostgreSQL 18 nur in `healthchecks_internal` (`internal: true`).
SMTP bewusst aus (Login via Superuser, Alerts via ntfy-Integration nach
`homelab-alerts`). Secrets: `SECRET_KEY`/`DB_PASSWORD`/Superuser als
Komodo-Stack-ENV, Postgres zusaetzlich als Datei-Secret.
**Alternativen:** (a) Nur Cloud fuer alles — schlanker (kein Stack, kein Postgres),
aber 20-Check-Limit und Metadaten-Abfluss; (b) alles self-host inkl. Backup-Waechter
— verworfen wegen des Host-down-Blind-Spots; (c) ntfy-Heartbeat von einem zweiten
Geraet statt Cloud (Optionsnotiz in Empf. #4) — bleibt moeglich, falls die
Cloud-Abhaengigkeit spaeter unerwuenscht ist. **Review-Trigger:** mehr als ~20
externe Checks noetig, Wunsch null Cloud-Abhaengigkeit, oder zweite Hardware (dann
koennte der interne Hub dorthin und auch Host-down abdecken).
---
## 2026-06-23 - Komodo nur aus vertrauenswuerdigen Netzen (IP-Allowlist statt public)
**Entscheidung:** Der Komodo-Router (`komodo.kaleschke.info`) bekommt eine