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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user