12 KiB
Secrets Map - Homelab
Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einbindungsart.
Grundregeln
- Secrets liegen niemals im Git-Repository
- Standardspeicherort ist
/mnt/user/appdata/secrets/ - dokumentierte Ausnahmen mit dienstspezifischen Pfaden sind erlaubt
- Berechtigungen:
chmod 600 - Nutzung in Docker ueber
_FILE, direkte Secret-Datei-Mounts oder Komodo Stack Environment Variables
Aktive Secrets
| Service | Secret | Datei / Methode | Status |
|---|---|---|---|
| Vaultwarden | ADMIN_TOKEN |
/mnt/user/appdata/secrets/vaultwarden_admin_token.txt -> ADMIN_TOKEN_FILE |
aktiv |
| Vaultwarden | SMTP Password | /mnt/user/appdata/secrets/homelab_smtp_password.txt -> SMTP_PASSWORD_FILE fuer Einladungen/Benachrichtigungen |
aktiv |
| Traefik | Cloudflare DNS API Token | /mnt/user/appdata/traefik/secrets/cloudflare_dns_api_token -> Docker Secret cloudflare_dns_api_token |
aktiv |
| PostgreSQL 18 | 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 -> 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 |
| code-server | Passwort | /mnt/user/appdata/code-server/secrets/password -> FILE__PASSWORD |
aktiv |
| Filebrowser | Admin Password | /mnt/user/appdata/secrets/filebrowser_admin_password.txt -> initialisierte SQLite-DB |
aktiv |
| Immich (server) | DB Password | Stack ENV ${IMMICH_DB_PASSWORD} |
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 | SMTP Password | /mnt/user/appdata/secrets/authelia_smtp_password.txt -> Host-Secret fuer SMTP-Notifier |
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_WEBHOOK_SECRET}, ${KOMODO_JWT_SECRET}, ${KOMODO_MONGO_PASSWORD}, ${KOMODO_PERIPHERY_PASSKEY} |
aktiv |
| Gitea Push Mirror | GitHub fine-grained PAT fuer michaelkaleschke-spec/homelab-infra |
Gitea Repository Mirror Settings, persistent in /mnt/user/services/gitea/data; kein Datei-Secret im Repo |
aktiv |
| Glance | Community Widget API Tokens | Stack ENV ${GLANCE_IMMICH_API_KEY}, ${GLANCE_ADGUARD_USERNAME}, ${GLANCE_ADGUARD_PASSWORD}, ${GLANCE_SPEEDTEST_API_KEY} |
aktiv |
| speedtest-tracker | App Key / Admin-Zugang | Stack ENV ${APP_KEY}, ${ADMIN_PASSWORD} |
aktiv |
| Nextcloud | Admin User | /mnt/user/appdata/secrets/nextcloud_admin_user.txt -> NEXTCLOUD_ADMIN_USER_FILE |
neu |
| Nextcloud | Admin Password | /mnt/user/appdata/secrets/nextcloud_admin_password.txt -> NEXTCLOUD_ADMIN_PASSWORD_FILE |
neu |
| nextcloud-postgres | DB Password | /mnt/user/appdata/secrets/nextcloud_postgres_password.txt -> POSTGRES_PASSWORD_FILE |
neu |
| Borg UI / Borg | Admin-Login, SECRET_KEY, SSH-Keys, Repo-Credentials |
persistent unter /mnt/user/appdata/borg-ui/data/ |
aktiv |
| Borg Repo | Borg-Passphrase fuer Restore-Tests und Notfallzugriff | /mnt/user/appdata/secrets/borg_repo_passphrase.txt -> Host-Secret-Datei, nicht im Repo |
aktiv |
| Unraid Flash Backup | Boot-/Array-/Share-/Plugin-Konfiguration, ggf. Hashes/Keys/Templates | /mnt/user/backups/borg/dumps/latest/unraid-flash-config.tar.gz, via Borg/Hetzner gesichert |
aktiv; wie Secret-Material behandeln |
| Hermes Agent | Provider-Keys, Bot-Tokens, API-Server-Key | /mnt/user/appdata/hermes-agent/data/.env |
VM-seitig offen |
| Hermes Agent | SSH-Runner Private Key | /mnt/user/appdata/secrets/hermes_runner_id_ed25519 -> /root/.ssh/id_ed25519 |
VM-seitig offen |
| InfluxDB 3 Core | Admin Token JSON | /mnt/user/appdata/secrets/influxdb3_admin_token.json -> Docker Secret /run/secrets/influxdb3_admin_token |
aktiv |
| Monitoring Grafana | Admin Password | /mnt/user/appdata/secrets/monitoring_grafana_admin_password.txt -> Docker Secret /run/secrets/monitoring_grafana_admin_password -> GF_SECURITY_ADMIN_PASSWORD__FILE |
aktiv |
| Monitoring Grafana -> InfluxDB | Datasource Token | /mnt/user/appdata/secrets/monitoring_grafana_influxdb_token.txt -> Docker Secret /run/secrets/monitoring_grafana_influxdb_token |
aktiv |
| Home Assistant -> InfluxDB | HA InfluxDB Token | /homeassistant/secrets.yaml -> influxdb3_homeassistant_token |
geplant |
| Renovate Bot | Gitea Service-Account PAT | /mnt/user/appdata/secrets/renovate_token.txt -> Host-Datei (chmod 600), gelesen von ops/renovate/run-renovate.sh und an Renovate-Container als RENOVATE_TOKEN weitergegeben |
aktiv nach Operator-Setup (siehe docs/RENOVATE.md) |
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 |
| Uptime Kuma | uptime_kuma_admin_password.txt |
Dienst am 2026-05-25 entfernt; nur fuer Alt-Appdata/Archiv behalten |
| Grafana Altstand | grafana_admin_password.txt, grafana_influxdb_token.txt |
Compose-Pfad aus aktivem Repo entfernt; nur fuer Git-Historie-/Rollback-Fall behalten |
Pfadstruktur
/mnt/user/appdata/secrets/
|-- authelia_jwt_secret.txt
|-- authelia_postgres_password.txt
|-- authelia_session_secret.txt
|-- authelia_smtp_password.txt
|-- authelia_storage_encryption_key.txt
|-- immich_postgres_password.txt
|-- komodo_mongo_password.txt
|-- mealie_postgres_password.txt
|-- monitoring_grafana_admin_password.txt
|-- monitoring_grafana_influxdb_token.txt
|-- nextcloud_admin_password.txt
|-- nextcloud_admin_user.txt
|-- nextcloud_postgres_password.txt
|-- postgres_password.txt
|-- redis_password.txt
|-- borg_repo_passphrase.txt
|-- influxdb3_admin_token.json
|-- filebrowser_admin_password.txt
|-- homelab_smtp_password.txt
`-- vaultwarden_admin_token.txt
Weitere dokumentierte Secret-Pfade:
/mnt/user/appdata/code-server/secrets/password/mnt/user/appdata/secrets/hermes_runner_id_ed25519/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. - Die Borg-Repo-Passphrase liegt zusaetzlich als Host-Secret-Datei fuer Restore-Tests und Notfallzugriff vor. Der Wert ist laut Operator-Bestaetigung vom 2026-05-26 offline gesichert; Ablageort und Wert werden nicht im Repo dokumentiert.
- Gitea verwaltet den GitHub-Push-Mirror-PAT in den Repository-Mirror-Settings. Der Wert wird nicht dokumentiert und nicht in Dateien unter
docs/odercore/gitea/geschrieben. paperless-ngxist eine bewusste Ausnahme: DB-Passwort und Redis-URL bleiben aktuell als Komodo Stack Environment Variables hinterlegt, um den stabil laufenden Produktionsstand nicht fuer eine reine Secret-Mechanik-Migration zu riskieren.
Stack-ENV-only Secrets - Restore-Wege
Einige Secrets liegen bewusst nur als Komodo Stack Environment Variables vor, weil das Image kein _FILE unterstuetzt oder ein laufender stabiler Produktionsstand nicht fuer eine reine Mechanik-Migration geopfert werden soll. Diese Werte existieren ausschliesslich an folgenden Stellen:
- Komodo Mongo (Runtime und Backup-Dump
komodo-mongo.archive.gzunter/mnt/user/backups/borg/dumps/latest/). - Externe Operator-Notiz (analoge Sicherung, vergleichbar mit der Borg-Passphrase).
Bei Komodo-Restore aus kaltem Zustand wird immer in dieser Reihenfolge gesucht. Konkrete Werte werden im Repo, in Logs, in Doku-Kommentaren und in ntfy-Meldungen niemals wiedergegeben.
Stacks und ihre Stack-ENV-only Secrets
| Stack | Stack-ENV-Variablen | Restore-Quelle (Reihenfolge) | Folgen bei Verlust aller Quellen |
|---|---|---|---|
paperless-ngx |
PAPERLESS_DBPASS, PAPERLESS_REDIS |
Komodo-Mongo-Dump -> Vaultwarden -> externe Notiz | App-DB ist im Postgres-Cluster, Passwort muss in Postgres und Stack-ENV synchron neu gesetzt werden; Redis-URL ist deterministisch rekonstruierbar (Host, Port, Passwort), wenn Redis-Passwort-Datei vorliegt |
immich-server |
IMMICH_DB_PASSWORD |
Komodo-Mongo-Dump -> Vaultwarden -> externe Notiz | analog Paperless: Postgres-User-Passwort in immich_postgres und Stack-ENV gemeinsam zuruecksetzen |
mail-archiver |
MAILARCHIVER_DB_CONNECTION, MAILARCHIVER_AUTH_PASSWORD |
Komodo-Mongo-Dump -> Vaultwarden -> externe Notiz | DB-Connection-String enthaelt Postgres-Pass; App-Auth-Password fuer Web-UI |
speedtest-tracker |
APP_KEY, ADMIN_PASSWORD |
Komodo-Mongo-Dump -> Vaultwarden -> externe Notiz | APP_KEY ist verschluesselungsrelevant; bei echtem Verlust App-State frisch initialisieren |
komodo-core |
KOMODO_SECRET_KEY, KOMODO_WEBHOOK_SECRET, KOMODO_JWT_SECRET, KOMODO_MONGO_PASSWORD, KOMODO_PERIPHERY_PASSKEY |
Vaultwarden -> externe Notiz (Henne-Ei: Komodo-Mongo-Dump ist hier nicht Restore-Quelle, weil Komodo dafuer schon laufen muesste) | siehe docs/SERVICES_RECOVERY.md Komodo-Bootstrap; ohne diese Werte ist der Self-Stack nicht reproduzierbar |
hermes-agent |
HERMES_DASHBOARD_HOST plus Provider-/API-/Home-Assistant-Tokens in Host-.env |
Vaultwarden -> externe Notiz | Stack ist aktuell geparkt (Review 2026-07-25); ohne Werte bleibt der Stack deaktiviert, kein Schaden am Rest |
glance |
GLANCE_IMMICH_API_KEY, GLANCE_ADGUARD_USERNAME, GLANCE_ADGUARD_PASSWORD, GLANCE_SPEEDTEST_API_KEY |
Provider-UIs (Immich, AdGuard, Speedtest-Tracker) neu erzeugen | rebuildbar; Widgets bleiben leer bis Tokens neu erzeugt sind, kein kritischer Datentopf |
Komodo-Sonderfall
Komodos eigene Secrets (KOMODO_*) sind die kritischste Untermenge dieser Liste, weil sie nicht aus dem eigenen Mongo-Dump rekonstruierbar sind, solange Komodo nicht laeuft. Sie gehoeren entweder
- in Vaultwarden (sobald Vaultwarden produktiv ist) und
- in eine analoge Operator-Notiz neben der Borg-Passphrase.
Details und Bootstrap-Reihenfolge stehen in docs/SERVICES_RECOVERY.md und werden in docs/DISASTER_RECOVERY.md Abschnitt 6.2.1 als Pflicht-Pruefung vor Phase 4 Stufe 4 referenziert.
Regel
Wenn _FILE nicht unterstuetzt wird -> Stack Environment Variable in Komodo verwenden.
Secrets niemals direkt in die Compose-Datei schreiben.
Stack-ENV-Werte niemals im Repo, in Logs oder in Doku-Kommentaren ablegen — nur Variablennamen und Restore-Quellen.