cd650b19ac
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>
22 KiB
22 KiB
Service Catalog
Stand: 2026-05-04
Dieser Katalog beschreibt produktive und repo-vorbereitete Dienste aus Sicht von Betrieb, Restore und KI-Kontext. Er basiert auf dem Repo-Sollzustand. Vor produktiven Eingriffen immer den Live-Zustand in Komodo/Docker pruefen.
Secret-Werte sind nicht enthalten. Es werden nur Secret-Namen, Env-Key-Namen und Pfade genannt.
Core / Ingress / DNS
| Service | Zweck | Autoritativer Pfad | URL / Zugang | Abhaengigkeiten | Datenpfade | Backup / Restore | Traefik | Besonderheiten / TODOs |
|---|---|---|---|---|---|---|---|---|
traefik |
zentraler Reverse Proxy, TLS, Docker-Label-Routing | traefik/docker-compose.yml, traefik/dynamic/* |
https://traefik.kaleschke.info |
Docker socket, Cloudflare DNS API, frontend_net, backend_net |
/mnt/user/appdata/traefik/dynamic, /mnt/user/appdata/traefik/letsencrypt |
Tier 1, Share/Borg | ja, eigene Dashboard-Route mit Authelia | Host-Ports 80/443 sind zentrale Ausnahme; dynamic configs werden nicht automatisch von Komodo deployed |
adguard |
DNS-Server / LAN DNS | host-services/Adguard/docker-compose.yml |
LAN-Port 53, Admin 8082 |
dns_net, frontend_net, Unbound |
/mnt/user/appdata/adguard/conf, /mnt/user/appdata/adguard/work |
Tier 1, config relevant | nein | Direkte Ports 53 und 8082 dokumentierte Ausnahme; Admin-Port spaeter ggf. absichern |
unbound |
Upstream DNS Resolver fuer AdGuard | apps/unbound/docker-compose.yml |
intern | dns_net |
/mnt/user/appdata/unbound/config |
rebuildbar / config relevant | nein | intern isoliert |
tailscale |
VPN/Remote-Zugang | host-services/tailscale/docker-compose.yml |
Tailscale | Host-Netz | /mnt/user/appdata/tailscale |
Tier 1, State relevant | nein | network_mode: host, NET_ADMIN, NET_RAW und /dev/net/tun sind dokumentierte VPN-Ausnahmen |
gitea |
Git-Server / origin fuer GitOps | core/gitea/docker-compose.yml |
https://git.kaleschke.info, SSH 222 |
Traefik, frontend_net |
/mnt/user/services/gitea/data |
Tier 1, gitea.sqlite.dump + Share |
ja | SSH-Port 222 direkte Host-Port-Ausnahme; ohne externen Mirror im DR kritisch |
Security / Identity
| Service | Zweck | Autoritativer Pfad | URL / Zugang | Abhaengigkeiten | Datenpfade | Backup / Restore | Traefik | Besonderheiten / TODOs |
|---|---|---|---|---|---|---|---|---|
authelia |
ForwardAuth / zentrale Auth fuer Admin-UIs | security/authelia/docker-compose.yml, security/authelia/configuration.yml |
https://auth.kaleschke.info |
PostgreSQL 17, Traefik, GMX SMTP | /mnt/user/appdata/authelia/config, Authelia Secret-Dateien |
Tier 1, config + DB + secrets | ja | Bewusst ohne Redis-Session-Backend; SMTP-Notifier via GMX und authelia_smtp_password.txt; explizite DNS-Server fuer SMTP/NTP; Repo-Baseline muss manuell in die Host-Config gemerged werden, OIDC/Secrets bleiben hostseitig; Access-Control und Compose-Middleware bei Aenderungen abgleichen |
vaultwarden |
Passwort-Tresor | security/vaultwarden/docker-compose.yml |
https://vault.kaleschke.info |
Traefik, frontend_net |
/mnt/user/appdata/vaultwarden |
Tier 1, vaultwarden.sqlite.dump + Share |
ja | ADMIN_TOKEN_FILE; keine direkten Ports |
Shared Infrastructure
| Service | Zweck | Autoritativer Pfad | URL / Zugang | Abhaengigkeiten | Datenpfade | Backup / Restore | Traefik | Besonderheiten / TODOs |
|---|---|---|---|---|---|---|---|---|
postgresql17 |
shared PostgreSQL Cluster | infra/postgresql17/docker-compose.yml |
intern | backend_net |
/mnt/user/appdata/postgresql17, postgres_password.txt |
Tier 1; Dumps unter /mnt/user/backups/borg/dumps/latest |
nein | keine Host-Ports; raw DB nicht primaerer Restore-Weg |
Redis |
shared Redis Cache | infra/redis/docker-compose.yml |
intern | backend_net |
/mnt/user/appdata/redis, redis_password.txt |
transiente Daten, bewusst nicht kritisch | nein | Passwort-Datei; optional named volume offen |
ddns-updater |
Cloudflare/DDNS Aktualisierung | infra/ddns-updater/docker-compose.yml |
intern | Internetzugang, frontend_net |
/mnt/user/appdata/ddns-updater |
rebuildbar | nein | bleibt bewusst in frontend_net, weil backend_net internal ist |
Public / User Apps
| Service | Zweck | Autoritativer Pfad | URL / Zugang | Abhaengigkeiten | Datenpfade | Backup / Restore | Traefik | Besonderheiten / TODOs |
|---|---|---|---|---|---|---|---|---|
paperless-ngx |
Dokumentenmanagement | apps/paperless/docker-compose.yml |
https://paperless.kaleschke.info |
PostgreSQL 17, Redis, Traefik | /mnt/user/appdata/paperless-ngx/data, /mnt/user/documents/paperless, /mnt/user/documents/scans_inbox |
Tier 2, Borg + postgresql17-paperless.dump |
ja | DB/Redis Secrets bleiben bewusst Stack ENV |
paperless-gpt |
KI-Ergaenzung fuer Paperless | apps/paperless-gpt/docker-compose.yml |
https://paperless-gpt.kaleschke.info |
Paperless API, LLM/Ollama, Traefik | /mnt/user/appdata/paperless-gpt/data, /mnt/user/appdata/paperless-gpt/prompts |
Tier 2 | ja + Authelia | API Token als Stack ENV; OCR/LLM-Konfig bei Aenderungen pruefen |
immich_server |
Foto-/Video-App | apps/immich/docker-compose.yml |
https://immich.kaleschke.info |
Immich Postgres, Immich Redis, ML, Traefik | /mnt/user/photos/immich, /mnt/user/photos/family_archive |
Tier 2, Borg + immich.dump |
ja | native App-Auth; externes Fotoarchiv gemountet |
immich_postgres |
Immich-Datenbank | apps/immich/docker-compose.yml |
intern | immich_default |
/mnt/user/appdata/immich_postgres, immich_postgres_password.txt |
Dump immich.dump |
nein | nie ins frontend_net |
immich_redis |
Immich Cache | apps/immich/docker-compose.yml |
intern | immich_default |
kein kritischer Pfad dokumentiert | rebuildbar | nein | Architektur nennt anonymes Volume -> named volume als offenes Thema |
immich_machine_learning |
Immich ML | apps/immich/docker-compose.yml |
intern | immich_default |
model-cache |
rebuildbar | nein | intern-only |
mealie |
Rezeptverwaltung | apps/mealie/docker-compose.yml |
https://mealie.kaleschke.info |
mealie-postgres, Traefik |
/mnt/user/appdata/mealie/data |
Tier 2, Borg + mealie.dump |
ja | App + DB in internem Netz getrennt |
mealie-postgres |
Mealie-Datenbank | apps/mealie/docker-compose.yml |
intern | mealie_internal |
/mnt/user/appdata/mealie/postgres, mealie_postgres_password.txt |
Dump mealie.dump |
nein | interne DB |
mail-archiver |
Mail-Archivierung | apps/mail-archiver/docker-compose.yml |
https://mail.kaleschke.info |
PostgreSQL 17, Internet/IMAP, Traefik, Authelia | /mnt/user/appdata/mailarchiver/data-protection-keys |
Tier 2, postgresql17-mailarchiver.dump |
ja + Authelia | Hybrid-Dienst: frontend_net fuer Internet, backend_net fuer DB; App-eigene Auth bleibt zusaetzliche Schutzschicht |
nextcloud |
Datei-/Cloud-Dienst | apps/nextcloud/docker-compose.yml |
https://cloud.kaleschke.info |
eigene PostgreSQL, eigene Redis, Traefik | /mnt/user/appdata/nextcloud/html, /mnt/user/documents/nextcloud-data |
Tier 2, nextcloud.dump + Share |
ja | native App-Auth ohne zentrale ForwardAuth; WebDAV/CardDAV beachten |
nextcloud-postgres |
Nextcloud-Datenbank | apps/nextcloud/docker-compose.yml |
intern | nextcloud_internal |
/mnt/user/appdata/nextcloud/postgres, nextcloud_postgres_password.txt |
nextcloud.dump, raw DB nicht primaerer Restore-Weg |
nein | interne DB |
nextcloud-redis |
Nextcloud Cache/Locking | apps/nextcloud/docker-compose.yml |
intern | nextcloud_internal |
/mnt/user/appdata/nextcloud/redis |
Teil von Nextcloud-Restore | nein | interne Redis |
ntfy |
Push-Benachrichtigungen | apps/ntfy/docker-compose.yml |
https://ntfy.kaleschke.info |
Traefik, upstream mobile push | /mnt/user/appdata/ntfy |
Tier 2 | ja | NTFY_BEHIND_PROXY=true; Problem-Alerts gehen gebuendelt an homelab-alerts, optionale Erfolgsmeldungen an homelab-info |
bentopdf |
PDF-Tooling / Ersatz fuer Stirling-PDF | apps/bentopdf/docker-compose.yml |
https://pdf.kaleschke.info |
Traefik + Authelia | keine kritische Persistenz im Compose | Tier 3, rebuildbar | ja + Authelia | COOP/COEP per Middleware; fachliche Abnahme/Live-Status pruefen |
Operations / Monitoring / Admin
| Service | Zweck | Autoritativer Pfad | URL / Zugang | Abhaengigkeiten | Datenpfade | Backup / Restore | Traefik | Besonderheiten / TODOs |
|---|---|---|---|---|---|---|---|---|
homepage |
Start-Dashboard | apps/homepage/docker-compose.yml |
https://home.kaleschke.info |
Traefik, viele API Tokens | /mnt/user/appdata/homepage, /mnt/user/appdata/homepage/images |
Tier 2 | ja + Authelia laut Compose | Authelia schuetzt die Domain ueber die 1FA-Wildcard-Regel; Docker socket im Recovery entfernt, Docker-Widgets erst wieder via dokumentierter Ausnahme oder Socket-Proxy |
glance |
Homelab-Uebersicht / Status-Dashboard | ops/glance/docker-compose.yml, ops/glance/config/glance.yml |
https://glance.kaleschke.info |
Traefik + Authelia, interne HTTP-Checks, Immich API, AdGuard API, Speedtest API, interner Docker-Socket-Proxy | Repo-Konfiguration; keine kritische Persistenz | Tier 3, rebuildbar | ja + Authelia | Zeigt aktive Dienste, Immich-Community-Widget, Internet-/DNS-/VPN-Monitore, AdGuard-DNS-Stats, Speedtest-Livewerte, Docker-Containergruppen, Server-Stats, Zeitfortschritt, Bookmarks und eine Infrastruktur-Seite; Docker-API nur ueber glance-docker-socket-proxy auf internem Netz |
komodo-core |
GitOps UI/API/Stack-Manager | ops/komodo/docker-compose.yml |
https://komodo.kaleschke.info |
Mongo, Gitea, Traefik | /mnt/user/appdata/komodo/core, komodo_keys |
Tier 1 | ja, native Auth | keine pauschale Authelia-ForwardAuth; Gitea DNS override |
komodo-mongo |
Komodo Datenbank | ops/komodo/docker-compose.yml |
intern | komodo_net |
/mnt/user/appdata/komodo/mongo, komodo_mongo_password.txt |
Tier 1, komodo-mongo.archive.gz |
nein | Dump am 2026-05-04 bestaetigt; nach Major-Upgrades pruefen |
komodo-periphery |
Komodo Host-Agent | ops/komodo/docker-compose.yml |
intern Core -> Periphery | Docker socket, /mnt/user/services, frontend_net, komodo_net |
/mnt/user/appdata/komodo/periphery, komodo_keys |
Tier 1 | nein | Docker-Socket-Ausnahme; /mnt/user/services Mount fuer Stack-Workspaces |
borg-ui |
Borg Backup-/Restore UI | ops/borg-ui/docker-compose.yml |
https://borg.kaleschke.info |
Traefik + Authelia, Borg repo credentials | /mnt/user/appdata/borg-ui/data, /mnt/user/backups/borg/dumps, Restore-Ziel |
Tier 3 / Backup kritisch, borg-ui.sqlite |
ja + Authelia | breite Mounts bewusst; /local/secrets im DR-Scope; Nextcloud-Daten werden read-only nach /local/nextcloud/data eingebunden |
uptime-kuma |
Monitoring / Uptime Checks | ops/uptime-kuma/docker-compose.yml |
https://uptime.kaleschke.info |
Traefik + Authelia | /mnt/user/appdata/uptime-kuma |
Tier 3, uptime-kuma.sqlite.dump |
ja + Authelia | Monitore nach Restore pruefen |
glances |
System-/Container-Monitoring | ops/glances/docker-compose.yml |
https://glances.kaleschke.info |
Docker socket, rootfs, Traefik + Authelia | kein kritischer Zustand | Tier 3, rebuildbar | ja + Authelia | Dokumentierte Host-Observability-Ausnahme: pid: host, /:/rootfs:ro, /var/run/docker.sock:/var/run/docker.sock:ro, /etc/os-release:/etc/os-release:ro; keine Appdaten ausserhalb /mnt/user/... |
scrutiny |
Laufwerks-/SMART-Monitoring | ops/scrutiny/docker-compose.yml |
https://scrutiny.kaleschke.info |
Device mounts, Traefik + Authelia | /mnt/user/appdata/scrutiny/config, /mnt/user/appdata/scrutiny/influxdb |
Tier 3, Metrics nicht kritisch | ja + Authelia | Dokumentierte Host-Observability-Ausnahme: privileged: true, /run/udev:/run/udev:ro, /dev/sdb:/dev/sdb, /dev/sdc:/dev/sdc, /dev/nvme0n1:/dev/nvme0n1; keine Appdaten ausserhalb /mnt/user/... |
speedtest-tracker |
Speedtest-Monitoring | ops/speedtest/docker-compose.yml |
https://speedtest.kaleschke.info |
Traefik + Authelia | /mnt/user/appdata/speedtest-tracker/config |
Tier 3, speedtest-tracker.sqlite.dump |
ja + Authelia | APP_KEY, ADMIN_PASSWORD Stack ENV |
filebrowser |
Datei-Browser fuer Documents/Photos/Projekte | ops/filebrowser/docker-compose.yml |
https://files.kaleschke.info |
Traefik + Authelia | /mnt/user/appdata/filebrowser/*, /mnt/user/documents, /mnt/user/photos, /mnt/user/projekte |
Tier 3, filebrowser.bolt.dump + Share |
ja + Authelia | Breiter Appdata-Mount entfernt; Secrets und Traefik-Dynamic-Config sind nicht mehr ueber Filebrowser gemountet |
code-server |
Web-Editor / Operations Workspace | ops/code-server/docker-compose.yml |
https://code.kaleschke.info |
Traefik + Authelia | /mnt/user/appdata/code-server, /mnt/user/services/dev |
Tier 3 | ja + Authelia | Passwort ueber LSIO FILE__PASSWORD; Workspaces beachten |
grafana |
abgeloester Altstand fuer Grafana/InfluxDB | ops/grafana-influxdb/docker-compose.yml |
https://grafana.kaleschke.info |
Traefik + Authelia, InfluxDB 3 Core | /mnt/user/appdata/grafana, Grafana provisioning |
Tier 3, grafana.sqlite |
ja + Authelia | Nicht parallel zum neuen monitoring/-Zielstack betreiben; bleibt vorerst als Rollback-/Migrationsreferenz |
influxdb3-core |
abgeloester Altstand fuer Home-Assistant-Langzeitdaten | ops/grafana-influxdb/docker-compose.yml |
LAN 8181 je INFLUXDB_BIND_IP, keine Public URL |
Grafana, Home Assistant Writer | /mnt/user/appdata/influxdb3/data, /mnt/user/appdata/influxdb3/plugins |
Tier 3 | nein | Nach erfolgreicher Migration durch monitoring-influxdb3-core ersetzen; alten Datenpfad nicht blind loeschen |
monitoring-grafana |
zentrale Observability-UI fuer Metriken, Logs und InfluxDB | monitoring/docker-compose.yml |
https://monitoring.kaleschke.info |
Traefik + Authelia, Prometheus, Loki, InfluxDB 3 Core | named volume grafana_data, Provisioning unter monitoring/grafana/provisioning, Dashboards unter monitoring/grafana/dashboards |
Tier 3, named volume | ja + Authelia | Admin-Passwort ueber monitoring_grafana_admin_password.txt; Zielbestand: Homelab / Availability, Homelab / Host Overview, Homelab / Containers + Logs, Traefik Official Standalone Dashboard; Dashboard-Importer ist optionales bootstrap-Profil fuer Traefik |
monitoring-prometheus |
Metrik-Speicher fuer Homelab-Monitoring | monitoring/docker-compose.yml, monitoring/prometheus/prometheus.yml, monitoring/prometheus/alerts.yml |
intern http://prometheus:9090 |
monitoring_net, node-exporter, cAdvisor, Traefik-Metrics, Blackbox Exporter, Alertmanager |
named volume prometheus_data |
Tier 3, transiente Metriken mit 30 Tagen Retention | nein | Scrapes: Prometheus, node-exporter, cAdvisor, Traefik :8082, blackbox-http; Prometheus-Regeln senden an Alertmanager und von dort nach ntfy |
monitoring-alertmanager |
Alert-Routing fuer Prometheus-Regeln | monitoring/docker-compose.yml, monitoring/alertmanager/alertmanager.yml |
intern :9093 |
Prometheus, ntfy Bridge | named volume alertmanager_data |
Tier 3 | nein | sendet firing und resolved Alerts an monitoring-alertmanager-ntfy-bridge |
monitoring-alertmanager-ntfy-bridge |
Alertmanager-Webhook nach ntfy Push | monitoring/docker-compose.yml, monitoring/alertmanager-ntfy-bridge/bridge.py |
intern :8080 |
Alertmanager, https://ntfy.kaleschke.info/homelab-alerts |
kein kritischer Zustand | rebuildbar | nein | formatiert Alertmanager JSON als ntfy Titel, Nachricht, Priority und Tags; keine Secrets |
monitoring-blackbox-exporter |
HTTP-Erreichbarkeitspruefungen fuer Uptime-Kuma-Abloesung | monitoring/docker-compose.yml, monitoring/blackbox/blackbox.yml |
intern :9115 |
Prometheus, externe HTTPS-Ziele | kein kritischer Zustand | rebuildbar | nein | Uptime Kuma erst nach sieben Tagen Parallelbetrieb und Grafana-Alerting-Paritaet stoppen |
monitoring-loki |
Logspeicher fuer Monitoring-Stack | monitoring/docker-compose.yml, monitoring/loki/loki-config.yml |
intern http://loki:3100 |
monitoring_net, Promtail, Grafana |
named volume loki_data |
Tier 3, transiente Logs mit 30 Tagen Retention | nein | Von bestehendem ops/loki getrennt; Doppelbetrieb bewusst pruefen |
monitoring-promtail |
Docker-Log-Collector fuer Monitoring-Loki | monitoring/docker-compose.yml, monitoring/promtail/promtail-config.yml |
intern | Docker socket read-only, Docker json-file Logs, Loki | named volume promtail_positions |
rebuildbar | nein | Dokumentierte Host-Observability-Ausnahme: /var/run/docker.sock:/var/run/docker.sock:ro und /var/lib/docker/containers:ro; keine Appdaten, nur Log-Discovery |
monitoring-node-exporter |
Host-Metriken fuer Prometheus | monitoring/docker-compose.yml |
intern :9100 |
Host /proc, /sys, / read-only, Prometheus |
kein kritischer Zustand | rebuildbar | nein | Host-Observability-Ausnahme mit read-only Rootfs/Proc/Sys-Mounts |
monitoring-cadvisor |
Container-Metriken fuer Prometheus | monitoring/docker-compose.yml |
intern :8080 |
Docker/Host read-only Mounts, Prometheus | kein kritischer Zustand | rebuildbar | nein | Host-Observability-Ausnahme fuer Container-Metriken; keine direkten Ports |
monitoring-influxdb3-core |
InfluxDB 3 Core fuer Home-Assistant-/Ecowitt-Langzeitdaten | monitoring/docker-compose.yml |
LAN 8181 je INFLUXDB_BIND_IP, keine Public URL |
Monitoring-Grafana, Home Assistant Writer | /mnt/user/appdata/influxdb3/data, /mnt/user/appdata/influxdb3/plugins |
Tier 3 | nein | LAN-only Host-Port-Ausnahme; user: "0" ist fuer den lokalen Object-Store-Pfad dokumentiert; uebernimmt den bisherigen InfluxDB-Daten-/Token-Katalog; 401 Unauthorized beim Curl ohne Token ist erwarteter Reachability-Test |
loki |
abgeloester Altstand fuer Container-Logs | ops/loki/docker-compose.yml, ops/loki/config/loki-config.yml |
intern http://loki:3100, keine Public URL |
backend_net, Grafana |
/mnt/user/appdata/loki/config, /mnt/user/appdata/loki/data |
Tier 3, transiente Logs mit 30 Tagen Retention | nein | Durch monitoring-loki ersetzen; nicht parallel betreiben, ausser bewusst zur Migration |
alloy |
abgeloester Altstand fuer Docker-Log-Collection | ops/loki/docker-compose.yml, ops/loki/config/config.alloy |
intern | Docker socket read-only, Loki, backend_net |
/mnt/user/appdata/alloy/config, /mnt/user/appdata/alloy/data |
rebuildbar | nein | Durch monitoring-promtail ersetzen; Socket-Ausnahme bleibt nur fuer aktive Collector relevant |
hermes-gateway |
Hermes Agent Gateway/API intern | ops/hermes-agent/docker-compose.yml |
intern 8642 auf hermes_net |
SSH Runner (VM 192.168.178.143), LLM Provider, optional Home Assistant | /mnt/user/appdata/hermes-agent/data, SSH key path |
Tier 3, Borg/Share | nein | NAS-Stack bleibt deaktiviert, solange die separate Hermes-VM/Runner-Seite nicht wiederhergestellt ist; kein Docker-Socket |
hermes-dashboard |
Hermes Dashboard | ops/hermes-agent/docker-compose.yml |
https://hermes.kaleschke.info via ${HERMES_DASHBOARD_HOST} |
hermes-gateway, Traefik + Authelia |
shared read-only data mount | Tier 3, Borg/Share | ja + Authelia | Compose-Profil dashboard; aktuell VM-seitig offen, nicht Teil des NAS-Finalstarts |
Host Operations
| Service | Zweck | Autoritativer Pfad | URL / Zugang | Abhaengigkeiten | Datenpfade | Backup / Restore | Traefik | Besonderheiten / TODOs |
|---|---|---|---|---|---|---|---|---|
posture-check |
Host-Posture-Audit fuer Filesystem, Mover-Drift, NVMe-SMART und Fuellstand | services/posture-check/posture-check.sh |
Unraid User-Script / Cron / Borg Pre-Hook | findmnt, df, nvme, optional curl fuer ntfy |
/mnt/user/services/posture-check/last.json |
Repo-Skript + letzter JSON-Status | nein | Muss auf dem Unraid-Host bei Boot, stuendlich und vor Borg laufen; ALLOW_DISK1_NTFS=1 ist die dokumentierte Uebergangsausnahme bis Disk1-Migration Phase 2 und erzeugt fuer ntfs3/fuseblk keine ntfy-Warnung; Warning/Critical alarmieren via ntfy nur bei neuer Ursache oder nach ALERT_REPEAT_SECONDS |
docker-critical-events |
Live-Alarmierung fuer Docker die/oom/kill Events |
services/posture-check/docker-critical-events.sh |
Unraid User-Script / Hintergrundprozess | Docker CLI, ntfy | /mnt/user/services/posture-check/docker-critical-events-last.log |
Repo-Skript + letzter Event-Log | nein | Optional als Unraid User-Script at array start starten; sendet nach homelab-alerts |
Backup- und Restore-Hinweise
- Tier-1-Dienste stehen in
docs/RESTORE_MATRIX.mdunddocs/DISASTER_RECOVERY.md. - Dump-Erzeugung erfolgt host-seitig ueber
ops/borg-ui/scripts/pre-backup-dumps.sh. - Dump-Ziel:
/mnt/user/backups/borg/dumps/latest. - Raw Live-DB-Pfade sind meist nicht der primaere Restore-Weg; bevorzugt werden Dumps plus Appdaten.
- Borg UI nimmt bewusst
/local/secretsin den DR-Scope auf.
Logging-Resilienz
- Docker-Rohlogs bleiben die erste Fallback-Ebene:
docker logs <container>funktioniert unabhaengig von Loki/Grafana. - Loki-Chunks liegen unter
/mnt/user/appdata/loki/dataund koennen durch Neustart des internen Loki-Stacks wieder genutzt werden. - Host-Logs wie
/var/log/syslogunddmesgbleiben die Quelle fuer Kernel-, OOM- und Docker-Daemon-Ereignisse. - Critical-Events werden zusaetzlich ueber ntfy extern sichtbar, wenn
services/posture-check/docker-critical-events.shals Host-Watcher laeuft. - Docker
json-fileLogs werden auf Unraid nativ ueber/boot/config/docker.cfgbegrenzt. Aktiver Host-Stand:DOCKER_LOG_ROTATION="yes",DOCKER_LOG_SIZE="50m",DOCKER_LOG_FILES="1". Keine zusaetzliche/etc/docker/daemon.jsonsetzen, weil sie mit Unraids Docker-Startflags kollidieren kann.
Bekannte offene Fragen
- Authelia Repo-Baseline, Host-Config und Compose-Middlewares sollten bei Auth-Aenderungen explizit abgeglichen werden.
- Filebrowser-Mounts sind breit und bewusst, aber bei zukuenftigen Hardening-Sprints Kandidaten.
- Scrutiny bleibt privilegiert; nur mit klarer Begruendung aendern.
- BentoPDF ersetzt Stirling-PDF produktiv. Hermes ist VM-seitig offen und auf dem NAS bewusst nicht gestartet.