diff --git a/HOMELAB_ARCHITECTURE_MASTER_V2.md b/HOMELAB_ARCHITECTURE_MASTER_V2.md index e42c321..8c4bba4 100644 --- a/HOMELAB_ARCHITECTURE_MASTER_V2.md +++ b/HOMELAB_ARCHITECTURE_MASTER_V2.md @@ -468,7 +468,7 @@ Update-Monitoring kann über Komodo's eingebaute Update-Notifications abgedeckt - Durchgeführt via: manuelles `docker stop` der Containers → `docker network rm immich_default` → Komodo Redeploy - Ergebnis: alle Immich-Container (`immich_postgres`, `immich_redis`, `immich_machine_learning`) sind jetzt vom Internet isoliert; nur `immich_server` hat zusätzlich `frontend_net` für Traefik -### Secrets in Komodo / Portainer Stacks +### Secrets in Komodo Stacks Host-Pfade in `env_file` (z.B. `/mnt/...`) sind in Git-Stacks nicht verfügbar. Standardlösung: Stack Environment Variables + `${VARIABLE_NAME}` in der Compose. **Regel:** Wenn `_FILE` nicht unterstützt wird → Stack Environment Variable. Kein Secret im Git. diff --git a/apps/dashboard/.env.example b/apps/dashboard/.env.example index bae12db..b66a190 100644 --- a/apps/dashboard/.env.example +++ b/apps/dashboard/.env.example @@ -12,9 +12,6 @@ CACHE_TTL_OVERVIEW_SECONDS=15 CACHE_TTL_SYSTEM_SECONDS=15 CACHE_TTL_SERVICES_SECONDS=15 CACHE_TTL_STORAGE_SECONDS=30 -BESZEL_BASE_URL=http://beszel:8090 -BESZEL_ADMIN_EMAIL= -BESZEL_ADMIN_PASSWORD= UPTIME_KUMA_BASE_URL=http://uptime-kuma:3001 UPTIME_KUMA_USERNAME= UPTIME_KUMA_PASSWORD= diff --git a/apps/dashboard/assets/js/renderers/quick-access.js b/apps/dashboard/assets/js/renderers/quick-access.js index 0625904..b505f9a 100644 --- a/apps/dashboard/assets/js/renderers/quick-access.js +++ b/apps/dashboard/assets/js/renderers/quick-access.js @@ -2,7 +2,6 @@ const QUICK_LINKS = [ { label: "Home Assistant", icon: "🏠", url: "https://ha.kaleschke.info" }, { label: "Komodo", icon: "🦎", url: "https://komodo.kaleschke.info" }, { label: "Uptime Kuma", icon: "📡", url: "https://uptime.kaleschke.info" }, - { label: "Beszel", icon: "📊", url: "https://beszel.kaleschke.info" }, { label: "Paperless", icon: "📄", url: "https://paperless.kaleschke.info" }, { label: "Mealie", icon: "🍽️", url: "https://mealie.kaleschke.info" }, { label: "Immich", icon: "🖼️", url: "https://immich.kaleschke.info" }, diff --git a/apps/dashboard/assets/js/state.js b/apps/dashboard/assets/js/state.js index 0c33af8..751c65c 100644 --- a/apps/dashboard/assets/js/state.js +++ b/apps/dashboard/assets/js/state.js @@ -23,7 +23,7 @@ const DEFAULT_DATA = { }, system: { generated_at: new Date().toISOString(), - source: { name: "beszel", status: "online", host_name: "nas", agent_name: "beszel-agent" }, + source: { name: "system", status: "online", host_name: "nas", agent_name: "not_configured" }, cpu: { usage_percent: 23, cores: 8, load_1: 0.8, load_5: 0.6, load_15: 0.5 }, memory: { used_gb: 12.4, total_gb: 32.0, available_gb: 19.6, usage_percent: 38.7 }, network: { primary_interface: "eth0", rx_mbps: 12.4, tx_mbps: 3.1 }, @@ -57,4 +57,4 @@ export function subscribe(fn) { _subscribers.push(fn); } export function updateData(partial) { _state = { ..._state, ...partial }; _subscribers.forEach((fn) => fn(_state)); -} \ No newline at end of file +} diff --git a/apps/dashboard/backend/app/models/sources.py b/apps/dashboard/backend/app/models/sources.py index 663b202..314fd3d 100644 --- a/apps/dashboard/backend/app/models/sources.py +++ b/apps/dashboard/backend/app/models/sources.py @@ -17,10 +17,10 @@ class BeszelDiskMetric(APIModel): class BeszelSystemSnapshot(APIModel): - source_name: str = "beszel" + source_name: str = "system" source_status: SourceStatus = "offline" host_name: str = "unknown" - agent_name: str = "beszel-agent" + agent_name: str = "not_configured" cpu_usage_percent: float = 0.0 cpu_cores: int = 0 load_1: float = 0.0 diff --git a/apps/dashboard/dashboard.html b/apps/dashboard/dashboard.html index df78b33..783dca3 100644 --- a/apps/dashboard/dashboard.html +++ b/apps/dashboard/dashboard.html @@ -633,7 +633,6 @@ .quick-tile-icon-ha { background: linear-gradient(135deg, #6cb8ff, #9e8dff); } .quick-tile-icon-komodo { background: linear-gradient(135deg, #00e2b3, #68c7ff); } .quick-tile-icon-kuma { background: linear-gradient(135deg, #00d98a, #7fffc7); } - .quick-tile-icon-beszel { background: linear-gradient(135deg, #53f1b4, #a9ffd8); } .quick-tile-icon-paperless { background: linear-gradient(135deg, #89ffdc, #46cfa0); } .quick-tile-icon-mealie { background: linear-gradient(135deg, #7ec2ff, #f6ff8c); } .quick-tile-icon-immich { background: linear-gradient(135deg, #ffd15c, #ff9d4d); } diff --git a/apps/dashboard/docker-compose.yml b/apps/dashboard/docker-compose.yml index ce881fc..87d17be 100644 --- a/apps/dashboard/docker-compose.yml +++ b/apps/dashboard/docker-compose.yml @@ -17,9 +17,6 @@ services: CACHE_TTL_SYSTEM_SECONDS: 15 CACHE_TTL_SERVICES_SECONDS: 15 CACHE_TTL_STORAGE_SECONDS: 30 - BESZEL_BASE_URL: http://beszel:8090 - BESZEL_ADMIN_EMAIL: ${BESZEL_ADMIN_EMAIL} - BESZEL_ADMIN_PASSWORD: ${BESZEL_ADMIN_PASSWORD} UPTIME_KUMA_BASE_URL: http://uptime-kuma:3001 UPTIME_KUMA_API_KEY: ${UPTIME_KUMA_API_KEY} UPTIME_KUMA_USERNAME: ${UPTIME_KUMA_USERNAME} diff --git a/docs/MIGRATION_LOG.md b/docs/MIGRATION_LOG.md index 54053e6..f79197d 100644 --- a/docs/MIGRATION_LOG.md +++ b/docs/MIGRATION_LOG.md @@ -1,127 +1,50 @@ -# Migration Log — Homelab GitOps +# Migration Log - Homelab GitOps -Dieses Dokument verfolgt den Fortschritt der Migration hin zu einem vollständigen GitOps-Setup (Gitea + Komodo). +Dieses Dokument ist nur noch ein historischer Verlauf. Der aktuelle operative Ablauf steht in `docs/WORKFLOW.md`, das Zielbild in `HOMELAB_ARCHITECTURE_MASTER_V2.md`. -## Status-Legende -- ⏳ = geplant -- 🔄 = in Bearbeitung -- ✅ = abgeschlossen -- ⚠️ = Problem / prüfen +## Aktueller Endstand + +- Gitea Online ist der verbindliche Sollzustand. +- Komodo ist der einzige produktive Stack-Manager. +- Portainer CE ist entfernt. +- 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`. --- -## Sprint 1 — Quick Wins + Vaultwarden ✅ +## Historische Meilensteine -| Service | Status | Ergebnis | -|---|---|---| -| Vaultwarden | ✅ | Git-Stack, Traefik, `ADMIN_TOKEN_FILE`, Port entfernt | -| PostgreSQL 17 | ✅ | `backend_net`, Port entfernt, `POSTGRES_PASSWORD_FILE` | +### 2026-03-28 - GitOps-Konsolidierung + +- Komodo als primaeren Stack-Manager eingefuehrt. +- Portainer aus dem Zielbild herausgenommen. +- Traefik auf 100% Docker-Labels konsolidiert. +- `diun` entfernt; Update-Monitoring wird ueber Komodo abgedeckt. + +### 2026-03-29 - Portainer abgeschaltet + +- Portainer CE aus dem produktiven Betrieb entfernt. +- Komodo als alleinigen Stack-Manager festgezogen. + +### 2026-04-13 bis 2026-04-15 - Borg-Rollout abgeschlossen + +- `critical_infra` erfolgreich nach Borg gesichert. +- Pre-Backup-Dumps host-seitig ueber Unraid User Scripts etabliert. +- Dump-Zielpfad auf `/mnt/user/backups/borg/dumps` umgestellt. +- Restore-Smoke-Test fuer `postgresql17-globals.sql` und `gitea.db` erfolgreich nachgewiesen. +- Monitoring fuer Borg ueber `ntfy` und Uptime Kuma eingerichtet. + +### 2026-04-15 - Repo- und Betriebsbereinigung + +- Firefly, Firefly-Fints und Semaphore aus Repo und Homelab entfernt. +- GitHub Desktop als Standard-Workflow fuer den lokalen Sync festgelegt. --- -## Sprint 2 — postgresql17 + diun/gotify ✅ +## Dauerhafte Learnings -| Service | Status | Ergebnis | -|---|---|---| -| postgresql17 | ✅ | Git-Stack abgeschlossen | -| gotify | ✅ | `GOTIFY_DEFAULTUSER_PASS_FILE`, Traefik aktiv | -| diun | ✅ | **Entfernt** (2026-03-28) — Update-Monitoring via Komodo | - ---- - -## Sprint 3 — mealie + mail-archiver ✅ - -| Service | Status | Ergebnis | -|---|---|---| -| mealie | ✅ | internes Netz (`mealie_internal`), Port entfernt, Traefik aktiv | -| mealie-postgres | ✅ | nur internes Netz, isoliert | -| mail-archiver | ✅ | `frontend_net` + `backend_net` (Hybrid), Portainer ENV | - ---- - -## Sprint 4 — Frontend-Stack + Traefik Cleanup + Komodo ✅ - -| Service | Status | Ergebnis | -|---|---|---| -| paperless-ngx | ✅ | Traefik aktiv, tls=true, Port entfernt | -| Paperless-AI | ✅ | Traefik aktiv | -| PortainerCE | ✅ | Traefik + Middleware, direkte Ports entfernt — **Legacy**, wird in Sprint 5 abgeschaltet | -| Dozzle | ✅ | Traefik + Middleware, direkte Ports entfernt | -| dashdot | ✅ | Traefik + Middleware, direkte Ports entfernt | -| scrutiny | ✅ | `frontend_net`, Traefik + Middleware, als Git-Stack migriert | -| filebrowser | ✅ | `frontend_net`, Traefik + Middleware, Port entfernt | -| gitea | ✅ | Traefik aktiv, SSH-Port 222 bleibt (dokumentierte Ausnahme) | -| UptimeKuma | ✅ | Traefik aktiv, Port entfernt, Middleware aktiv | -| backrest | ✅ | `traefik.docker.network=frontend_net` korrigiert (war `backend_net`) | -| **Komodo** | ✅ | **Eingeführt als primärer GitOps-Stack-Manager** | -| **Traefik File-Provider** | ✅ | `immich.yml`, `gitea.yml`, `mealie.yml`, `scrutiny.yml`, `vaultwarden.yml.bak` gelöscht — Traefik läuft jetzt 100% auf Docker-Labels | -| **immich Bad Gateway** | ✅ | Traefik nutzt jetzt `immich@docker` statt `immich@file` | - ---- - -## Sprint 5 — Compose-Migration Dockerman-Container 🔄 In Bearbeitung - -| Service | Status | Ziel | -|---|---|---| -| luckyBackup | ⏳ | `frontend_net`, Traefik, Middleware, Port entfernen | -| Stash | ⏳ | Compose-Migration | -| Tailscale-Docker | ⏳ | Compose-Migration, `host`-Netz bleibt (dokumentiert) | -| netdata | ⏳ | Compose-Migration, leere CLAIM-Vars entfernen | -| Plex-Media-Server | ⏳ | Compose-Migration, `host`-Netz bleibt (Discovery) | -| Pi-hole | ⏳ | zuletzt konsolidieren | -| **PortainerCE** | ⏳ | **abschalten** nach vollständiger Komodo-Übernahme | - ---- - -## Sprint 6 — Hardening / Secrets / Volumes ⏳ Offen - -| Aufgabe | Status | -|---|---| -| `immich_default` — `internal: true` setzen | ⏳ | -| `immich_redis` — anonymes Volume → named volume | ⏳ | -| `immich_server` — anonymes Volume prüfen | ⏳ | -| `backrest` — rw-Mount auf konkrete Pfade einschränken | ⏳ | -| `filebrowser` — Mount-Pfad einschränken | ⏳ | -| Redis — named volume | ⏳ | - ---- - -## Sprint 8 — Borg UI / BorgBase 🔄 In Bearbeitung - -| Service | Status | Ergebnis | -|---|---|---| -| Borg UI | 🔄 | Git-Stack unter `ops/borg-ui/` angelegt; Traefik + Middleware, keine Host-Ports, minimale Source-Mounts (`/mnt/user/appdata` read-only) | -| BorgBase-Anbindung | ⏳ | Nach Deploy: SSH-Key aus Borg UI in BorgBase hinterlegen, Repo anlegen, `repokey-blake2` initialisieren, Job/Schedule im UI setzen | - ---- - -## Wichtige Entscheidungen & Learnings - -### Komodo ersetzt Portainer (2026-03-28) -Komodo ist der primäre GitOps-Stack-Manager. Stacks werden via Gitea synchronisiert und über Komodo deployed. Portainer CE läuft noch als Legacy-UI. - -### Traefik File-Provider Cleanup (2026-03-28) -Statische File-Provider-Configs hatten `@file`-Routen, die mit `@docker`-Routen konkurrierten. In Traefik v3 gewinnt der File-Provider → Immich wurde auf falsche IP geroutet (Bad Gateway). Nach Löschen der statischen Configs läuft alles über Docker-Labels. - -### diun entfernt (2026-03-28) -Update-Monitoring kann über Komodo's eingebaute Update-Notifications abgedeckt werden. - -### Portainer + Git + env_file -Host-Pfade (`/mnt/...`) sind in Portainer/Komodo Git-Stacks nicht verfügbar → `env_file` ungeeignet. Lösung: Stack Environment Variables mit `${VARIABLE}` in der Compose. - -### `_FILE` Support ist nicht universell -| Container | `_FILE` Support | -|---|---| -| Vaultwarden | ✅ ja | -| PostgreSQL | ✅ ja | -| Gotify | ✅ ja | -| code-server | ✅ ja | -| Mealie | ❌ nein → Stack ENV | -| paperless-ngx | ❌ nein für DB-Pass → Stack ENV | - ---- - -## Notizen -- Keine Migration ohne Test -- Immer nur einen Service gleichzeitig -- Rollback muss jederzeit möglich sein +- Kein Live-Editing in Komodo; Git gewinnt immer gegen manuelle Drift. +- Webhooks koennen nach einem Push sofort einen Deploy ausloesen. +- Rollback soll bevorzugt ueber saubere Git-Commits und bekannte Good States erfolgen, nicht ueber History-Rewrites auf `master`. +- Doku soll Endzustaende beschreiben, nicht veraltete Zwischenstaende konservieren. diff --git a/docs/ROLLBACK.md b/docs/ROLLBACK.md index c0f3b7a..940e342 100644 --- a/docs/ROLLBACK.md +++ b/docs/ROLLBACK.md @@ -1,108 +1,102 @@ -# Rollback Guide — Homelab +# Rollback Guide - Homelab -Dieses Dokument beschreibt, wie Änderungen rückgängig gemacht werden können. +Dieses Dokument beschreibt den sicheren Rueckweg im aktuellen GitOps-Betrieb. --- ## Grundprinzip -Jede Änderung muss rückrollbar sein. +Rollback bedeutet in diesem Setup: + +- auf einen bekannten funktionierenden Git-Stand zurueckgehen +- den Zustand sauber nach Gitea bringen +- Komodo gezielt auf diesen Stand deployen lassen + +`master` wird dabei **nicht** per `push --force` umgeschrieben, solange es keinen ausdruecklich abgestimmten Ausnahmefall gibt. --- -## Standard-Rollback (Git) +## Standard-Rollback ueber Git -### Letzten Stand anzeigen -```bash -git log --oneline -``` +Bevorzugter Weg: -### Auf vorherigen Stand zurücksetzen -```bash -git reset --hard -git push --force -``` +1. den letzten funktionierenden Commit identifizieren +2. lokal einen sauberen Ruecknahme-Commit erzeugen (`git revert` oder gezielte Rueckaenderung) +3. nach Gitea pushen +4. Komodo-Deploy und Funktion pruefen + +Warum so: + +- die Historie bleibt nachvollziehbar +- Webhooks und Team-Workflow bleiben stabil +- es gibt keinen verdeckten History-Rewrite auf `master` --- -## Rollback über Komodo (primär) +## Rollback ueber Komodo -1. Stack in Komodo öffnen -2. „Redeploy" auswählen -3. vorherigen Commit im Gitea-Repo referenzieren -4. Deploy ausführen +Komodo ist der operative Deploy-Consumer, nicht die Quelle der Wahrheit. + +Vorgehen: + +1. Git-Stand in Gitea auf den gewuenschten Sollzustand bringen +2. betroffenen Stack in Komodo oeffnen +3. Redeploy auf Basis dieses Git-Stands ausloesen +4. Logs, Health und Erreichbarkeit pruefen + +Wichtig: + +- kein manuelles Ueberschreiben im Komodo-Web-Editor +- wenn Komodo und Git abweichen, gewinnt Git --- -## Rollback über Portainer (Legacy) +## Ausnahmefall: harter Git-Rollback -> ⚠️ Portainer CE ist in Ablösung durch Komodo (Sprint 5). Bis zur Abschaltung weiterhin nutzbar. +Ein `git reset --hard` mit anschliessendem erzwungenem Push auf `master` ist **kein Standardverfahren**. -1. Stack öffnen -2. „Redeploy" auswählen -3. vorherigen Commit verwenden (bei Git-Stacks) +Das kommt nur in Frage, wenn: + +- der Fall bewusst abgestimmt ist +- klar ist, welche Webhook-/Deploy-Seiteneffekte ausgeloest werden +- keine sauberere Ruecknahme ueber `git revert` mehr sinnvoll ist --- -## Container-Rollback +## Borg / Backup-bezogener Rollback -Wenn ein neuer Stack Probleme macht: +Bei Problemen mit Borg UI oder Dump-Automatisierung: -1. neuen Container stoppen -2. alten Container wieder starten -3. Logs prüfen - -### Borg UI / BorgBase - -Bei Problemen mit `ops/borg-ui/docker-compose.yml`: - -1. in Gitea auf den letzten funktionierenden Commit zurückgehen -2. Stack in Komodo auf diesen Commit redeployen -3. Persistenz unter `/mnt/user/appdata/borg-ui/` unverändert lassen -4. BorgBase-Repository nicht löschen; Remote-Archive bleiben davon unberührt -5. falls nötig, Restore zunächst aus `/mnt/user/appdata/borg-ui/restore/` testen statt direkt in Produktivpfade zurückzuschreiben +1. auf den letzten funktionierenden Git-Stand zurueckgehen +2. `borg-ui` ueber Komodo redeployen +3. Persistenz unter `/mnt/user/appdata/borg-ui/` und `/mnt/user/backups/borg/dumps/` nicht blind loeschen +4. Restore zuerst in einen Testpfad schreiben, nicht direkt in Produktivpfade --- -## Datenbank-Rollback +## Daten-Rollback -### Backup vorhanden (empfohlen über backrest) -Restore durchführen +Bevorzugte Quellen: + +- Borg-Restore +- erzeugte PostgreSQL-/MariaDB-Dumps +- bekannte Appdata-Snapshots + +Beispiele: -### Manuelle Sicherung ```bash cp -r /mnt/user/appdata/ /mnt/user/backup/ ``` -### PostgreSQL-Dump ```bash pg_dumpall > /mnt/user/backup/pg_dump_$(date +%Y%m%d).sql ``` --- -## Best Practices +## Betriebsregeln -- Immer nur **eine Änderung gleichzeitig** -- Vor jeder Änderung prüfen: - - läuft Backup? - - ist der aktuelle Zustand stabil? -- Nach jeder Änderung: - - Funktion testen - - Logs prüfen - - Migration im `MIGRATION_LOG.md` dokumentieren - ---- - -## Notfallregel - -Wenn etwas unklar ist: -- NICHT weiter ändern -- aktuellen Zustand analysieren -- gezielt und kontrolliert eingreifen - ---- - -## Ziel - -Rollback muss jederzeit möglich sein, ohne Datenverlust und ohne unnötige Downtime. +- immer nur eine aenderungsrelevante Massnahme gleichzeitig +- vor jedem Rollback pruefen, ob ein aktuelles Backup existiert +- nach jedem Rollback Funktion, Logs und Erreichbarkeit pruefen +- wenn etwas unklar ist: stoppen, Zustand analysieren, dann gezielt eingreifen diff --git a/docs/SECRETS_MAP.md b/docs/SECRETS_MAP.md index a938e71..500c24b 100644 --- a/docs/SECRETS_MAP.md +++ b/docs/SECRETS_MAP.md @@ -1,31 +1,39 @@ -# Secrets Map — Homelab +# Secrets Map - Homelab -Dieses Dokument listet alle sensiblen Daten (Passwörter, Tokens, Keys) und deren Speicherorte. +Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einbindungsart. ## Grundregeln + - Secrets liegen **niemals im Git-Repository** -- Speicherort: `/mnt/user/appdata/secrets/` +- Standardspeicherort: `/mnt/user/appdata/secrets/` - Berechtigungen: `chmod 600` -- Nutzung in Docker über `_FILE` Variablen oder Komodo/Portainer Stack Environment Variables +- Nutzung in Docker ueber `_FILE` Variablen oder Komodo Stack Environment Variables --- -## Übersicht +## Aktive Secrets | Service | Secret | Datei / Methode | Status | |---|---|---|---| -| Vaultwarden | ADMIN_TOKEN | `vaultwarden_admin_token.txt` → `ADMIN_TOKEN_FILE` | ✅ | -| PostgreSQL 17 | DB Password | `postgres_password.txt` → `POSTGRES_PASSWORD_FILE` | ✅ | -| Mealie | DB Password | Stack ENV `${MEALIE_DB_PASSWORD}` (kein `_FILE`-Support) | ✅ | -| mealie-postgres | DB Password | Stack ENV `${POSTGRES_PASSWORD}` | ✅ | -| Gotify | User Passwort | `gotify_password.txt` → `GOTIFY_DEFAULTUSER_PASS_FILE` | ✅ | -| Paperless-ngx | DB Password | Stack ENV `${PAPERLESS_DBPASS}` (kein `_FILE`-Support) | ✅ | -| code-server | Passwort | `code_server_password.txt` → `PASSWORD_FILE` | ✅ | -| Immich (server) | DB Password | Stack ENV `${IMMICH_DB_PASSWORD}` | ✅ | -| immich-postgres | DB Password | `immich_db.txt` → `POSTGRES_PASSWORD_FILE` | ✅ | -| mail-archiver | Auth Password | Stack ENV `${MAILARCHIVER_AUTH_PASSWORD}` | ✅ | -| Borg UI / BorgBase | Admin-Login, `SECRET_KEY`, SSH-Keys, Repo-Passphrasen | app-intern persistiert unter `/mnt/user/appdata/borg-ui/data/` (DB + SSH-Key-Verzeichnis), nicht im Git | 🔄 | -| ~~diun~~ | ~~Gotify Token~~ | ~~Stack ENV~~ | ❌ Container entfernt (2026-03-28) | +| Vaultwarden | ADMIN_TOKEN | `vaultwarden_admin_token.txt` -> `ADMIN_TOKEN_FILE` | aktiv | +| PostgreSQL 17 | DB Password | `postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | +| Mealie | DB Password | Stack ENV `${MEALIE_DB_PASSWORD}` | aktiv | +| mealie-postgres | DB Password | Stack ENV `${POSTGRES_PASSWORD}` | aktiv | +| Paperless-ngx | DB Password | Stack ENV `${PAPERLESS_DBPASS}` | aktiv | +| code-server | Passwort | `code_server_password.txt` -> `PASSWORD_FILE` | aktiv | +| Immich (server) | DB Password | Stack ENV `${IMMICH_DB_PASSWORD}` | aktiv | +| immich-postgres | DB Password | `immich_db.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | +| mail-archiver | Auth Password | Stack ENV `${MAILARCHIVER_AUTH_PASSWORD}` | aktiv | +| Borg UI / Borg | Admin-Login, `SECRET_KEY`, SSH-Keys, Repo-Credentials | persistent unter `/mnt/user/appdata/borg-ui/data/` | aktiv | + +--- + +## Historisch entfernte Secrets + +| Dienst | Frueherer Secret-Pfad / Mechanismus | Status | +|---|---|---| +| Gotify | `gotify_password.txt` / `GOTIFY_DEFAULTUSER_PASS_FILE` | Dienst nicht mehr aktiv | +| diun | Stack ENV | Container entfernt | --- @@ -33,20 +41,21 @@ Dieses Dokument listet alle sensiblen Daten (Passwörter, Tokens, Keys) und dere ```text /mnt/user/appdata/secrets/ -├── vaultwarden_admin_token.txt -├── postgres_password.txt -├── gotify_password.txt -├── code_server_password.txt -└── immich_db.txt +|-- vaultwarden_admin_token.txt +|-- postgres_password.txt +|-- code_server_password.txt +`-- immich_db.txt ``` -> **Hinweis:** Mealie, Paperless, mail-archiver und Immich-Server nutzen Stack Environment Variables statt Datei-Mounts, da `_FILE`-Support nicht vorhanden oder unzuverlässig ist. +Hinweise: -> **Hinweis zu Borg UI:** Die Anwendung erzeugt bzw. verwaltet ihr Session-Secret, den Admin-Login, SSH-Keys und Repo-Credentials in der persistenten `/data`-Struktur. Damit liegen keine Secrets im Git, aber die Sicherung von `/mnt/user/appdata/borg-ui/data/` ist für Restore und Disaster Recovery Pflicht. +- Mealie, Paperless, mail-archiver und der Immich-Server nutzen Stack Environment Variables statt Datei-Mounts. +- 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. --- ## Regel -Wenn `_FILE` nicht unterstützt wird → Stack Environment Variable in Komodo/Portainer verwenden. +Wenn `_FILE` nicht unterstuetzt wird -> Stack Environment Variable in Komodo verwenden. + Secrets niemals direkt in die Compose-Datei schreiben. diff --git a/ops/borg-ui/BACKUP_AUDIT_STATUS_QUO.md b/ops/borg-ui/BACKUP_AUDIT_STATUS_QUO.md index b77a944..0f18bbb 100644 --- a/ops/borg-ui/BACKUP_AUDIT_STATUS_QUO.md +++ b/ops/borg-ui/BACKUP_AUDIT_STATUS_QUO.md @@ -237,4 +237,3 @@ Wichtig: - Diese Änderung bleibt klein und risikoarm, weil nur Dump-Artefakte umziehen. - Die Live-App-Datenpfade bleiben davon unberührt. -- Test sync check via GitHub Desktop on 2026-04-15. diff --git a/security/authelia/configuration.yml b/security/authelia/configuration.yml index 844e9a5..0645972 100644 --- a/security/authelia/configuration.yml +++ b/security/authelia/configuration.yml @@ -1,5 +1,5 @@ ---- -# Authelia configuration — Template +--- +# Authelia configuration - Template # Deploy to: /mnt/user/appdata/authelia/config/configuration.yml # Docs: https://www.authelia.com/configuration/ # WICHTIG: Diese Datei NICHT in Git committen wenn user-spezifische Daten enthalten! @@ -30,7 +30,7 @@ access_control: - domain: auth.kaleschke.info policy: bypass - # Oeffentliche Apps — kein Login noetig + # Oeffentliche Apps - kein Login noetig - domain: - immich.kaleschke.info - paperless.kaleschke.info @@ -41,7 +41,7 @@ access_control: - homepage.kaleschke.info policy: bypass - # Admin-Dienste — 2FA erforderlich + # Admin-Dienste - 2FA erforderlich - domain: - komodo.kaleschke.info - uptime.kaleschke.info @@ -49,11 +49,7 @@ access_control: - scrutiny.kaleschke.info policy: two_factor - # Beszel → OIDC-Login (kein ForwardAuth) - - domain: beszel.kaleschke.info - policy: bypass - - # Alles andere — 1FA + # Alles andere - 1FA - domain: "*.kaleschke.info" policy: one_factor @@ -83,7 +79,7 @@ notifier: disable_startup_check: false filesystem: filename: /config/notifications.log - # SMTP (fuer 2FA-Codes per Mail — optional, empfohlen fuer Produktion): + # SMTP (fuer 2FA-Codes per Mail - optional, empfohlen fuer Produktion): # smtp: # address: smtp://smtp.example.com:587 # username: user@example.com @@ -95,25 +91,3 @@ totp: issuer: kaleschke.info period: 30 skew: 1 - -identity_providers: - oidc: - clients: - - client_id: 'beszel' - client_name: 'Beszel' - client_secret: '$argon2id$v=19$m=65536,t=3,p=4$bXTt49iW61s0c8/ZiBlguw$VquorRqL134mjQ6Qa13JY6AI/QCwdk7g1jpc/UtRZPQ' - public: false - authorization_policy: 'two_factor' - require_pkce: true - pkce_challenge_method: 'S256' - redirect_uris: - - 'https://beszel.kaleschke.info/api/oauth2-redirect' - scopes: - - 'openid' - - 'email' - - 'profile' - response_types: - - 'code' - grant_types: - - 'authorization_code' - token_endpoint_auth_method: 'client_secret_basic'