Operational hardening across several services after live incident analysis between 2026-05-18 and 2026-05-20: - Gitea: disable public registration and OpenID signup/signin to stop the external POST / 5xx bursts that triggered availability alerts. New repo-wide policy requires every productive Micha/homelab-infra Komodo stack to ship with an active Gitea->Komodo webhook on the current stack ID (documented in CLAUDE.md, AI_CONTEXT.md, WORKFLOW.md). - posture-check: extract the Disk1 fstype check into its own function so the documented Disk1 NTFS exception no longer raises ntfy warnings, skip POSIX inode checks on NTFS, and dedup ntfy alerts via a fingerprint state file with ALERT_REPEAT_SECONDS (default 24h). Repeat-spam on the same cause now suppressed. - docker-critical-events: parse the event JSON for container name, action, exit code and signal; drop `die exit=0` events (clean stops); ship a structured ntfy message instead of the raw event line. - Borg UI: mount /mnt/user/services into the backup container as /local/services:ro and include homelab-infra, stacks and posture-check in all-important-sources.txt. RESTORE_MATRIX and DISASTER_RECOVERY updated accordingly. - Unraid user scripts: document the new homelab-operations-report-daily cron job and the SMTP password file it expects on the host. - MIGRATION_LOG: capture the four live events from this window - Gitea 5xx burst + signup closure, Komodo webhook reconciliation, posture-check host-version verification, Borg scope extension, and Traefik 5xx alert detuning. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
11 KiB
AI Context
Stand: 2026-05-04
Diese Datei ist fuer KI-Agenten gedacht, die das Homelab-Repo schnell verstehen muessen. Sie ersetzt nicht die Detaildokumente, sondern fasst Zielbild, Betriebsmodell und Risiken zusammen.
Kurzfassung
Dieses Repository beschreibt ein Unraid-basiertes Homelab namens Kallilabcore. Der Betrieb folgt GitOps: Gitea origin/master ist die Quelle der Wahrheit, der lokale Clone ist Arbeitskopie, Komodo deployed aus Gitea, Docker Runtime und Host sind Ergebnis, nicht Bearbeitungsort.
Traefik ist der zentrale Web-Einstieg fuer HTTP(S). Admin-/Ops-UIs liegen entweder hinter Authelia/secure headers oder sind als Ausnahme dokumentiert. Secrets liegen ausserhalb des Repos auf dem Host, meistens unter /mnt/user/appdata/secrets/.
Zielbild des Homelabs
- stabile Compose-first Infrastruktur
- keine produktiven Dockerman-/Ad-hoc-Container als Dauerzustand
- Traefik als einziger oeffentlicher Web-Eingang
- GitOps ueber Gitea + Komodo
- klare Trennung von Web-Netz, Backend-Netz und app-internen Netzen
- saubere Backup-/Restore-Faehigkeit ueber Borg, Dumps und dokumentierte Pfade
- keine stillen Host-Hotfixes ohne Repo-/Doku-Abgleich
Architekturblocke
Ingress / Netzwerk
traefiknimmt 80/443 entgegen.- Docker-Labels definieren Service-Routing.
traefik/dynamic/*bleibt nur fuer Middlewares, TLS und Dashboards.- Neue Service-Routen gehoeren nicht in den File-Provider.
DNS / Remote
- AdGuard Home beantwortet LAN-DNS und nutzt Unbound als Upstream.
- Tailscale stellt Remote-Zugang bereit und nutzt
network_mode: host.
GitOps
- Gitea hostet das Repo unter
git.kaleschke.info. - Komodo ist Stack-Manager und Deploy-Consumer.
- Komodo Periphery braucht Docker-Socket und
/mnt/user/servicesMount, um Stacks reproduzierbar zu deployen. - Neue produktive Komodo-Stacks aus
Micha/homelab-inframuessen einen aktiven Gitea->Komodo-Webhook auf die aktuelle Stack-ID haben; Ausnahmen wie deaktivierte/pausierte Stacks muessen dokumentiert werden.
Identity / Security
- Authelia stellt ForwardAuth fuer viele Admin-UIs bereit.
- Authelia nutzt GMX SMTP fuer Identity-/2FA-Benachrichtigungen; Passwort liegt als Host-Secret
authelia_smtp_password.txt. - Vaultwarden ist ein separater Passwort-Tresor.
- Komodo ist bewusst nicht pauschal hinter Authelia, weil UI, API, Webhooks und Periphery-WebSocket sonst leicht gebrochen werden koennen.
- Komodo-Compose, Komodo-Secrets und Komodo-Runtime nur gemeinsam mit dem Betreiber aendern;
KOMODO_WEBHOOK_SECRETist bewusst getrennt vonKOMODO_SECRET_KEY. Gitea-Webhooks nicht pauschal vereinheitlichen: einzelne Komodo-Stacks koennen eigene per-Stack-Webhook-Secrets haben.
Apps
Wichtige Apps sind Paperless, Immich, Mealie, Mail Archiver, Nextcloud, ntfy, Vaultwarden und Gitea. Admin-/Ops-Tools sind u. a. Homepage, Komodo, Borg UI, Uptime Kuma, Filebrowser, code-server, Glances, Scrutiny, Speedtest, Grafana und Hermes Agent.
Hermes Agent — Architektur und Ops-Monitor
Hermes laeuft nach Model C (siehe ops/hermes-agent/README.md):
hermes-gatewayals Docker-Container auf dem Unraid-Host, intern aufhermes_net:8642- Terminal-Befehle werden via SSH auf eine dedizierte Linux-VM ausgefuehrt
- VM-IP:
192.168.178.143, SSH-User:hermes - Repo-Clone auf der VM:
/srv/hermes-workspace/homelab-infra/
Fuer KI-Agenten wichtig: Das Hermes-Terminal laeuft auf der VM, nicht auf dem Unraid-Host.
/mnt/user/...-Pfade sind von der VM aus nicht direkt erreichbar.
Docker-CLI ist auf der VM nicht installiert — fuer Homelab-Checks wird check_health.py verwendet.
Ops-Monitor (homelab-ops-monitor):
- Skill:
ops/hermes-agent/skills/homelab-ops-monitor.md - Script:
ops/hermes-agent/scripts/check_health.py— prueft Services via HTTP, keine externen Deps - Wissensbasis:
ops/hermes-agent/services.json— maschinenlesbare Ableitung ausdocs/SERVICE_CATALOG.md - Check-Strategie: HTTP GET fuer URL-basierte Services, interne Services (DBs, Redis) als
"internal"markiert - ntfy-Topic fuer Alerts:
homelab-alertsaufhttps://ntfy.kaleschke.info
Nach Aenderungen an services.json oder check_health.py: git pull auf der VM ausfuehren.
- Mail Archiver ist ein Hybrid-Dienst mit
frontend_netfuer IMAP/Traefik undbackend_netfuer PostgreSQL; die Web-UI liegt hinter Authelia und behaelt zusaetzlich App-eigene Auth.
Monitoring / Metriken
- Zielzustand ist ein zentraler Stack
monitoring/unterhttps://monitoring.kaleschke.info. monitoring-grafanaist die zentrale UI fuer Prometheus, Loki und InfluxDB 3 Core.monitoring-prometheussammelt Infrastruktur-Metriken;monitoring-loki+monitoring-promtailsammeln Docker-Logs.monitoring-influxdb3-coreist nicht public und nicht imfrontend_net.- Home Assistant schreibt ueber LAN-only Port 8181 nach InfluxDB, gebunden ueber
INFLUXDB_BIND_IP. - Ein
401 Unauthorizedvon InfluxDB ohne Token ist beim Reachability-Test ein Erfolgssignal. ops/lokiundops/grafana-influxdbsind abgeloeste Altstaende und sollen nach erfolgreichem Monitoring-Deploy nicht parallel betrieben werden.
Deployment-Logik
Normalfall:
- lokaler Clone synchronisieren
- betroffene Dokumente und Compose-Datei lesen
- minimal aendern
- lokal validieren
- committen und pushen
- Komodo-Webhook / Deploy beobachten
- Runtime testen
- Doku aktualisieren
Wichtig: Komodo-Web-Editor ist nicht der Bearbeitungsort. Wenn Komodo und Git voneinander abweichen, zuerst Git und Komodo Workspace pruefen, nicht live herumprobieren.
Beim Anlegen neuer produktiver Stacks ist der Gitea->Komodo-Webhook Pflicht. Nach dem Anlegen muss ein Test-Push oder Test-Delivery zeigen, dass Gitea die aktuelle Komodo-Stack-ID erreicht.
Netzwerkmodell
| Netzwerk | Bedeutung |
|---|---|
frontend_net |
Web-/Proxy-Netz fuer Traefik-geroutete Dienste und Dienste mit Internetbedarf |
backend_net |
internes Netz fuer shared PostgreSQL, Redis und Backends |
dns_net |
AdGuard + Unbound |
| app-interne Netze | Isolation von App + DB/Cache, z. B. Immich, Mealie, Nextcloud, Grafana/Influx |
host |
nur dokumentierte Sonderfaelle wie Tailscale/Plex |
Regeln:
- Datenbanken nie ins
frontend_net. - Admin-UIs nur mit Traefik + Middleware oder dokumentierter Ausnahme.
- Direkte Host-Ports sind Ausnahme, nicht Default.
- Runtime-Netznamen koennen Compose-Projektpraefixe bekommen, z. B.
grafana_grafana_influx_lan.
Security-Modell
- Secrets nie ins Git.
- Werte niemals zitieren, auch nicht aus
.env, Stack ENV, Logs oder Screenshots. - Secret-Dateien bevorzugt unter
/mnt/user/appdata/secrets/. _FILE-Varianten bevorzugen, falls Image sie unterstuetzt.- Wenn
_FILEnicht unterstuetzt wird, Komodo Stack Environment Variables verwenden. - Docker-Socket,
privileged: true, Host-Netz und breite Mounts sind nur mit dokumentierter Begruendung akzeptabel.
Bekannte Ausnahmen:
- Traefik: 80/443
- Gitea: SSH 222
- AdGuard: DNS 53 und Admin 8082
- Tailscale: Host-Netz,
NET_ADMIN,NET_RAW,/dev/net/tun - Scrutiny: privileged
- Komodo: Docker-Socket, native Auth
- InfluxDB: LAN-only 8181 fuer Home Assistant Writer
- Grafana/InfluxDB:
user: "0"als dokumentierte Host-Appdata-Permissions-Ausnahme - Traefik dynamic config: manueller Host-Sync
Backup- und Restore-Modell
Borg sichert kritische Appdaten, Secrets, Traefik-State und Dump-Artefakte. Datenbank-Restore soll bevorzugt ueber Dumps laufen, nicht ueber rohe Live-DB-Verzeichnisse.
Wichtige Pfade:
/mnt/user/appdata/mnt/user/appdata/secrets/mnt/user/services/mnt/user/documents/mnt/user/photos/mnt/user/backups/borg/dumps/latest
Dump-Skript:
ops/borg-ui/scripts/pre-backup-dumps.sh- soll auf dem Unraid Host laufen
- soll nicht als Borg-UI Inline-Hook behandelt werden, solange die Architektur nicht bewusst geaendert wird
Disaster Recovery folgt einer Bootstrap-Reihenfolge:
- Traefik, AdGuard, Tailscale
- PostgreSQL, Authelia, Redis, Gitea
- Komodo
- kritische Apps
- restliche Apps/Ops inklusive Hermes Agent
Typische Arbeitsweise im Repo
- Fuer Fragen zuerst
HOMELAB_ARCHITECTURE_MASTER_V2.mdlesen. - Fuer operative Aenderungen
docs/WORKFLOW.mdlesen. - Fuer Service-Details
docs/SERVICE_CATALOG.mdund die Compose-Datei lesen. - Fuer Drift
docs/GITOPS_DRIFT_RUNBOOK.mdnutzen. - Fuer Rollback
docs/ROLLBACK.mdnutzen. - Fuer Restore
docs/DISASTER_RECOVERY.mdunddocs/RESTORE_MATRIX.mdnutzen.
KI-Agenten sollen konservativ arbeiten: keine indirekten Live-Aenderungen, keine Deployments, keine Commits, keine Host-Schreibbefehle, wenn der Benutzer nur Analyse oder Doku verlangt.
Bekannte Risiken und Altlasten
- Traefik dynamic config muss manuell auf den Host synchronisiert werden; Komodo deployed diese Dateien nicht automatisch.
backend_netund app-interne Netze muessen bei Runtime-Problemen live geprueft werden, weil Compose-Projektpraefixe Netznamen veraendern koennen.- Authelia
configuration.ymlist Repo-Baseline fuer nicht geheime Einstellungen, wird aber nicht automatisch von Komodo auf den Host kopiert; die produktive Host-Datei kann OIDC-/Secret-Konfiguration enthalten. Bei Auth-Aenderungen Repo-Baseline, Host-Config und Compose-Middlewares pruefen und nicht blind ueberschreiben. - Authelia nutzt PostgreSQL, aber bewusst kein Redis-Session-Backend; Redis ist kein Authelia-Bootstrap-Blocker.
- Authelia-Notifier ist SMTP; bei Auth-Aenderungen Host-Config backupen,
authelia validate-configausfuehren und erst danach neu starten. paperless-ngxnutzt fuer DB/Redis bewusst Stack ENV statt_FILE.homepage,glancesundkomodo-peripherynutzen Docker-Socket-Mounts; Zugriff bewusst behandeln.borg-uiundfilebrowserhaben breite Mounts; bei Hardening nicht ad hoc, sondern gezielt vorgehen.scrutinyist privilegiert und hat Device-Mounts.Plex-Media-Serverist im Architekturziel als Host-Sonderfall dokumentiert, aber nicht als Repo-Compose-Stack enthalten.- Echte
stack.env- und.env-Dateien gehoeren nicht ins Repo; fuer Hermes liegt nurops/hermes-agent/stack.env.exampleim Git. - Einige Images nutzen mutable Tag plus Digest. Das friert den aktuellen Digest ein, ist aber kein automatisches Upgrade-Modell.
- Stateful Images werden bevorzugt als Minor-/Patch-Tag plus Digest gepinnt; Redis-Caches bleiben bewusst ungedigestet.
Arbeitsregel bei Unsicherheit
Nicht raten. Erst diese Reihenfolge:
- Repo-Doku lesen
- Compose-Datei lesen
- Git-Stand pruefen
- Komodo Workspace pruefen
- Docker Runtime pruefen
- Host-Listener / echten Request pruefen
- genau eine abweichende Ebene benennen
Wenn zwei Reparaturversuche scheitern: keine weiteren Schreibbefehle, Pflichtmatrix aus docs/GITOPS_DRIFT_RUNBOOK.md ausfuellen.