Files
homelab-infra/docs/SERVICE_CATALOG.md
T

17 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; Monitoring/Borg-Benachrichtigungen
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
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 Metrik-Dashboard 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 Datasource wird provisioniert, Token ueber Secret; laeuft aktuell als user: "0" wegen Host-Appdata-Permissions
influxdb3-core Zeitreihen-/Metrikdaten fuer Grafana und Home Assistant 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 LAN-only Host-Port-Ausnahme; 401 Unauthorized beim Curl ohne Token ist erwarteter Reachability-Test; laeuft aktuell als user: "0" wegen Host-Appdata-Permissions
loki zentraler Container-Logspeicher 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 Nur intern erreichbar; Grafana nutzt Loki als Datasource; Logs sind Diagnosematerial, keine primaere Restore-Quelle
alloy Docker-Log-Collector fuer Loki 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 Dokumentierte Host-Observability-Ausnahme: /var/run/docker.sock:/var/run/docker.sock:ro; keine Appdaten, nur Log-Discovery
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; Warning/Critical alarmieren via ntfy
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 kallilab-critical

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.