Files
homelab-infra/docs/AUDIT_REPORT.md
T
2026-05-16 21:51:48 +02:00

9.4 KiB

Audit Report - KalliLab CORE

Datum: 2026-05-16 Gepruefte Compose-Dateien: 30

Kritische Befunde

Keine kritischen Befunde im Repo-Sollzustand gefunden.

  • Keine Datenbank und kein Cache haengt in frontend_net.
  • Keine produktive Compose-Datei ohne explizites networks:-Feld gefunden.
  • Keine produktive .env- oder stack.env-Datei ohne .example-Suffix im Repository gefunden.
  • Keine Klartext-Passwoerter, Tokens oder API-Keys in Compose-environment:-Bloecken gefunden.

Mittlere Befunde

  • Docker-Socket ausserhalb der im Audit-Prompt genannten Allowlist: traefik mountet /var/run/docker.sock:/var/run/docker.sock:ro in traefik/docker-compose.yml:34. Der Socket ist fuer den Docker-Provider fachlich nachvollziehbar, aber in HOMELAB_ARCHITECTURE_MASTER_V2.md Abschnitt 10 nicht explizit als Docker-Socket-Ausnahme aufgefuehrt.
  • Docker-Socket ausserhalb der im Audit-Prompt genannten Allowlist: alloy mountet /var/run/docker.sock:/var/run/docker.sock:ro in ops/loki/docker-compose.yml:26. [AUSNAHME - dokumentiert] in HOMELAB_ARCHITECTURE_MASTER_V2.md Abschnitt 10 als alloy Docker-Socket read-only, aber nicht in der Prompt-Allowlist genannt.
  • komodo-periphery haengt ohne Web-UI im frontend_net in ops/komodo/docker-compose.yml:92-94. Die Compose-Datei dokumentiert an ops/komodo/docker-compose.yml:77-79 den Grund als Git-Zugriff auf internes Gitea und Docker-Agent-Sonderfall. [AUSNAHME - lokal in Compose dokumentiert]
  • hermes_net ist ein app-internes Netz ohne internal: true: ops/hermes-agent/docker-compose.yml:91-93. Das ist nicht Teil der explizit geforderten internal: true-Liste, aber strukturell auffaellig, weil Gateway und Dashboard intern ueber dieses Netz sprechen.
  • grafana nutzt zusaetzlich backend_net in ops/grafana-influxdb/docker-compose.yml:27-30, obwohl die Architektur das Grafana/Influx-Paar primaer als frontend_net + grafana_influx_internal beschreibt. Grund ist vermutlich Loki-Datasource-Zugriff; docs/REPO_MAP.md nennt backend_net fuer Grafana-Loki-Datasource. [AUSNAHME - dokumentiert]
  • paperless-gpt verwendet PAPERLESS_API_TOKEN als Stack-ENV in apps/paperless-gpt/docker-compose.yml:15, taucht aber in docs/SECRETS_MAP.md nicht als eigener aktiver Secret-Eintrag auf.

Hinweise

  • Direkte Host-Ports sind nur bei dokumentierten Ausnahmen vorhanden:
    • [AUSNAHME - dokumentiert] traefik: 80:80, 443:443 in traefik/docker-compose.yml:30-32.
    • [AUSNAHME - dokumentiert] gitea: 222:22 in core/gitea/docker-compose.yml:17-18.
    • [AUSNAHME - dokumentiert] adguard: 53:53/tcp, 53:53/udp, 8082:80 in host-services/Adguard/docker-compose.yml:13-16.
    • [AUSNAHME - dokumentiert] influxdb3-core: ${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181 in ops/grafana-influxdb/docker-compose.yml:54-55.
  • backend_net wird in allen Compose-Dateien als external: true referenziert, z. B. infra/postgresql17/docker-compose.yml:25-26, infra/redis/docker-compose.yml:22-23, traefik/docker-compose.yml:59-60. Ob das externe Docker-Netz live wirklich internal: true ist, ist aus dem Repo allein nicht verifizierbar.
  • grafana_influx_lan hat bewusst kein internal: true: ops/grafana-influxdb/docker-compose.yml:88-89. [AUSNAHME - dokumentiert]
  • Mutable Tags sind mit Digests gepinnt, aber semantisch weiterhin mutable:
    • immich-server: release@sha256 in apps/immich/docker-compose.yml:4.
    • immich-machine-learning: release@sha256 in apps/immich/docker-compose.yml:35.
    • tailscale: stable@sha256 in host-services/tailscale/docker-compose.yml:3.
    • ddns-updater: latest@sha256 in infra/ddns-updater/docker-compose.yml:3.
    • komodo-core: Major-Tag 2@sha256 in ops/komodo/docker-compose.yml:36.
    • komodo-periphery: Major-Tag 2@sha256 in ops/komodo/docker-compose.yml:82.
    • uptime-kuma: Major-Tag 1@sha256 in ops/uptime-kuma/docker-compose.yml:3.
  • Reines image: name:latest ohne Digest wurde in produktiven Compose-Dateien nicht gefunden.
  • Alle Services haben restart: unless-stopped.
  • Alle Services haben security_opt: no-new-privileges:true.
  • [AUSNAHME - dokumentiert] scrutiny nutzt privileged: true in ops/scrutiny/docker-compose.yml:6.
  • [AUSNAHME - dokumentiert] tailscale nutzt network_mode: host in host-services/tailscale/docker-compose.yml:6.

Dokumentations-Abweichungen

  • Service-Namen in Compose vs. docs/SERVICE_CATALOG.md weichen bei Immich ab: Compose nutzt immich-server, immich-machine-learning, database, redis in apps/immich/docker-compose.yml:2, :33, :44, :53; der Katalog dokumentiert immich_server, immich_machine_learning, immich_postgres, immich_redis.
  • Service-Name in Compose vs. docs/SERVICE_CATALOG.md weicht bei Paperless ab: Compose nutzt paperless in apps/paperless/docker-compose.yml:2; der Katalog dokumentiert paperless-ngx.
  • Service-Name in Compose vs. docs/SERVICE_CATALOG.md weicht bei Redis ab: Compose nutzt redis in infra/redis/docker-compose.yml:2; der Katalog dokumentiert Redis.
  • Traefik-Host bei Hermes ist im Compose variabel: Host(${HERMES_DASHBOARD_HOST}) in ops/hermes-agent/docker-compose.yml:81; docs/REPO_MAP.md dokumentiert konkret hermes.kaleschke.info. Das ist plausibel, aber maschinell nicht eindeutig abgleichbar.
  • docs/REPO_MAP.md Volumes-Tabelle ist fuer mehrere Mounts nur zusammenfassend, nicht pfadgenau. Beispiele mit Compose-Pfaden, die dort nicht wortgleich auftauchen:
    • /mnt/user/appdata/unbound/config in apps/unbound/docker-compose.yml:7.
    • /mnt/user/appdata/ddns-updater in infra/ddns-updater/docker-compose.yml:17.
    • /mnt/user/appdata/filebrowser/database und /mnt/user/appdata/filebrowser/config in ops/filebrowser/docker-compose.yml:15-16.
    • /mnt/user/appdata/borg-ui/restore in ops/borg-ui/docker-compose.yml:27.
  • Netzwerke in Compose sind alle in docs/REPO_MAP.md aufgefuehrt.
  • Traefik-Hosts aus Compose sind in docs/REPO_MAP.md aufgefuehrt; einzige Besonderheit ist der variable Hermes-Host.
  • .example-Dateien haben passende Gegenspieler in .gitignore: .env, *.env, !*.env.example, **/stack.env, !**/stack.env.example.
  • Keine .keep-Platzhalter-Dateien gefunden.

Offene Architektur-Punkte: aktueller Stand

  • immich_redis: weiterhin kein named volume. Compose-Service redis in apps/immich/docker-compose.yml:44-50 hat aktuell gar keinen volumes:-Block. Architekturpunkt bleibt offen.
  • AdGuard Home: Admin-Port ist weiterhin direkt veroeffentlicht: 8082:80 in host-services/Adguard/docker-compose.yml:15; keine Traefik-Labels vorhanden. Block F bleibt offen.
  • filebrowser: Appdata-Breitmount ist entfernt; aktuelle Mounts sind /mnt/user/documents, /mnt/user/photos, /mnt/user/projekte plus eigene DB/Config in ops/filebrowser/docker-compose.yml:12-16. Langfristiges Hardening bleibt moeglich, aber der groesste alte Breitmount ist erledigt.
  • bentopdf: Compose ist vorhanden und Traefik-abgesichert in apps/bentopdf/docker-compose.yml:2-27. Runtime-Deploy und fachliche Abnahme koennen aus dem Repo allein nicht bestaetigt werden; Architekturpunkt bleibt als Live-Pruefung offen.
  • grafana und influxdb3-core: laufen weiterhin als user: "0" in ops/grafana-influxdb/docker-compose.yml:6 und ops/grafana-influxdb/docker-compose.yml:53. [AUSNAHME - dokumentiert]
  • plex-media-server: keine Compose-Datei im Repo gefunden; bleibt Dockerman-/Host-Sonderfall laut Architektur.

Bestanden

  • 30 produktive docker-compose.yml wurden geprueft.
  • Keine Datenbanken oder Caches im frontend_net: postgresql17 nur backend_net in infra/postgresql17/docker-compose.yml:18; shared redis nur backend_net in infra/redis/docker-compose.yml:15; mealie-postgres nur mealie_internal in apps/mealie/docker-compose.yml:56; Immich database und redis nur immich_default in apps/immich/docker-compose.yml:48 und :64; Nextcloud DB/Redis nur nextcloud_internal in apps/nextcloud/docker-compose.yml:61 und :73; komodo-mongo nur komodo_net in ops/komodo/docker-compose.yml:16.
  • App-interne Pflichtnetze sind korrekt internal: true: immich_default in apps/immich/docker-compose.yml:73-75, mealie_internal in apps/mealie/docker-compose.yml:66-68, nextcloud_internal in apps/nextcloud/docker-compose.yml:82-84, grafana_influx_internal in ops/grafana-influxdb/docker-compose.yml:90-91.
  • frontend_net und backend_net werden in Compose-Dateien als external: true referenziert.
  • Alle Services mit traefik.enable=true setzen explizit traefik.docker.network=frontend_net, entrypoints=websecure, tls=true und tls.certresolver=le.
  • Kein Traefik-Label mit yourdomain.tld gefunden.
  • Admin-/Ops-Router haben Middleware authelia@file,secure-headers@file, u. a. homepage in apps/homepage/docker-compose.yml:31, filebrowser in ops/filebrowser/docker-compose.yml:27, scrutiny in ops/scrutiny/docker-compose.yml:32, grafana in ops/grafana-influxdb/docker-compose.yml:46. [AUSNAHME - dokumentiert] komodo-core hat keine ForwardAuth-Middleware in ops/komodo/docker-compose.yml:64-71; [AUSNAHME - dokumentiert] nextcloud nutzt native Auth und nur Redirect-Middleware in apps/nextcloud/docker-compose.yml:42-46.
  • Web-UIs ohne Traefik-Labels wurden nur als dokumentierte Sonderfaelle gefunden: adguard mit LAN-Admin-Port in host-services/Adguard/docker-compose.yml:13-16; ddns-updater hat keine Web-UI und braucht Internet in infra/ddns-updater/docker-compose.yml:8; komodo-periphery ist Agent ohne Traefik-Route in ops/komodo/docker-compose.yml:81-103.