HOMELAB_ARCHITECTURE_MASTER_V2.md aktualisiert
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
> **Single Source of Truth** für Docker-Netzwerkarchitektur, Sicherheitsregeln, Zielbild und Migration des Kallilabcore-Homelabs.
|
> **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.
|
> **Arbeitsregel für KI-Assistenten:** Dieses Dokument immer zuerst lesen, bevor Fragen zu Containern, Netzwerken, Traefik, Tailscale, Migration oder Security beantwortet werden.
|
||||||
|
|
||||||
**Stand:** 2026-03-28 | **Aktueller Sprint:** 5 (Plex-Migration + PortainerCE abschalten) — Sprints 1–4 abgeschlossen
|
**Stand:** 2026-03-29 | **Aktueller Sprint:** 5 (Plex-Migration + PortainerCE abschalten) — Sprints 1–4 abgeschlossen
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -88,11 +88,10 @@ Jeder produktive Container nutzt `restart: unless-stopped`, außer eine Ausnahme
|
|||||||
| `backend_net` | bridge, `internal: true` | interne App-/DB-/Cache-Kommunikation | Standard |
|
| `backend_net` | bridge, `internal: true` | interne App-/DB-/Cache-Kommunikation | Standard |
|
||||||
| `dns_net` | bridge | Resolver-Schicht: AdGuard Home + Unbound | bleibt |
|
| `dns_net` | bridge | Resolver-Schicht: AdGuard Home + Unbound | bleibt |
|
||||||
| `mealie_mealie_internal` | bridge, `internal: true` | internes Netz nur für `mealie` + `mealie-postgres` | ✅ umgesetzt |
|
| `mealie_mealie_internal` | bridge, `internal: true` | internes Netz nur für `mealie` + `mealie-postgres` | ✅ umgesetzt |
|
||||||
| `immich_default` | Compose-intern | internes Immich-Netz | ⏳ `internal: true` noch setzen |
|
| `immich_default` | Compose-intern, `internal: true` | internes Immich-Netz | ✅ umgesetzt |
|
||||||
| `host` | host | nur für echte Sonderfälle | begründet |
|
| `host` | host | nur für echte Sonderfälle | begründet |
|
||||||
|
|
||||||
### 3.2 Finales Diagramm (vereinfacht)
|
### 3.2 Finales Diagramm (vereinfacht)
|
||||||
|
|
||||||
```text
|
```text
|
||||||
Internet
|
Internet
|
||||||
│
|
│
|
||||||
@@ -116,7 +115,7 @@ dns_net
|
|||||||
|
|
||||||
App-interne Netze
|
App-interne Netze
|
||||||
├── mealie_mealie_internal (internal: true) ✅
|
├── mealie_mealie_internal (internal: true) ✅
|
||||||
└── immich_default (internal: true ausstehend) ⏳
|
└── immich_default (internal: true) ✅
|
||||||
|
|
||||||
Host-Sonderfälle
|
Host-Sonderfälle
|
||||||
├── tailscale
|
├── tailscale
|
||||||
@@ -240,7 +239,7 @@ Legende Status:
|
|||||||
| `postgresql17` | ✅ | `backend_net` | intern | kein Host-Port, `POSTGRES_PASSWORD_FILE` | — |
|
| `postgresql17` | ✅ | `backend_net` | intern | kein Host-Port, `POSTGRES_PASSWORD_FILE` | — |
|
||||||
| `Redis` | ✅ | `backend_net` | intern | intern-only Cache | optional named volume |
|
| `Redis` | ✅ | `backend_net` | intern | intern-only Cache | optional named volume |
|
||||||
| `mealie-postgres` | ✅ | `mealie_mealie_internal` | intern | isoliert, nie `frontend_net` | — |
|
| `mealie-postgres` | ✅ | `mealie_mealie_internal` | intern | isoliert, nie `frontend_net` | — |
|
||||||
| `immich_postgres` | ✅ | `immich_default` | intern | intern-only | `immich_default` → `internal: true` ausstehend |
|
| `immich_postgres` | ✅ | `immich_default` | intern | intern-only | — |
|
||||||
| `immich_redis` | ⏳ | `immich_default` | intern | intern-only | anonymes Volume → named volume |
|
| `immich_redis` | ⏳ | `immich_default` | intern | intern-only | anonymes Volume → named volume |
|
||||||
|
|
||||||
### 7.4 Öffentliche Apps
|
### 7.4 Öffentliche Apps
|
||||||
@@ -252,7 +251,7 @@ Legende Status:
|
|||||||
| `mealie` | ✅ | `frontend_net`, `mealie_mealie_internal` | Traefik | sauber getrennte App/DB-Struktur | — |
|
| `mealie` | ✅ | `frontend_net`, `mealie_mealie_internal` | Traefik | sauber getrennte App/DB-Struktur | — |
|
||||||
| `ntfy` | ✅ | `frontend_net` | Traefik | aktiv via `ntfy.kaleschke.info`, Git-Stack | — |
|
| `ntfy` | ✅ | `frontend_net` | Traefik | aktiv via `ntfy.kaleschke.info`, Git-Stack | — |
|
||||||
| `gitea` | ✅ | `frontend_net` | Traefik + SSH-Port 222 | Web via Traefik, SSH direkt gebunden | — |
|
| `gitea` | ✅ | `frontend_net` | Traefik + SSH-Port 222 | Web via Traefik, SSH direkt gebunden | — |
|
||||||
| `immich_server` | ✅ | `immich_default`, `frontend_net` | Traefik | aktiv via `immich.kaleschke.info` | `immich_default` → `internal: true` ausstehend |
|
| `immich_server` | ✅ | `immich_default`, `frontend_net` | Traefik | aktiv via `immich.kaleschke.info` | — |
|
||||||
| `immich_machine_learning` | ✅ | `immich_default` | intern | bleibt intern | — |
|
| `immich_machine_learning` | ✅ | `immich_default` | intern | bleibt intern | — |
|
||||||
|
|
||||||
### 7.5 Admin / Operations
|
### 7.5 Admin / Operations
|
||||||
@@ -304,7 +303,6 @@ Legende Status:
|
|||||||
## 8. Traefik-Label-Standard
|
## 8. Traefik-Label-Standard
|
||||||
|
|
||||||
Jeder Dienst mit Traefik-Routing nutzt dieses Muster:
|
Jeder Dienst mit Traefik-Routing nutzt dieses Muster:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
labels:
|
labels:
|
||||||
- traefik.enable=true
|
- traefik.enable=true
|
||||||
@@ -334,7 +332,7 @@ labels:
|
|||||||
|
|
||||||
## 9. Migrationsstrategie (Blöcke A–F)
|
## 9. Migrationsstrategie (Blöcke A–F)
|
||||||
|
|
||||||
**Letzte Aktualisierung:** 2026-03-28
|
**Letzte Aktualisierung:** 2026-03-29
|
||||||
|
|
||||||
### Block A — Quick Wins ✅ ABGESCHLOSSEN
|
### Block A — Quick Wins ✅ ABGESCHLOSSEN
|
||||||
```text
|
```text
|
||||||
@@ -403,7 +401,7 @@ labels:
|
|||||||
|
|
||||||
### Block F — Feinschliff / Hardening
|
### Block F — Feinschliff / Hardening
|
||||||
```text
|
```text
|
||||||
[ ] immich_default - internal: true setzen (kurzer Downtime nötig)
|
[x] immich_default - internal: true gesetzt (2026-03-29)
|
||||||
[ ] immich_redis - anonymes Volume → named volume in Compose
|
[ ] immich_redis - anonymes Volume → named volume in Compose
|
||||||
[ ] immich_server - anonymes Volume prüfen und benennen
|
[ ] immich_server - anonymes Volume prüfen und benennen
|
||||||
[ ] backrest - /mnt/user doppelt gemountet (ro + rw) - rw-Mount auf konkrete Pfade einschränken
|
[ ] backrest - /mnt/user doppelt gemountet (ro + rw) - rw-Mount auf konkrete Pfade einschränken
|
||||||
@@ -450,7 +448,7 @@ Dieses Projekt wird **blockweise** umgesetzt, nicht wild containerweise.
|
|||||||
| Sprint 3 | `mealie` / `mealie-postgres` + `mail-archiver` | ✅ Abgeschlossen |
|
| Sprint 3 | `mealie` / `mealie-postgres` + `mail-archiver` | ✅ Abgeschlossen |
|
||||||
| Sprint 4 | Frontend-Stack (`paperless`, `PortainerCE`, `Dozzle`, `dashdot`, `scrutiny`, `filebrowser`, `gitea`, `UptimeKuma`, `ntfy`, `beszel`) + Traefik File-Provider Bereinigung + Komodo Einführung + AdGuard Home Migration + Pi-hole Ablösung | ✅ Abgeschlossen |
|
| Sprint 4 | Frontend-Stack (`paperless`, `PortainerCE`, `Dozzle`, `dashdot`, `scrutiny`, `filebrowser`, `gitea`, `UptimeKuma`, `ntfy`, `beszel`) + Traefik File-Provider Bereinigung + Komodo Einführung + AdGuard Home Migration + Pi-hole Ablösung | ✅ Abgeschlossen |
|
||||||
| Sprint 5 | `Plex-Media-Server` Compose-Migration + `PortainerCE` abschalten | 🔄 In Bearbeitung |
|
| Sprint 5 | `Plex-Media-Server` Compose-Migration + `PortainerCE` abschalten | 🔄 In Bearbeitung |
|
||||||
| Sprint 6 | Hardening / Secrets / Volumes / Sonderfälle (`immich_default`, Volumes, Mounts, AdGuard Traefik) | ⏳ Offen |
|
| Sprint 6 | Hardening / Secrets / Volumes / Sonderfälle (`immich_default` ✅, Volumes, Mounts, AdGuard Traefik) | ⏳ Offen |
|
||||||
|
|
||||||
### 11.3 Regel für jede Änderung
|
### 11.3 Regel für jede Änderung
|
||||||
1. Zielbild in diesem Dokument prüfen
|
1. Zielbild in diesem Dokument prüfen
|
||||||
@@ -527,6 +525,13 @@ Update-Monitoring kann über Komodo's eingebaute Update-Notifications abgedeckt
|
|||||||
- `NTFY_UPSTREAM_BASE_URL: https://ntfy.sh` für mobile Push-Notifications
|
- `NTFY_UPSTREAM_BASE_URL: https://ntfy.sh` für mobile Push-Notifications
|
||||||
- `NTFY_BEHIND_PROXY: true` korrekt gesetzt
|
- `NTFY_BEHIND_PROXY: true` korrekt gesetzt
|
||||||
|
|
||||||
|
### immich_default — internal: true gesetzt (2026-03-29)
|
||||||
|
`immich_default` wurde von `external: true` auf ein Compose-verwaltetes internes Netz umgestellt:
|
||||||
|
- **Vorher:** `external: true` (manuell erstellt, falsche Labels `com.docker.compose.network=default`)
|
||||||
|
- **Nachher:** Compose-managed, `internal: true`, `driver: bridge`, korrekte Labels
|
||||||
|
- 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 / Portainer 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.
|
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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user