diff --git a/HOMELAB_ARCHITECTURE_MASTER_V2.md b/HOMELAB_ARCHITECTURE_MASTER_V2.md index 5486f2f..f9b723d 100644 --- a/HOMELAB_ARCHITECTURE_MASTER_V2.md +++ b/HOMELAB_ARCHITECTURE_MASTER_V2.md @@ -3,7 +3,7 @@ > **Single Source of Truth** für Docker-Netzwerkarchitektur, Sicherheitsregeln, Zielbild und Migration des Kallilabcore-Homelabs. > **Arbeitsregel für KI-Assistenten:** Dieses Dokument immer zuerst lesen, bevor Fragen zu Containern, Netzwerken, Traefik, Tailscale, Migration oder Security beantwortet werden. -**Stand:** 2026-04-15 | **Aktueller Schwerpunkt:** GitOps / Borg / Workflow-Konsolidierung +**Stand:** 2026-04-17 | **Aktueller Schwerpunkt:** GitOps / Doku-Synchronisierung / Reproduzierbare Deployments --- @@ -30,7 +30,7 @@ |---|---| | Host-OS | Unraid | | Hostname | Kallilabcore | -| Reverse Proxy | Traefik v3 (100% Docker-Labels, kein File-Provider) | +| Reverse Proxy | Traefik v3 (Service-Routing via Docker-Labels, File-Provider fuer Middlewares, TLS und Dashboards) | | VPN / Remote-Zugang | Tailscale (`tailscale`, host-Netz, Git-Stack) | | DNS-Stack | AdGuard Home (`dns_net` + `frontend_net`) → Unbound (`dns_net`) | | Basis-Domain | `kaleschke.info` | @@ -99,10 +99,10 @@ Internet traefik (80/443) │ └── frontend_net - ├── öffentliche Apps (vaultwarden, mealie, paperless, immich, gitea, ntfy, homepage) - ├── Admin-UIs mit Middleware (uptime-kuma, filebrowser, scrutiny, code-server, backrest, borg-ui) + ├── öffentliche Apps (vaultwarden, mealie, paperless, immich, gitea, ntfy, mail-archiver) + ├── geschützte UIs mit Middleware (homepage, paperless-gpt, uptime-kuma, filebrowser, scrutiny, code-server, backrest, borg-ui, glances, speedtest) ├── Admin-UI mit nativer Auth (komodo) - └── Hybrid-Dienste mit Internetbedarf (mail-archiver, ddns-updater) + └── Dienste mit Internetbedarf ohne öffentliche UI (ddns-updater) backend_net (internal: true) ├── postgresql17 @@ -137,7 +137,7 @@ Diese Dienste sind über echte `*.kaleschke.info`-Domains erreichbar: - `ntfy` — ntfy.kaleschke.info - `gitea` (Web) — git.kaleschke.info - `immich_server` — immich.kaleschke.info -- `homepage` — home.kaleschke.info +- `mail-archiver` — mail.kaleschke.info ### 4.2 Nicht öffentlich / nur Tailscale oder Traefik + Middleware Diese Dienste sind **keine Public Apps**: @@ -149,6 +149,10 @@ Diese Dienste sind **keine Public Apps**: - `code-server` — Traefik + Middleware - `backrest` — Traefik + Middleware - `borg-ui` — borg.kaleschke.info (Middleware) +- `homepage` — home.kaleschke.info (Middleware) +- `paperless-gpt` — paperless-gpt.kaleschke.info (Middleware) +- `glances` — glances.kaleschke.info (Middleware) +- `speedtest-tracker` — speedtest.kaleschke.info (Middleware) - `Traefik-Dashboard` - `AdGuard Home` — Port 3000 direkt (kein Traefik, nur LAN-Zugang) @@ -171,7 +175,7 @@ Wenn ein Dienst im `frontend_net` hängt, heißt das **nicht automatisch öffent 4. Secrets als Datei / `_FILE` oder Komodo Stack Environment Variables mit `${VAR}` 5. `no-new-privileges:true` ergänzen, wo praktikabel 6. `traefik.docker.network=frontend_net` immer explizit setzen -7. Admin-Dienste immer mit `dashboard-auth@file,secure-headers@file` +7. Admin- und interne Web-Dienste standardmaessig mit zentraler Middleware absichern (`authelia@file,secure-headers@file` oder dokumentierte Ausnahme) 8. Placeholder-Domains (`yourdomain.tld`) sind verboten 9. `privileged: true` nur mit Begründung 10. Volume-Mounts so klein und so read-only wie möglich @@ -221,20 +225,20 @@ Legende Status: | Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte | |---|---|---|---|---|---| -| `traefik` | ✅ | `frontend_net`, `backend_net` | öffentlich 80/443 | zentraler Ingress, 100% Docker-Labels | — | +| `traefik` | ✅ | `frontend_net`, `backend_net` | öffentlich 80/443 | zentraler Ingress, Service-Routing via Docker-Labels | — | | `AdGuard Home` | ✅ | `dns_net` (172.23.0.3), `frontend_net` | Port 53 DNS direkt, Port 3000 Admin (LAN) | DNS-Server + Upstream zu unbound; kein Traefik (DNS-Sonderfall) | Admin-Port per Traefik + Middleware absichern (Block F) | | `unbound` | ✅ | `dns_net` | intern | Upstream-Resolver für AdGuard, isoliert | — | | `ddns-updater` | ✅ | `frontend_net` | intern | Cloudflare DNS API; bleibt in `frontend_net` | Dokumentierte Ausnahme | | `tailscale` | ✅ | `host` | VPN-Zugang | Git-Stack (`host-services/tailscale/`) | `TS_USERSPACE`/`privileged` später prüfen | -| `backrest` | ✅ | `frontend_net`, `backend_net` | Traefik + Middleware | `traefik.docker.network=frontend_net` korrigiert | Breite Mounts straffen (Block F) | -| `homepage` | ✅ | `frontend_net` | Traefik | öffentliche Startseite via `home.kaleschke.info` | — | +| `backrest` | ✅ | `frontend_net`, `backend_net` | Traefik + Middleware | produktiver Backup-Admin-Dienst | breite Mounts bewusst dokumentieren | +| `homepage` | ✅ | `frontend_net` | Traefik + Middleware | geschuetztes Start-Dashboard via `home.kaleschke.info` | — | ### 7.2 Sicherheit / Identity | Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte | |---|---|---|---|---|---| | `vaultwarden` | ✅ | `frontend_net` | Traefik | kein Host-Port, `ADMIN_TOKEN_FILE` | — | -| `authelia` | 🔄 | `frontend_net`, `backend_net` | Traefik via `auth.kaleschke.info` | ForwardAuth-Provider, Secrets via `_FILE`, PostgreSQL + Redis Shared | NAS-seitige Einrichtung ausstehend (Secrets, DB, Users, DNS) | +| `authelia` | ✅ | `frontend_net`, `backend_net` | Traefik via `auth.kaleschke.info` | aktiver ForwardAuth-Provider, Secrets via `_FILE`, PostgreSQL + Redis Shared | — | ### 7.3 Datenbanken / Caches @@ -251,7 +255,7 @@ Legende Status: | Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte | |---|---|---|---|---|---| | `paperless-ngx` | ✅ | `frontend_net`, `backend_net` | Traefik | aktiv via `paperless.kaleschke.info` | — | -| `Paperless-AI` | ✅ | `frontend_net` | Traefik | aktiv | — | +| `mail-archiver` | ✅ | `frontend_net`, `backend_net` | Traefik | aktiv via `mail.kaleschke.info`; IMAP-Abruf + DB-Zugang | — | | `mealie` | ✅ | `frontend_net`, `mealie_mealie_internal` | Traefik | sauber getrennte App/DB-Struktur | — | | `ntfy` | ✅ | `frontend_net` | Traefik | aktiv via `ntfy.kaleschke.info`, Git-Stack | — | | `gitea` | ✅ | `frontend_net` | Traefik + SSH-Port 222 | Web via Traefik, SSH direkt gebunden | — | @@ -266,15 +270,17 @@ Legende Status: | `code-server` | ✅ | `frontend_net` | Traefik + Middleware | `PASSWORD_FILE` aktiv | — | | `PortainerCE` | ❌ entfernt | - | - | 2026-03-29 abgeschaltet | historisch; nicht mehr deployen | | `filebrowser` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `files.kaleschke.info` | Mounts einschränken (Block F) | -| `borg-ui` | 🔄 | `frontend_net` | Traefik + Middleware | Git-Stack für Borg/BorgBase-Backups; Borg UI bündelt Borg-CLI im Container | BorgBase-SSH-Key hinterlegen, erstes Repo initialisieren, Quell-Mounts bei Bedarf gezielt erweitern | -| `mail-archiver` | ✅ | `frontend_net`, `backend_net` | Traefik | aktiv via `mail.kaleschke.info`; IMAP-Abruf + DB-Zugang | — | +| `borg-ui` | ✅ | `frontend_net` | Traefik + Middleware | produktiver Borg-/Restore-Dienst; `/local/secrets` ist bewusst Teil des Restore-Scopes | BorgBase-Repo und Key laufend pflegen | +| `paperless-gpt` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `paperless-gpt.kaleschke.info` | — | ### 7.6 Monitoring / Status | Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte | |---|---|---|---|---|---| | `UptimeKuma` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `uptime.kaleschke.info` | — | +| `glances` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `glances.kaleschke.info` | — | | `scrutiny` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `scrutiny.kaleschke.info`, Git-Stack | `privileged` später prüfen | +| `speedtest-tracker` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `speedtest.kaleschke.info` | — | ### 7.7 Noch offene Sonderfälle @@ -295,7 +301,6 @@ Legende Status: | `Dozzle` | 2026-03-28 | nicht mehr aktiv | | `dashdot` | 2026-03-28 | nicht mehr aktiv | | `netdata` | 2026-03-28 | nicht mehr aktiv | -| `Glances` | 2026-03-28 | nicht mehr aktiv | | `netalertx` | 2026-03-28 | nicht mehr aktiv | | `luckyBackup` | 2026-03-28 | nicht mehr aktiv; Backup via backrest | | `Stash` | 2026-03-28 | nicht mehr aktiv | @@ -321,7 +326,7 @@ labels: ### Zusatz fuer Admin-Dienste (Standard) ```yaml - - traefik.http.routers..middlewares=dashboard-auth@file,secure-headers@file + - traefik.http.routers..middlewares=authelia@file,secure-headers@file ``` ### Regeln @@ -331,6 +336,7 @@ labels: - `tls=true` immer explizit setzen - wenn Traefik aktiv ist, werden direkte Host-Ports entfernt - Admin-Dienste standardmaessig nicht ohne Middleware veroeffentlichen +- `dashboard-auth@file` bleibt fuer das Traefik-Dashboard reserviert; dokumentierte Ausnahmen wie `Komodo` bleiben moeglich - **File-Provider nur noch für:** `middlewares.yml`, `tls.yml`, `dashboards.yml` — keine Service-Routen mehr via File-Provider - dokumentierte Ausnahmen muessen in Abschnitt 10 begruendet werden @@ -485,7 +491,7 @@ Host-Pfade in `env_file` (z.B. `/mnt/...`) sind in Git-Stacks nicht verfügbar. - `borg-ui` läuft als Admin-Dienst in `ops/borg-ui/docker-compose.yml` - nur `frontend_net`, weil Web-UI + externer SSH-Zugang zu BorgBase benötigt werden - keine direkten Host-Ports; Zugriff ausschließlich via Traefik + Middleware über `borg.kaleschke.info` -- Mounts bewusst klein gehalten: `/mnt/user/appdata` read-only als erste Backup-Quelle, separates Restore-Ziel unter `/mnt/user/appdata/borg-ui/restore` +- breite Restore-/Backup-Mounts bewusst gesetzt; inklusive `/local/secrets` fuer Disaster Recovery, separates Restore-Ziel unter `/mnt/user/appdata/borg-ui/restore` - kein separater Borg-CLI-Container nötig, da Borg UI die Borg-CLI bereits im Container mitbringt | Container | `_FILE` Support | @@ -494,9 +500,12 @@ Host-Pfade in `env_file` (z.B. `/mnt/...`) sind in Git-Stacks nicht verfügbar. | PostgreSQL | ✅ ja | | code-server | ✅ ja (`PASSWORD_FILE`) | | Immich Postgres | ✅ ja (`POSTGRES_PASSWORD_FILE`) | -| Mealie | ❌ nein → Stack ENV | +| Mealie | ✅ ja (`POSTGRES_PASSWORD_FILE`) | | paperless-ngx | ❌ nein für DB-Pass → Stack ENV | +### Reproduzierbare Deployments (2026-04-17) +Mutable Tags wie `latest`, `stable`, `release` oder reine Major-Tags wurden auf die **aktuell laufenden Digests** eingefroren. Das ist bewusst **kein Upgrade-Mechanismus**, sondern dient dazu, den heute funktionierenden Laufzeitstand exakt im Repo festzuhalten. Echte Versions-Upgrades bleiben ein eigener, geplanter Schritt. + ### ddns-updater — Netz-Ausnahme Bleibt bewusst in `frontend_net` statt `backend_net`, weil `backend_net` `internal: true` ist und ddns-updater die Cloudflare-API erreichen muss. @@ -516,4 +525,4 @@ Beispiel (Mealie): `mealie` → `frontend_net` + `mealie_mealie_internal`, `meal Dieses Dokument ist keine lose Notiz, sondern das **operative Masterdokument** für die Docker- und Zugriffsarchitektur des Homelabs. **Zielbild in einem Satz:** -`frontend_net` für alle Web-UIs und Dienste mit Internetbedarf, `backend_net` für interne Backends, app-interne Netze nur wenn technisch nötig, Tailscale für Remote-Admin-Zugriff, Traefik als einziger Web-Einstieg (100% Docker-Labels), Komodo als GitOps-Stack-Manager, AdGuard Home + Unbound für DNS, keine produktiven `bridge`-Container mehr. +`frontend_net` für Web-UIs und Dienste mit Internetbedarf, `backend_net` für interne Backends, app-interne Netze nur wenn technisch nötig, Tailscale für Remote-Admin-Zugriff, Traefik als einziger Web-Einstieg (Service-Routing via Docker-Labels, File-Provider nur für zentrale Dynamic-Config), Komodo als GitOps-Stack-Manager, AdGuard Home + Unbound für DNS, keine produktiven `bridge`-Container mehr. diff --git a/README.md b/README.md index 0776ecc..8f6af75 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Vor jeder Aenderung lesen: - Host: Unraid - Container: Docker Compose -- Reverse Proxy: Traefik v3 (100% Docker-Labels, kein File-Provider mehr) +- Reverse Proxy: Traefik v3 (Service-Routing via Docker-Labels, File-Provider nur fuer zentrale Dynamic-Config) - Zugriff: Tailscale (VPN) - DNS: AdGuard Home + Unbound - GitOps: Gitea + Komodo @@ -56,4 +56,5 @@ Vor jeder Aenderung lesen: - Portainer CE ist abgeschaltet und kein Teil des aktiven Betriebs mehr. - Homepage ist das aktive produktive Frontend / Start-Dashboard. - Traefik `dynamic/` bleibt eine dokumentierte manuelle Host-Sync-Ausnahme ausserhalb des normalen Komodo-Deployments. +- Mutable Image-Tags sind auf die aktuell laufenden Digests eingefroren; echte Versions-Upgrades erfolgen bewusst separat. - Der verbindliche Detailablauf steht in `docs/WORKFLOW.md`. diff --git a/docs/MIGRATION_LOG.md b/docs/MIGRATION_LOG.md index f79197d..c17d63d 100644 --- a/docs/MIGRATION_LOG.md +++ b/docs/MIGRATION_LOG.md @@ -10,6 +10,7 @@ Dieses Dokument ist nur noch ein historischer Verlauf. Der aktuelle operative Ab - Firefly, Firefly-Fints und Semaphore sind entfernt. - Borg UI ist produktiv, Dump-Automatisierung laeuft host-seitig und ein Restore-Smoke-Test wurde erfolgreich durchgefuehrt. - GitHub Desktop ist der bevorzugte lokale Workflow fuer `Fetch`, `Pull`, `Commit` und `Push`. +- Mutable Image-Tags sind auf die aktuell laufenden Digests eingefroren. --- @@ -40,6 +41,16 @@ Dieses Dokument ist nur noch ein historischer Verlauf. Der aktuelle operative Ab - Firefly, Firefly-Fints und Semaphore aus Repo und Homelab entfernt. - GitHub Desktop als Standard-Workflow fuer den lokalen Sync festgelegt. +### 2026-04-17 - Sicherheits- und Doku-Abgleich + +- `code-server` hinter `authelia@file,secure-headers@file` abgesichert. +- Redis von Klartext in der Compose auf Secret-Datei unter `/mnt/user/appdata/secrets/redis_password.txt` umgestellt. +- Redis-Passwort bewusst **nicht** rotiert; Live-Passwort bleibt vorerst unveraendert. +- `mail-archiver` in der Architektur-Doku an den realen Traefik-Betrieb angepasst. +- `paperless-gpt` von `LOG_LEVEL=debug` auf `info` umgestellt. +- `speedtest-tracker` von `APP_DEBUG=true` auf `false` umgestellt. +- Mutable Image-Tags fuer produktive Stacks auf die aktuell laufenden Digests eingefroren, um Deployments reproduzierbar zu machen. + --- ## Dauerhafte Learnings diff --git a/docs/SECRETS_MAP.md b/docs/SECRETS_MAP.md index 306f130..780d5dd 100644 --- a/docs/SECRETS_MAP.md +++ b/docs/SECRETS_MAP.md @@ -1,13 +1,14 @@ -# Secrets Map - Homelab +# Secrets Map - Homelab Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einbindungsart. ## Grundregeln - Secrets liegen **niemals im Git-Repository** -- Standardspeicherort: `/mnt/user/appdata/secrets/` +- Standardspeicherort ist `/mnt/user/appdata/secrets/` +- dokumentierte Ausnahmen mit dienstspezifischen Pfaden sind erlaubt - Berechtigungen: `chmod 600` -- Nutzung in Docker ueber `_FILE` Variablen oder Komodo Stack Environment Variables +- Nutzung in Docker ueber `_FILE`, direkte Secret-Datei-Mounts oder Komodo Stack Environment Variables --- @@ -15,16 +16,27 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb | Service | Secret | Datei / Methode | Status | |---|---|---|---| -| Vaultwarden | ADMIN_TOKEN | `vaultwarden_admin_token.txt` -> `ADMIN_TOKEN_FILE` | aktiv | -| PostgreSQL 17 | DB Password | `postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | -| Redis | Passwort | `redis_password.txt` -> Datei-Mount in `infra/redis/docker-compose.yml` | aktiv | -| Mealie | DB Password | Stack ENV `${MEALIE_DB_PASSWORD}` | aktiv | -| mealie-postgres | DB Password | Stack ENV `${POSTGRES_PASSWORD}` | aktiv | +| Vaultwarden | `ADMIN_TOKEN` | `/mnt/user/appdata/secrets/vaultwarden_admin_token.txt` -> `ADMIN_TOKEN_FILE` | aktiv | +| 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-postgres | DB Password | `/mnt/user/appdata/secrets/mealie_postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | | Paperless-ngx | DB Password | Stack ENV `${PAPERLESS_DBPASS}` | aktiv | -| code-server | Passwort | `code_server_password.txt` -> `PASSWORD_FILE` | aktiv | +| Paperless-ngx | Redis URL | Stack ENV `${PAPERLESS_REDIS}` | aktiv | +| code-server | Passwort | `/mnt/user/appdata/code-server/secrets/password` -> `PASSWORD_FILE` | aktiv | | Immich (server) | DB Password | Stack ENV `${IMMICH_DB_PASSWORD}` | aktiv | -| immich-postgres | DB Password | `immich_db.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | +| immich-postgres | DB Password | `/mnt/user/appdata/secrets/immich_postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | +| mail-archiver | DB Connection | Stack ENV `${MAILARCHIVER_DB_CONNECTION}` | aktiv | | mail-archiver | Auth Password | Stack ENV `${MAILARCHIVER_AUTH_PASSWORD}` | aktiv | +| Authelia | JWT Secret | `/mnt/user/appdata/secrets/authelia_jwt_secret.txt` -> `AUTHELIA_JWT_SECRET_FILE` | aktiv | +| Authelia | Session Secret | `/mnt/user/appdata/secrets/authelia_session_secret.txt` -> `AUTHELIA_SESSION_SECRET_FILE` | aktiv | +| Authelia | Storage Encryption Key | `/mnt/user/appdata/secrets/authelia_storage_encryption_key.txt` -> `AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE` | aktiv | +| Authelia | Postgres Password | `/mnt/user/appdata/secrets/authelia_postgres_password.txt` -> `AUTHELIA_STORAGE_POSTGRES_PASSWORD_FILE` | aktiv | +| Komodo Mongo | Root Password | `/mnt/user/appdata/secrets/komodo_mongo_password.txt` -> `MONGO_INITDB_ROOT_PASSWORD_FILE` | aktiv | +| Komodo Core | App Secrets | Stack ENV `${KOMODO_SECRET_KEY}`, `${KOMODO_JWT_SECRET}`, `${KOMODO_MONGO_PASSWORD}`, `${KOMODO_PERIPHERY_PASSKEY}` | aktiv | +| Homepage | API Tokens / Zugangsdaten | Stack ENV `HOMEPAGE_VAR_*` | aktiv | +| speedtest-tracker | App Key / Admin-Zugang | Stack ENV `${APP_KEY}`, `${ADMIN_PASSWORD}` | aktiv | | Borg UI / Borg | Admin-Login, `SECRET_KEY`, SSH-Keys, Repo-Credentials | persistent unter `/mnt/user/appdata/borg-ui/data/` | aktiv | --- @@ -42,16 +54,22 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb ```text /mnt/user/appdata/secrets/ -|-- vaultwarden_admin_token.txt +|-- authelia_jwt_secret.txt +|-- authelia_postgres_password.txt +|-- authelia_session_secret.txt +|-- authelia_storage_encryption_key.txt +|-- immich_postgres_password.txt +|-- komodo_mongo_password.txt +|-- mealie_postgres_password.txt |-- postgres_password.txt |-- redis_password.txt -|-- code_server_password.txt -`-- immich_db.txt +`-- vaultwarden_admin_token.txt ``` -Hinweise: +Weitere dokumentierte Secret-Pfade: -- Mealie, Paperless, mail-archiver und der Immich-Server nutzen Stack Environment Variables statt Datei-Mounts. +- `/mnt/user/appdata/code-server/secrets/password` +- `/mnt/user/appdata/traefik/secrets/cloudflare_dns_api_token` - Borg UI verwaltet Session-Secret, Admin-Login, SSH-Keys und Repo-Credentials in seiner persistenten `/data`-Struktur. Diese Daten liegen nicht im Git, muessen aber gesichert werden. --- diff --git a/docs/WORKFLOW.md b/docs/WORKFLOW.md index 48956e1..2252584 100644 --- a/docs/WORKFLOW.md +++ b/docs/WORKFLOW.md @@ -243,6 +243,15 @@ Diese Ausnahme bleibt bewusst bestehen. Der File-Provider wird weiterhin nur fue --- +## Image-Versionierung + +- Mutable Tags wie `latest`, `stable`, `release` oder reine Major-Tags werden nach Moeglichkeit auf den **aktuell laufenden Digest** gepinnt. +- Digest-Pinning friert den bekannten Laufzeitstand ein; es ist **kein** automatisches Upgrade. +- Echte Versions-Upgrades sind ein eigener, bewusster Aenderungsblock mit anschliessendem Test. +- Wenn der laufende Digest unbekannt ist, wird er zuerst am produktiven Container ausgelesen und erst danach im Repo festgeschrieben. + +--- + ## DNS-Regeln fuer Container Nicht alle Container koennen externe DNS-Namen aufloesen. Standardmaessig nutzt Docker `127.0.0.11` als internen DNS-Resolver. In bestimmten Netzwerk-Setups schlaegt externe Namensaufloesung damit fehl (`server misbehaving`). diff --git a/ops/borg-ui/BACKUP_SCOPE.md b/ops/borg-ui/BACKUP_SCOPE.md index 53ecdc3..4ac1f04 100644 --- a/ops/borg-ui/BACKUP_SCOPE.md +++ b/ops/borg-ui/BACKUP_SCOPE.md @@ -18,6 +18,8 @@ Do not back up raw live database storage directories as the primary recovery art 2. Borg backs up `/local/borg-dumps` plus the critical mounted paths below. 3. Borg retention handles history; the dump directory itself keeps only the latest artifacts. +The inclusion of `/local/secrets` is intentional: Borg is expected to cover disaster recovery for selected secret material as part of the current homelab restore strategy. + ## Service Inventory | Service | Recovery Method | What Borg Should Capture |