From a9e62ee8e5d270fd3aafb3775df5ae6c7bc69163 Mon Sep 17 00:00:00 2001 From: Micha Date: Sat, 16 May 2026 07:43:46 +0200 Subject: [PATCH] Document restore exceptions and layout fixes --- apps/homepage/docker-compose.yml | 1 - apps/immich/docker-compose.yml | 2 +- apps/mealie/docker-compose.yml | 3 +-- docs/SECRETS_MAP.md | 2 +- docs/SERVICE_CATALOG.md | 6 +++--- docs/STORAGE_LAYOUT.draft.md | 3 +++ infra/ddns-updater/docker-compose.yml | 2 ++ ops/scrutiny/docker-compose.yml | 2 ++ ops/uptime-kuma/docker-compose.yml | 2 +- 9 files changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/homepage/docker-compose.yml b/apps/homepage/docker-compose.yml index b3a3374..fd30355 100644 --- a/apps/homepage/docker-compose.yml +++ b/apps/homepage/docker-compose.yml @@ -20,7 +20,6 @@ services: volumes: - /mnt/user/appdata/homepage:/app/config - /mnt/user/appdata/homepage/images:/app/public/images - - /var/run/docker.sock:/var/run/docker.sock:ro networks: - frontend_net labels: diff --git a/apps/immich/docker-compose.yml b/apps/immich/docker-compose.yml index b6c46f8..2862c0d 100644 --- a/apps/immich/docker-compose.yml +++ b/apps/immich/docker-compose.yml @@ -12,10 +12,10 @@ services: DB_PASSWORD: ${IMMICH_DB_PASSWORD} DB_DATABASE_NAME: immich REDIS_HOSTNAME: redis + TZ: Europe/Berlin volumes: - /mnt/user/photos/immich:/usr/src/app/upload - /mnt/user/photos/family_archive:/usr/src/app/external - - /etc/localtime:/etc/localtime:ro networks: - immich_default - frontend_net diff --git a/apps/mealie/docker-compose.yml b/apps/mealie/docker-compose.yml index 319758c..8aa1610 100644 --- a/apps/mealie/docker-compose.yml +++ b/apps/mealie/docker-compose.yml @@ -14,13 +14,12 @@ services: POSTGRES_SERVER: mealie-postgres POSTGRES_DB: mealie POSTGRES_USER: mealie - POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password + POSTGRES_PASSWORD: ${MEALIE_POSTGRES_PASSWORD} BASE_URL: https://mealie.kaleschke.info volumes: - /mnt/user/appdata/mealie/data:/app/data - - /mnt/user/appdata/secrets/mealie_postgres_password.txt:/run/secrets/postgres_password:ro networks: - frontend_net diff --git a/docs/SECRETS_MAP.md b/docs/SECRETS_MAP.md index 1e8ff8c..8e74520 100644 --- a/docs/SECRETS_MAP.md +++ b/docs/SECRETS_MAP.md @@ -20,7 +20,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb | Traefik | Cloudflare DNS API Token | `/mnt/user/appdata/traefik/secrets/cloudflare_dns_api_token` -> Docker Secret `cloudflare_dns_api_token` | aktiv | | PostgreSQL 17 | DB Password | `/mnt/user/appdata/secrets/postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | | Redis | Passwort | `/mnt/user/appdata/secrets/redis_password.txt` -> Datei-Mount + Startkommando in `infra/redis/docker-compose.yml` | aktiv | -| Mealie | DB Password | `/mnt/user/appdata/secrets/mealie_postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | +| Mealie | DB Password | `/mnt/user/appdata/secrets/mealie_postgres_password.txt` -> nicht versionierte Stack-`.env` `${MEALIE_POSTGRES_PASSWORD}` -> `POSTGRES_PASSWORD` | aktiv | | mealie-postgres | DB Password | `/mnt/user/appdata/secrets/mealie_postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | | Paperless-ngx | DB Password | Stack ENV `${PAPERLESS_DBPASS}` | aktiv | | Paperless-ngx | Redis URL | Stack ENV `${PAPERLESS_REDIS}` | aktiv | diff --git a/docs/SERVICE_CATALOG.md b/docs/SERVICE_CATALOG.md index b249950..9ea49cb 100644 --- a/docs/SERVICE_CATALOG.md +++ b/docs/SERVICE_CATALOG.md @@ -54,14 +54,14 @@ Secret-Werte sind nicht enthalten. Es werden nur Secret-Namen, Env-Key-Namen und | 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, Docker socket read-only, 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 | +| `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 | ja + Authelia | breite Mounts bewusst; `/local/secrets` im DR-Scope | | `uptime-kuma` | Monitoring / Uptime Checks | `ops/uptime-kuma/docker-compose.yml` | `https://uptime.kaleschke.info` | Traefik + Authelia | `/mnt/user/appdata/uptime-kuma` | Tier 3 | 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 | Rootfs und Docker-Socket Mounts | -| `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 | `privileged: true` dokumentierte Ausnahme | +| `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 | ja + Authelia | `APP_KEY`, `ADMIN_PASSWORD` Stack ENV | | `filebrowser` | Datei-Browser fuer Appdata | `ops/filebrowser/docker-compose.yml` | `https://files.kaleschke.info` | Traefik + Authelia | `/mnt/user/appdata/filebrowser/*`, breiter `/mnt/user/appdata` Mount | Tier 3 | ja + Authelia | Mounts langfristig einschraenken | | `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 | `PASSWORD_FILE`; Workspaces beachten | diff --git a/docs/STORAGE_LAYOUT.draft.md b/docs/STORAGE_LAYOUT.draft.md index 32b2304..3d3a949 100644 --- a/docs/STORAGE_LAYOUT.draft.md +++ b/docs/STORAGE_LAYOUT.draft.md @@ -291,6 +291,9 @@ Diese Regeln sind nicht optional. Verstoß ist Incident, kein Feature-Request. 11. **Kein produktiver Stack ohne dokumentierten Restore-Pfad in `docs/RESTORE_MATRIX.md`.** Idealerweise mit dokumentiertem Restore-Test (≤ 90 Tage alt); bei fehlendem Test mindestens schriftliche Restore-Schritte und Backup-Quelle. Stacks ohne diesen Eintrag laufen nicht produktiv — entweder dokumentieren oder abschalten. 12. **Kein Backup-Lauf ohne vorgeschalteten Posture-Check (siehe §11).** Backup auf kompromittiertem Filesystem überschreibt unter Umständen den letzten guten Stand und kontaminiert die Backup-Historie. +**Dokumentierte Host-Observability-Ausnahmen (Operator-Entscheidung 2026-05-16):** +`glances` und `scrutiny` duerfen gezielt Host-/Device-Bind-Mounts ausserhalb `/mnt/user/...` nutzen, weil ihre Kernfunktion sonst nicht erfuellbar ist. Erlaubt sind nur die in `docs/SERVICE_CATALOG.md` pro Dienst genannten Binds. Diese Ausnahmen sind keine Datenpersistenz-Pfade und duerfen nicht fuer Appdaten, Backups oder normale Service-Konfiguration erweitert werden. Neue oder geaenderte Host-Binds brauchen eine explizite Doku-Aenderung im selben Commit. + ## 13. Soft Rules — Konventionen Erwartet, aber begründbare Abweichungen sind dokumentiert. diff --git a/infra/ddns-updater/docker-compose.yml b/infra/ddns-updater/docker-compose.yml index 4c7b782..dd99352 100644 --- a/infra/ddns-updater/docker-compose.yml +++ b/infra/ddns-updater/docker-compose.yml @@ -3,6 +3,8 @@ services: image: ghcr.io/qdm12/ddns-updater:latest@sha256:ee16ab4f6203bf9e5b0925d38a0b4ebf2d9f23771f933cfb2f5a2dbd5f9a2f88 container_name: ddns-updater restart: unless-stopped + security_opt: + - no-new-privileges:true networks: - frontend_net environment: diff --git a/ops/scrutiny/docker-compose.yml b/ops/scrutiny/docker-compose.yml index fd5a36b..41ae907 100644 --- a/ops/scrutiny/docker-compose.yml +++ b/ops/scrutiny/docker-compose.yml @@ -18,6 +18,8 @@ services: - /dev/sdb:/dev/sdb - /dev/sdc:/dev/sdc - /dev/nvme0n1:/dev/nvme0n1 + security_opt: + - no-new-privileges:true networks: - frontend_net labels: diff --git a/ops/uptime-kuma/docker-compose.yml b/ops/uptime-kuma/docker-compose.yml index 1dda29d..6f5a79e 100644 --- a/ops/uptime-kuma/docker-compose.yml +++ b/ops/uptime-kuma/docker-compose.yml @@ -1,7 +1,7 @@ services: uptime-kuma: image: louislam/uptime-kuma:1@sha256:3d632903e6af34139a37f18055c4f1bfd9b7205ae1138f1e5e8940ddc1d176f9 - container_name: UptimeKuma + container_name: uptime-kuma restart: unless-stopped dns: - 8.8.8.8