Harden code-server and move Redis password to secret file
Harden code-server and move Redis password to secret file
This commit is contained in:
@@ -60,7 +60,7 @@ Es gibt **keine künstlichen globalen Zusatznetze** wie `admin_net`, `monitoring
|
|||||||
Postgres, Redis und ähnliche Dienste laufen ausschließlich in `backend_net` oder einem eigenen internen Compose-Netz.
|
Postgres, Redis und ähnliche Dienste laufen ausschließlich in `backend_net` oder einem eigenen internen Compose-Netz.
|
||||||
|
|
||||||
### P4 — Admin-UIs sind nicht öffentlich
|
### P4 — Admin-UIs sind nicht öffentlich
|
||||||
Komodo, filebrowser, scrutiny, UptimeKuma, code-server, Traefik-Dashboard, backrest und borg-ui sind standardmäßig **Tailscale-only** oder hinter Traefik **mit zentraler Middleware** abgesichert.
|
filebrowser, scrutiny, UptimeKuma, code-server, Traefik-Dashboard, backrest und borg-ui sind standardmaessig **Tailscale-only** oder hinter Traefik **mit zentraler Middleware** abgesichert. `Komodo` ist die dokumentierte Ausnahme und bleibt bewusst bei nativer Authentifizierung ohne pauschal vorgeschaltete ForwardAuth-Middleware.
|
||||||
|
|
||||||
### P5 — Compose-first
|
### P5 — Compose-first
|
||||||
Alle produktiven Container werden als Compose verwaltet. Bestehende Dockerman-/Ad-hoc-Container werden schrittweise migriert.
|
Alle produktiven Container werden als Compose verwaltet. Bestehende Dockerman-/Ad-hoc-Container werden schrittweise migriert.
|
||||||
@@ -100,7 +100,8 @@ traefik (80/443)
|
|||||||
│
|
│
|
||||||
└── frontend_net
|
└── frontend_net
|
||||||
├── öffentliche Apps (vaultwarden, mealie, paperless, immich, gitea, ntfy, homepage)
|
├── öffentliche Apps (vaultwarden, mealie, paperless, immich, gitea, ntfy, homepage)
|
||||||
├── Admin-UIs mit Middleware (komodo, uptime-kuma, filebrowser, scrutiny, code-server, backrest, borg-ui)
|
├── Admin-UIs mit Middleware (uptime-kuma, filebrowser, scrutiny, code-server, backrest, borg-ui)
|
||||||
|
├── Admin-UI mit nativer Auth (komodo)
|
||||||
└── Hybrid-Dienste mit Internetbedarf (mail-archiver, ddns-updater)
|
└── Hybrid-Dienste mit Internetbedarf (mail-archiver, ddns-updater)
|
||||||
|
|
||||||
backend_net (internal: true)
|
backend_net (internal: true)
|
||||||
@@ -141,7 +142,7 @@ Diese Dienste sind über echte `*.kaleschke.info`-Domains erreichbar:
|
|||||||
### 4.2 Nicht öffentlich / nur Tailscale oder Traefik + Middleware
|
### 4.2 Nicht öffentlich / nur Tailscale oder Traefik + Middleware
|
||||||
Diese Dienste sind **keine Public Apps**:
|
Diese Dienste sind **keine Public Apps**:
|
||||||
|
|
||||||
- `Komodo` — komodo.kaleschke.info (Middleware)
|
- `Komodo` — komodo.kaleschke.info (Traefik, aber bewusst ohne zentrale Middleware; native Auth bleibt aktiv)
|
||||||
- `UptimeKuma` — uptime.kaleschke.info (Middleware)
|
- `UptimeKuma` — uptime.kaleschke.info (Middleware)
|
||||||
- `filebrowser` — files.kaleschke.info (Middleware)
|
- `filebrowser` — files.kaleschke.info (Middleware)
|
||||||
- `scrutiny` — scrutiny.kaleschke.info (Middleware)
|
- `scrutiny` — scrutiny.kaleschke.info (Middleware)
|
||||||
@@ -158,6 +159,8 @@ Wenn ein Dienst im `frontend_net` hängt, heißt das **nicht automatisch öffent
|
|||||||
- keine direkten Host-Ports bestehen
|
- keine direkten Host-Ports bestehen
|
||||||
- Zugriff durch Tailscale bzw. Auth begrenzt ist
|
- Zugriff durch Tailscale bzw. Auth begrenzt ist
|
||||||
|
|
||||||
|
`Komodo` ist hiervon die dokumentierte Ausnahme: Traefik ja, aber keine pauschale ForwardAuth-Middleware, damit Webhooks, API und Periphery-Kommunikation nicht versehentlich beeintraechtigt werden.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. Globale Sicherheitsregeln
|
## 5. Globale Sicherheitsregeln
|
||||||
@@ -259,7 +262,7 @@ Legende Status:
|
|||||||
|
|
||||||
| Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte |
|
| Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| `komodo` | ✅ | `frontend_net` | Traefik + Middleware | primärer GitOps-Stack-Manager | — |
|
| `komodo` | ✅ | `frontend_net` | Traefik, native Auth | primaerer GitOps-Stack-Manager | bewusste Ausnahme: keine pauschale ForwardAuth-Middleware vor UI/API/Webhooks/Periphery |
|
||||||
| `code-server` | ✅ | `frontend_net` | Traefik + Middleware | `PASSWORD_FILE` aktiv | — |
|
| `code-server` | ✅ | `frontend_net` | Traefik + Middleware | `PASSWORD_FILE` aktiv | — |
|
||||||
| `PortainerCE` | ❌ entfernt | - | - | 2026-03-29 abgeschaltet | historisch; nicht mehr deployen |
|
| `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) |
|
| `filebrowser` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `files.kaleschke.info` | Mounts einschränken (Block F) |
|
||||||
@@ -316,7 +319,7 @@ labels:
|
|||||||
- traefik.http.services.<name>.loadbalancer.server.port=<interner-port>
|
- traefik.http.services.<name>.loadbalancer.server.port=<interner-port>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Zusatz für Admin-Dienste
|
### Zusatz fuer Admin-Dienste (Standard)
|
||||||
```yaml
|
```yaml
|
||||||
- traefik.http.routers.<name>.middlewares=dashboard-auth@file,secure-headers@file
|
- traefik.http.routers.<name>.middlewares=dashboard-auth@file,secure-headers@file
|
||||||
```
|
```
|
||||||
@@ -327,8 +330,9 @@ labels:
|
|||||||
- certresolver immer `le`
|
- certresolver immer `le`
|
||||||
- `tls=true` immer explizit setzen
|
- `tls=true` immer explizit setzen
|
||||||
- wenn Traefik aktiv ist, werden direkte Host-Ports entfernt
|
- wenn Traefik aktiv ist, werden direkte Host-Ports entfernt
|
||||||
- Admin-Dienste niemals ohne Middleware veröffentlichen
|
- Admin-Dienste standardmaessig nicht ohne Middleware veroeffentlichen
|
||||||
- **File-Provider nur noch für:** `middlewares.yml`, `tls.yml`, `dashboards.yml` — keine Service-Routen mehr via File-Provider
|
- **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
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -361,9 +365,11 @@ Für den laufenden Betrieb gilt stattdessen:
|
|||||||
| `Plex-Media-Server` | `host` | Discovery / mDNS / Plex GDM |
|
| `Plex-Media-Server` | `host` | Discovery / mDNS / Plex GDM |
|
||||||
| `scrutiny` | `privileged: true` | SMART-Datenzugriff auf Laufwerke |
|
| `scrutiny` | `privileged: true` | SMART-Datenzugriff auf Laufwerke |
|
||||||
| `Komodo` | Docker-Socket Zugriff | Stack-Deployments benötigen Socket |
|
| `Komodo` | Docker-Socket Zugriff | Stack-Deployments benötigen Socket |
|
||||||
|
| `Komodo` | keine pauschale zentrale Middleware | Webhooks (`/listener`), API und Periphery-WebSocket (`/ws/periphery`) sollen nicht durch vorgeschaltete ForwardAuth gebrochen werden |
|
||||||
| `gitea` | SSH-Port 222 direkt gebunden | Git-SSH-Zugang; kein HTTP-Proxy für SSH möglich |
|
| `gitea` | SSH-Port 222 direkt gebunden | Git-SSH-Zugang; kein HTTP-Proxy für SSH möglich |
|
||||||
| `ddns-updater` | bleibt in `frontend_net` statt `backend_net` | braucht Cloudflare-API-Zugang; `backend_net` ist `internal: true` |
|
| `ddns-updater` | bleibt in `frontend_net` statt `backend_net` | braucht Cloudflare-API-Zugang; `backend_net` ist `internal: true` |
|
||||||
| `mail-archiver` | `frontend_net` + `backend_net` | braucht Internetzugang für IMAP-Abruf (GMX, Gmail) und DB-Zugang |
|
| `mail-archiver` | `frontend_net` + `backend_net` | braucht Internetzugang für IMAP-Abruf (GMX, Gmail) und DB-Zugang |
|
||||||
|
| `traefik/dynamic/*` | manueller Host-Sync trotz GitOps | File-Provider bleibt bewusst fuer `middlewares.yml`, `tls.yml` und `dashboards.yml`; Komodo deployed diese Dateien nicht automatisch |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -439,6 +445,8 @@ Komodo ist nun der primäre GitOps-Stack-Manager:
|
|||||||
|
|
||||||
**Betriebsregel:** Alle Stack-Änderungen laufen über Git; Komodo konsumiert nur den Stand aus Gitea.
|
**Betriebsregel:** Alle Stack-Änderungen laufen über Git; Komodo konsumiert nur den Stand aus Gitea.
|
||||||
|
|
||||||
|
**Zugangsregel:** Komodo bleibt bewusst bei nativer Authentifizierung ohne pauschal vorgeschaltete ForwardAuth-Middleware vor dem gesamten Router. Hintergrund sind die gemischten UI-, API-, Webhook- und Periphery-Endpunkte unter derselben Domain.
|
||||||
|
|
||||||
### AdGuard Home — Ablösung von Pi-hole (2026-03-28)
|
### AdGuard Home — Ablösung von Pi-hole (2026-03-28)
|
||||||
`binhex-official-pihole` wurde entfernt und durch `AdGuard Home` + `unbound` ersetzt:
|
`binhex-official-pihole` wurde entfernt und durch `AdGuard Home` + `unbound` ersetzt:
|
||||||
- AdGuard läuft als Git-Stack (`host-services/Adguard/docker-compose.yml`)
|
- AdGuard läuft als Git-Stack (`host-services/Adguard/docker-compose.yml`)
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ Vor jeder Aenderung lesen:
|
|||||||
## Status
|
## Status
|
||||||
|
|
||||||
- Komodo ist der primaere und einzige produktive Stack-Manager.
|
- Komodo ist der primaere und einzige produktive Stack-Manager.
|
||||||
|
- Komodo bleibt bewusst bei nativer Authentifizierung; zentrale Traefik-Auth wird dort nicht pauschal vorgeschaltet.
|
||||||
- Portainer CE ist abgeschaltet und kein Teil des aktiven Betriebs mehr.
|
- Portainer CE ist abgeschaltet und kein Teil des aktiven Betriebs mehr.
|
||||||
- Homepage ist das aktive produktive Frontend / Start-Dashboard.
|
- Homepage ist das aktive produktive Frontend / Start-Dashboard.
|
||||||
|
- Traefik `dynamic/` bleibt eine dokumentierte manuelle Host-Sync-Ausnahme ausserhalb des normalen Komodo-Deployments.
|
||||||
- Der verbindliche Detailablauf steht in `docs/WORKFLOW.md`.
|
- Der verbindliche Detailablauf steht in `docs/WORKFLOW.md`.
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| Vaultwarden | ADMIN_TOKEN | `vaultwarden_admin_token.txt` -> `ADMIN_TOKEN_FILE` | aktiv |
|
| Vaultwarden | ADMIN_TOKEN | `vaultwarden_admin_token.txt` -> `ADMIN_TOKEN_FILE` | aktiv |
|
||||||
| PostgreSQL 17 | DB Password | `postgres_password.txt` -> `POSTGRES_PASSWORD_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 | DB Password | Stack ENV `${MEALIE_DB_PASSWORD}` | aktiv |
|
||||||
| mealie-postgres | DB Password | Stack ENV `${POSTGRES_PASSWORD}` | aktiv |
|
| mealie-postgres | DB Password | Stack ENV `${POSTGRES_PASSWORD}` | aktiv |
|
||||||
| Paperless-ngx | DB Password | Stack ENV `${PAPERLESS_DBPASS}` | aktiv |
|
| Paperless-ngx | DB Password | Stack ENV `${PAPERLESS_DBPASS}` | aktiv |
|
||||||
@@ -43,6 +44,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb
|
|||||||
/mnt/user/appdata/secrets/
|
/mnt/user/appdata/secrets/
|
||||||
|-- vaultwarden_admin_token.txt
|
|-- vaultwarden_admin_token.txt
|
||||||
|-- postgres_password.txt
|
|-- postgres_password.txt
|
||||||
|
|-- redis_password.txt
|
||||||
|-- code_server_password.txt
|
|-- code_server_password.txt
|
||||||
`-- immich_db.txt
|
`-- immich_db.txt
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -112,6 +112,26 @@ Komodo ist in diesem Setup:
|
|||||||
- Pushes koennen automatisch einen Komodo-Deploy ausloesen
|
- Pushes koennen automatisch einen Komodo-Deploy ausloesen
|
||||||
- wenn Komodo und Git voneinander abweichen, gewinnt Git
|
- wenn Komodo und Git voneinander abweichen, gewinnt Git
|
||||||
|
|
||||||
|
### Ausnahme: Komodo-Zugangsmodell
|
||||||
|
|
||||||
|
Komodo bleibt **bewusst** ohne zentrale Traefik-ForwardAuth-Middleware.
|
||||||
|
|
||||||
|
Grund:
|
||||||
|
|
||||||
|
- Komodo hat eigene Authentifizierung
|
||||||
|
- Komodo nutzt REST- und WebSocket-Endpunkte
|
||||||
|
- Webhooks laufen ueber `/listener/...`
|
||||||
|
- Periphery nutzt den speziellen WebSocket-Pfad `/ws/periphery`
|
||||||
|
|
||||||
|
Deshalb wird Komodo aktuell nur ueber Traefik veroeffentlicht, aber **nicht** pauschal mit `authelia@file` vorgeschaltet.
|
||||||
|
|
||||||
|
**Regel:** Aenderungen an Komodo-Auth, Komodo-Routing oder vorgeschalteter Middleware nur nach expliziter Wirkungspruefung auf:
|
||||||
|
|
||||||
|
- UI-Login
|
||||||
|
- Gitea-Webhooks
|
||||||
|
- Periphery-Verbindung
|
||||||
|
- API-/Automationszugriffe
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Verbotene Arbeitsweise
|
## Verbotene Arbeitsweise
|
||||||
@@ -191,6 +211,8 @@ Manchmal ist ein Live-Hotfix noetig. Das ist erlaubt, aber nur unter diesen Bedi
|
|||||||
|
|
||||||
Komodo deployed ausschliesslich `docker-compose.yml`-Dateien. Die Traefik-Konfigurationsdateien unter `traefik/dynamic/` im Git-Repo werden **nicht** automatisch auf den Host uebertragen.
|
Komodo deployed ausschliesslich `docker-compose.yml`-Dateien. Die Traefik-Konfigurationsdateien unter `traefik/dynamic/` im Git-Repo werden **nicht** automatisch auf den Host uebertragen.
|
||||||
|
|
||||||
|
Diese Ausnahme bleibt bewusst bestehen. Der File-Provider wird weiterhin nur fuer zentrale Middlewares, TLS und Dashboard-Konfiguration genutzt, waehrend Service-Routing ueber Docker-Labels laeuft.
|
||||||
|
|
||||||
### Betroffene Dateien
|
### Betroffene Dateien
|
||||||
|
|
||||||
| Git-Pfad | Host-Pfad (NAS) |
|
| Git-Pfad | Host-Pfad (NAS) |
|
||||||
|
|||||||
@@ -3,15 +3,21 @@ services:
|
|||||||
image: redis:7-alpine
|
image: redis:7-alpine
|
||||||
container_name: Redis
|
container_name: Redis
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
command:
|
||||||
command: redis-server --appendonly yes --requirepass kuchen098765
|
- sh
|
||||||
|
- -c
|
||||||
|
- exec redis-server --appendonly yes --requirepass "$$(cat /run/secrets/redis_password)"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/user/appdata/redis:/data
|
- /mnt/user/appdata/redis:/data
|
||||||
|
- /mnt/user/appdata/secrets/redis_password.txt:/run/secrets/redis_password:ro
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
- backend_net
|
- backend_net
|
||||||
|
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
backend_net:
|
backend_net:
|
||||||
external: true
|
external: true
|
||||||
@@ -31,6 +31,7 @@ services:
|
|||||||
- traefik.http.routers.code-server.entrypoints=websecure
|
- traefik.http.routers.code-server.entrypoints=websecure
|
||||||
- traefik.http.routers.code-server.tls=true
|
- traefik.http.routers.code-server.tls=true
|
||||||
- traefik.http.routers.code-server.tls.certresolver=le
|
- traefik.http.routers.code-server.tls.certresolver=le
|
||||||
|
- traefik.http.routers.code-server.middlewares=authelia@file,secure-headers@file
|
||||||
- traefik.http.services.code-server.loadbalancer.server.port=8443
|
- traefik.http.services.code-server.loadbalancer.server.port=8443
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
Reference in New Issue
Block a user