Files
homelab-infra/docs/SERVICE_CATALOG.md
T
2026-05-26 15:27:37 +02:00

20 KiB

Service Catalog

Stand: 2026-05-23

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 100.80.98.33:8082 dns_net, frontend_net, Unbound /mnt/user/appdata/adguard/conf, /mnt/user/appdata/adguard/work Tier 1, config relevant nein Direkter DNS-Port 53 bleibt; Admin-Port ist bewusst ohne Traefik/2FA, aber auf Tailscale-IP begrenzt (Operator-Entscheidung 2026-05-26)
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, externe DNS-Resolver fuer GitHub-Push-Mirror /mnt/user/services/gitea/data Tier 1, gitea.sqlite.dump + Share; privater GitHub-Push-Mirror fuer Repo-Bootstrap ja SSH-Port 222 direkte Host-Port-Ausnahme; Push-Mirror nach michaelkaleschke-spec/homelab-infra reduziert das DR-Bootstrap-Risiko

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
plex Medienserver mit LAN-/Client-Discovery host-services/plex/docker-compose.yml Plex native / LAN / Remote je Plex-Konfiguration Host-Netz /mnt/user/appdata/plex/config, /mnt/user/appdata/plex/transcode, /mnt/user/media, /mnt/user/photos Tier 2, Appdata + Medienpfade im Borg-/Share-Scope nein Repo-Compose-Stack; network_mode: host bleibt dokumentierte Discovery-Ausnahme, kein Traefik-Stack
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
glance einziges Homelab-Uebersichts-/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
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
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 als Uptime-Kuma-Ersatz monitoring/docker-compose.yml, monitoring/blackbox/blackbox.yml intern :9115 Prometheus, externe HTTPS-Ziele kein kritischer Zustand rebuildbar nein Uptime Kuma wurde 2026-05-25 nach erfolgreichem Blackbox-/Grafana-Smoke-Test entfernt
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 Ersetzt den alten ops/loki-Stack; kein paralleler Altcontainer aktiv
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
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; Disk1-NTFS ist nach Disk1 Phase 2 nicht mehr erlaubt (ALLOW_DISK1_NTFS=0 Standard); 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.md und docs/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/secrets in 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/data und koennen durch Neustart des internen Loki-Stacks wieder genutzt werden.
  • Host-Logs wie /var/log/syslog und dmesg bleiben die Quelle fuer Kernel-, OOM- und Docker-Daemon-Ereignisse.
  • Critical-Events werden zusaetzlich ueber ntfy extern sichtbar, wenn services/posture-check/docker-critical-events.sh als Host-Watcher laeuft.
  • Docker json-file Logs werden auf Unraid nativ ueber /boot/config/docker.cfg begrenzt. Aktiver Host-Stand: DOCKER_LOG_ROTATION="yes", DOCKER_LOG_SIZE="50m", DOCKER_LOG_FILES="1". Keine zusaetzliche /etc/docker/daemon.json setzen, 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.