Files
homelab-infra/docs/archive/2026-05/CODEX_JELLYFIN_REMOVAL_2026-05-23.md
T
2026-05-31 22:53:10 +02:00

203 lines
9.4 KiB
Markdown

# Codex-Prompt: Jellyfin entfernen, Plex bleibt
> **Status (Stand 2026-05-30):** Auftrag ausgefuehrt. Jellyfin wurde 2026-05-25 aus Repo, Komodo, Traefik-Routing, Authelia-ACL und Appdata-Live-Pfad entfernt (Service-Removal-Checkliste in `docs/WORKFLOW.md`, MIGRATION_LOG-Eintrag dort). Datei bleibt im Repo als **Codex-Removal-Pattern** fuer kuenftige Stack-Removals (z.B. Hermes nach Review-Deadline 2026-07-25 oder bei BentoPDF/paperless-gpt-Folgeentscheidung). Inhaltlich nicht mehr aendern — als Vorlage referenzieren und pro Anwendung neu instanzieren.
Stand: 2026-05-23
Ausloeser: Operator-Entscheidung "Plex bleibt, Jellyfin weg".
Bezug: `docs/archive/2026-05/STRATEGISCHE_BEWERTUNG_2026-05-23.md` Block 9 Quick Wins.
Du hast Vollzugriff auf `G:\Gitea_Clone\homelab-infra`, Gitea-Push, Komodo, und SSH auf Unraid `Kallilabcore`.
## Lies zuerst
1. `CLAUDE.md`
2. `HOMELAB_ARCHITECTURE_MASTER_V2.md` Abschnitt 7.4 und 7.8
3. `docs/WORKFLOW.md`
4. `docs/ROLLBACK.md`
5. `apps/jellyfin/docker-compose.yml`
6. `security/authelia/configuration.yml` (Access-Control-Block)
7. `docs/SERVICE_CATALOG.md`, `docs/REPO_MAP.md`, `docs/MIGRATION_LOG.md`
## Ziel
Jellyfin ist vollstaendig aus dem Repo, Komodo, Traefik-Routing und Authelia-ACL entfernt. Plex laeuft unveraendert weiter. Medien-/Foto-Mounts unter `/mnt/user/media` und `/mnt/user/photos` bleiben unberuehrt. Domain `jellyfin.kaleschke.info` antwortet nicht mehr ueber Traefik.
## Wichtige Vorabinformation
- `/mnt/user/appdata/jellyfin/{config,cache}` ist **nicht** im Borg-Scope (`ops/borg-ui/all-important-sources.txt`). Watch-History, User-Settings und Metadaten-Cache sind danach weg. Das ist akzeptabel, weil Plex die Nutzungsdaten ohnehin separat fuehrt.
- Plex teilt sich `/mnt/user/media:ro` und `/mnt/user/photos:ro` mit Jellyfin — Datenpfad bleibt unangetastet.
- Authelia-Eintrag `jellyfin.kaleschke.info` steht unter `policy: bypass` in `security/authelia/configuration.yml` Zeile 42. Die `configuration.yml` ist Repo-Baseline und muss laut `docs/AI_CONTEXT.md` manuell auf den Host gemerged werden.
- Jellyfin hat **keinen** Eintrag in `monitoring/blackbox/blackbox.yml`, `ops/glance/config/glance.yml`, `apps/homepage/docker-compose.yml`. Die Homepage-Service-Cards liegen hostseitig unter `/mnt/user/appdata/homepage/config/services.yaml` — dort moeglicherweise ein Eintrag, vor Ort pruefen.
## Reihenfolge
### P0 — Plex-Tauglichkeit verifizieren (vor jeglichem Loeschen)
Smoke-Test auf dem Host:
```bash
curl -fsS -o /dev/null -w "%{http_code}\n" http://192.168.178.58:32400/identity
docker exec plex test -d /data/Filme || echo "Filme nicht erreichbar"
docker exec plex test -d /photos || echo "Photos nicht erreichbar"
```
Akzeptanzkriterium: Plex antwortet mit `200`, beide Medien-Pfade sind im Plex-Container sichtbar, Plex zeigt in seiner Web-UI alle erwarteten Bibliotheken. **Wenn nicht erfuellt: abbrechen und Operator fragen.**
### P1 — Jellyfin Stack in Komodo stoppen (nicht loeschen)
In Komodo Web-UI Stack `jellyfin` `Stop` ausfuehren (nicht `Destroy`). Damit ist der Container weg, Stack-Definition und Workspace bleiben — Rollback per `Start` moeglich.
Akzeptanzkriterium:
```bash
docker ps -a --filter name=jellyfin --format "{{.Names}}\t{{.Status}}"
```
zeigt entweder keine Zeile oder `Exited`.
### P2 — Authelia ACL um Jellyfin-Bypass bereinigen
Datei: `security/authelia/configuration.yml`
```diff
- domain:
- immich.kaleschke.info
- paperless.kaleschke.info
- mealie.kaleschke.info
- vault.kaleschke.info
- ntfy.kaleschke.info
- git.kaleschke.info
- - jellyfin.kaleschke.info
policy: bypass
```
Kein anderer Authelia-Eintrag referenziert Jellyfin. Wildcard `*.kaleschke.info` mit `policy: one_factor` greift fuer geloeschte Domains nicht, weil Traefik die Route nicht mehr kennt.
**Manueller Host-Sync danach Pflicht** (`docs/AI_CONTEXT.md`, Workflow): die geaenderte `configuration.yml` muss auf `/mnt/user/appdata/authelia/config/configuration.yml` gemerged werden (OIDC-/Secret-Block hostseitig erhalten). Danach `docker exec authelia authelia validate-config -c /config/configuration.yml` und Stack-Restart.
### P3 — Compose-Stack aus Repo entfernen
```bash
git rm -r apps/jellyfin/
```
Akzeptanzkriterium: `apps/jellyfin/` existiert nicht mehr; `git status --short` zeigt `D apps/jellyfin/docker-compose.yml`.
### P4 — Doku synchronisieren
**`HOMELAB_ARCHITECTURE_MASTER_V2.md`:**
- Abschnitt 3.2 Diagramm: `jellyfin` aus oeffentliche-Apps-Zeile entfernen.
- Abschnitt 4.1 "Oeffentlich ueber Traefik": Zeile `- jellyfin — jellyfin.kaleschke.info` entfernen.
- Abschnitt 7.4 Tabelle "Produktive Apps": Zeile `jellyfin` entfernen.
- Abschnitt 7.8 "Entfernte Container": neue Zeile
```text
| `jellyfin` | 2026-05-23 | doppelter Medienserver neben Plex; Plex bleibt einziger Medienserver |
```
**`docs/SERVICE_CATALOG.md`:**
- Block "Public / User Apps": Jellyfin-Zeile entfernen.
**`docs/REPO_MAP.md`:**
- Abschnitt "Apps"-Tabelle: Jellyfin-Zeile entfernen.
- Abschnitt "Traefik Hosts": `jellyfin.kaleschke.info`-Zeile entfernen.
- Abschnitt "Volumes und Datenpfade": Jellyfin-Zeile entfernen.
**`docs/MIGRATION_LOG.md`:** neuen Eintrag anhaengen
```text
### Jellyfin entfernt (2026-05-23)
- Operator-Entscheidung: Plex bleibt einziger Medienserver.
- Compose-Stack `apps/jellyfin/` aus Repo entfernt.
- Authelia-ACL bereinigt (`jellyfin.kaleschke.info` aus `bypass`-Liste raus), Host-Config gemerged.
- Komodo-Stack `jellyfin` gestoppt; Stack-Eintrag und Webhook bei Abschluss von Schritt P7 entfernt.
- Appdata unter `/mnt/user/appdata/jellyfin/` nach `/mnt/user/appdata/_archive/jellyfin-removed-2026-05-23/` verschoben (siehe Schritt P5).
- DNS-Eintrag `jellyfin.kaleschke.info` in Cloudflare belassen, kann beim naechsten DNS-Cleanup mit entfernt werden.
```
### P5 — Appdata archivieren statt loeschen
Auf dem Host:
```bash
mkdir -p /mnt/user/appdata/_archive
mv /mnt/user/appdata/jellyfin /mnt/user/appdata/_archive/jellyfin-removed-2026-05-23
```
Akzeptanzkriterium: `/mnt/user/appdata/jellyfin` existiert nicht mehr, `/mnt/user/appdata/_archive/jellyfin-removed-2026-05-23` enthaelt `config/` und `cache/`. **Nicht endgueltig loeschen** vor mindestens 14 Tagen Plex-Stabilitaet.
### P6 — Policy-Check + Commit
```powershell
pwsh ops/policy-checks/check_repo.ps1
```
Akzeptanzkriterium: 0 Critical, keine neuen Warnings (vorher: 4 dokumentierte Warnings, soll danach gleich bleiben).
Commit:
```bash
git add -A
git commit -m "Remove Jellyfin stack; Plex remains sole media server"
git push origin master
```
### P7 — Komodo-Stack-Eintrag und Webhook entfernen
Nach erfolgreichem Push und gruener Komodo-Reaktion auf restliche Stacks:
- In Komodo: Stack `jellyfin` `Destroy` (Workspace `/mnt/user/services/stacks/jellyfin/` entfernen).
- In Gitea: Webhook-Eintrag fuer Komodo-Stack-ID `jellyfin` entfernen.
Akzeptanzkriterium: `ls /mnt/user/services/stacks/ | grep jellyfin` ist leer; Gitea-Webhook-Liste fuer `Micha/homelab-infra` enthaelt keinen Jellyfin-Eintrag mehr.
### P8 — Smoke-Test final
```bash
curl -fsS -o /dev/null -w "%{http_code}\n" https://jellyfin.kaleschke.info/
docker ps --filter name=jellyfin --format "{{.Names}}"
ss -ltnp | grep 8096 || echo "Port 8096 frei"
```
Erwartung:
- `https://jellyfin.kaleschke.info/` antwortet `404` (Traefik kennt die Route nicht mehr) oder Cert-Fehler je nach Cache.
- Kein laufender `jellyfin`-Container.
- Port `8096` nicht belegt (Jellyfin nutzte nur Container-Port, sollte sowieso frei sein).
- Authelia-Login fuer Admin-Domains (`uptime`, `files`, `scrutiny`) funktioniert weiterhin — Bypass-Liste-Aenderung darf 2FA-Domains nicht angreifen.
## Rollback (bis Schritt P5 einschliesslich)
- Git: `git revert <commit-sha>` und push. Komodo deployt Jellyfin neu, sobald Stack in Komodo wieder existiert.
- Appdata: `mv /mnt/user/appdata/_archive/jellyfin-removed-2026-05-23 /mnt/user/appdata/jellyfin`.
- Authelia-ACL: Bypass-Eintrag wieder rein, Host-Sync, Authelia-Restart.
Ab Schritt P7 (Komodo Destroy + Webhook weg) ist Rollback nur per Neuanlegen des Komodo-Stacks moeglich.
## Regeln (aus CLAUDE.md, nicht verhandelbar)
- Secrets nie im Klartext ausgeben.
- Keine Aenderungen direkt in Komodo, nur ueber Git → Push → Komodo. **Ausnahme:** Schritt P1 (`Stop`) und P7 (`Destroy`) sind explizit Komodo-Aktionen nach erfolgreichem Repo-Stand.
- Kein `push --force`, kein blindes Loeschen unter `/mnt/user/{appdata,documents,photos,services,backups}` — Appdata wird in `_archive/` verschoben, nicht entfernt.
- Working-Tree-Status nur aus `git status --short` ableiten, nie aus `git diff` ueber Linux-Mount.
- Traefik dynamic config wird nicht von Komodo deployed — fuer diesen Auftrag nicht relevant, weil Jellyfin nur per Docker-Labels gerouteted war.
- Nicht anfassen: Plex-Stack, Medien-/Foto-Mounts, alle anderen Apps.
- Wenn zwei Reparaturversuche scheitern: stoppen, `docs/GITOPS_DRIFT_RUNBOOK.md` Pflichtmatrix, Operator fragen.
## Arbeitsmodus pro Schritt
Lesen → minimal aendern → `ops/policy-checks/check_repo.ps1` lokal (nur P6) → Commit → Push → Komodo-Reaktion + Smoke-Test → Eintrag in `docs/MIGRATION_LOG.md`.
## Fertig
Wenn alle 8 Schritte abgehakt sind: kurze Erfolgsmeldung an Operator mit:
- Commit-SHA des Removal-Commits
- Bestaetigung Plex weiterhin gruen
- Bestaetigung Authelia validate-config gruen
- Bestaetigung Komodo-Stack und Webhook entfernt
- Pfad zum Appdata-Archiv und Erinnerung, dass `_archive/jellyfin-removed-2026-05-23/` nach 14 Tagen Plex-Stabilitaet entfernt werden darf