[Plan] Neuer Proxmox-Host (Jellyfin + Uebersetzung): Setup-Checkliste von Grund auf #107

Open
opened 2026-06-14 10:13:57 +00:00 by orbitalo · 31 comments
Owner

Zweck

Dedizierter neuer Rechner als Proxmox-Host fuer Jellyfin + die Echtzeit-Uebersetzung (Jervais, siehe #103). Diese Checkliste ist der verbindliche Aufbauplan, damit JEDE Cline-/Cursor-Session ihn abrufen kann (statt fluechtiger Chat-Versprechen). Trigger: Sobald der Host installiert/online ist und IP + root-Zugang vorliegen, wird nach dieser Liste gearbeitet.

Hardware (Stand 14.06.2026)

Komponente Spec
Mainboard MSI MPG B550 Gaming Plus
CPU AMD Ryzen 5 5600G (iGPU/Vega treibt Konsole/Display)
RAM 16 GB
GPU RTX 3080 10 GB (frei fuer Workloads)
Netzteil 850 W
OS Proxmox VE

WICHTIGSTE ARCHITEKTUR-ENTSCHEIDUNG: GPU wird GETEILT, NICHT durchgereicht

KEIN VM-GPU-Passthrough (VFIO)! Passthrough gibt die ganze Karte EXKLUSIV an eine VM -> dann koennte die Uebersetzung die 3080 nicht mehr nutzen. Das widerspricht dem Plan.

Stattdessen: LXC-Container mit geteiltem GPU-Device. Der NVIDIA-Treiber laeuft auf dem Proxmox-HOST, und die /dev/nvidia*-Nodes werden in mehrere unprivilegierte LXC gemountet. So teilen sich Jellyfin (NVENC/NVDEC) und Uebersetzung (CUDA-Compute) dieselbe 3080 - verschiedene Engines, koexistieren problemlos. Vorteil: kein IOMMU/VFIO noetig, kein nouveau-Gefummel in VMs.

Die iGPU des 5600G treibt die Konsole -> die 3080 wird vom Host-Display nicht belegt und steht voll zur Verfuegung.


Phase A - Konsole/BIOS (NICHT remote machbar - braucht physischen/Konsolen-Zugang)

  • BIOS: Primary Display = Integrated Graphics (iGPU) setzen, damit die 3080 frei bleibt.
  • BIOS: Above 4G Decoding / Resizable BAR aktivieren (optional, hilft).
  • BIOS: Secure Boot aus (erleichtert NVIDIA-Kernelmodul).
  • (IOMMU/VFIO ist fuer LXC-Sharing NICHT noetig - nur relevant falls man doch je eine VM-Passthrough-Variante wollte.)
  • Proxmox VE vom ISO installieren (Konsole), Root-PW, Netzwerk/Hostname.
  • Nach Installation: IP + root-Zugang an den Agenten melden -> ab hier laeuft der Rest per SSH.

Phase B - Proxmox-Grundkonfiguration (remote per SSH)

  • no-subscription-Repo einrichten, apt update && apt full-upgrade, reboot.
  • Tailscale installieren + ins Tailnet joinen (homelab-IP), in die Server-Tabelle/Doku aufnehmen.
  • SSH-Key des homelab-Hubs (pve-hetzner) in authorized_keys -> passwortloser Zugriff wie bei den anderen Hosts.
  • Zeit/NTP, /etc/hosts, sinnvoller Hostname (z.B. pve-jervais o.ae.).

Phase C - ZFS-Pool

  • Datenttraeger-Layout klaeren (OFFEN: welche/wie viele Platten sind verbaut?).
  • ZFS-Pool anlegen (ashift=12, compression=zstd).
  • Datasets: media (Jellyfin), backups, ggf. appdata.
  • Pool als Proxmox-Storage einbinden.

Phase D - NVIDIA-Treiber auf dem HOST (Fundament fuers Sharing)

  • nouveau blacklisten.
  • NVIDIA-Treiber + passende CUDA-Version auf dem Proxmox-Host installieren, nvidia-smi muss die 3080 zeigen.
  • Persistence Mode aktivieren (nvidia-persistenced).
  • Treiberversion notieren - im Container MUSS exakt dieselbe Userspace-Version rein (--no-kernel-module).

Phase E - GPU-Sharing in LXC einrichten

  • Unprivilegierte LXC anlegen.
  • In der LXC-Config die GPU-Devices durchreichen: lxc.cgroup2.devices.allow + lxc.mount.entry fuer /dev/nvidia0, /dev/nvidiactl, /dev/nvidia-uvm, /dev/nvidia-uvm-tools.
  • Im Container denselben NVIDIA-Userspace-Treiber installieren (--no-kernel-module), nvidia-smi im Container testen.
  • Gegenprobe: zweiter Container sieht dieselbe Karte -> Sharing bestaetigt.

Phase F - Jellyfin-LXC

  • Jellyfin in LXC installieren, ZFS-media-Dataset mounten.
  • NVENC/NVDEC Hardware-Transcoding aktivieren + mit einer Datei verifizieren (nvidia-smi zeigt Encoder-Last).
  • Bibliotheken anlegen.

Phase G - Uebersetzungs-Pipeline-LXC (Details in #103)

  • Eigener LXC, teilt sich die 3080 (Phase E).
  • faster-whisper (STT) + NLLB-200 (MT) + Piper (DE-TTS), Pipeline auf die 3080 gepinnt.
  • Koexistenz mit Jellyfin unter Last testen (NVENC + CUDA gleichzeitig).

Phase H - Cloudflared / externer Zugang

  • Cloudflared-Tunnel fuer Jellyfin (Subdomain unter orbitalo.net).
  • DNS/Tunnel-Config dokumentieren.

Phase I - Monitoring-Integration

  • node_exporter + promtail -> bestehendes Prometheus/Loki (CT 110).
  • Host/CTs in die Hausmeister-Checks aufnehmen (Container-Status, HTTP-Health).

Phase J - Backup (PBS)

  • Gaeste dieses Hosts in den vzdump-Job auf pbs-muldenstein aufnehmen.
  • Ersten Backup-Lauf verifizieren (Snapshot vorhanden). Achtung: Backup-Mail-Benachrichtigung war kaputt - siehe Backup-Gap-Thema.

Phase K - Doku-Migration

  • Host in CT-999-Doku anlegen (hosts/*.md), je Container ein container/ct-XXX-*.md.
  • Zugangsdaten ausschliesslich in credentials.md.

Offene Punkte / zu klaeren

  • Plattenlayout fuer den ZFS-Pool (welche Disks, Groesse, RAID/Mirror?).
  • "HA" aus der urspruenglichen Wunschliste: vermutlich Home Assistant (in LXC machbar). NICHT Proxmox-High-Availability - das braucht ein Cluster aus >=3 Knoten und ergibt auf einem Single-Node keinen Sinn. Bitte bestaetigen.
  • Nextcloud: bewusst NICHT Teil dieses Plans (vom Nutzer gestrichen).

Hinweis fuer den ausfuehrenden Agenten

  • GPU = LXC-Sharing, nicht Passthrough (haeufigster Denkfehler).
  • Phase A ist Konsole/BIOS - kann NICHT per SSH erledigt werden; Reboot-Reihenfolge beachten, sonst Aussperr-Gefahr.
  • Verwandt: #103 (Uebersetzungs-Pipeline).
## Zweck Dedizierter neuer Rechner als Proxmox-Host fuer **Jellyfin** + die **Echtzeit-Uebersetzung** (Jervais, siehe #103). Diese Checkliste ist der verbindliche Aufbauplan, damit JEDE Cline-/Cursor-Session ihn abrufen kann (statt fluechtiger Chat-Versprechen). Trigger: Sobald der Host installiert/online ist und IP + root-Zugang vorliegen, wird nach dieser Liste gearbeitet. ## Hardware (Stand 14.06.2026) | Komponente | Spec | |---|---| | Mainboard | MSI MPG B550 Gaming Plus | | CPU | AMD Ryzen 5 5600G (iGPU/Vega treibt Konsole/Display) | | RAM | 16 GB | | GPU | RTX 3080 **10 GB** (frei fuer Workloads) | | Netzteil | 850 W | | OS | Proxmox VE | ## WICHTIGSTE ARCHITEKTUR-ENTSCHEIDUNG: GPU wird GETEILT, NICHT durchgereicht **KEIN VM-GPU-Passthrough (VFIO)!** Passthrough gibt die ganze Karte EXKLUSIV an eine VM -> dann koennte die Uebersetzung die 3080 nicht mehr nutzen. Das widerspricht dem Plan. **Stattdessen: LXC-Container mit geteiltem GPU-Device.** Der NVIDIA-Treiber laeuft auf dem Proxmox-HOST, und die /dev/nvidia*-Nodes werden in mehrere unprivilegierte LXC gemountet. So teilen sich **Jellyfin (NVENC/NVDEC)** und **Uebersetzung (CUDA-Compute)** dieselbe 3080 - verschiedene Engines, koexistieren problemlos. Vorteil: kein IOMMU/VFIO noetig, kein nouveau-Gefummel in VMs. Die **iGPU des 5600G treibt die Konsole** -> die 3080 wird vom Host-Display nicht belegt und steht voll zur Verfuegung. --- ## Phase A - Konsole/BIOS (NICHT remote machbar - braucht physischen/Konsolen-Zugang) - [ ] BIOS: **Primary Display = Integrated Graphics (iGPU)** setzen, damit die 3080 frei bleibt. - [ ] BIOS: Above 4G Decoding / Resizable BAR aktivieren (optional, hilft). - [ ] BIOS: Secure Boot **aus** (erleichtert NVIDIA-Kernelmodul). - [ ] (IOMMU/VFIO ist fuer LXC-Sharing NICHT noetig - nur relevant falls man doch je eine VM-Passthrough-Variante wollte.) - [ ] Proxmox VE vom ISO installieren (Konsole), Root-PW, Netzwerk/Hostname. - [ ] Nach Installation: IP + root-Zugang an den Agenten melden -> ab hier laeuft der Rest per SSH. ## Phase B - Proxmox-Grundkonfiguration (remote per SSH) - [ ] no-subscription-Repo einrichten, `apt update && apt full-upgrade`, reboot. - [ ] **Tailscale** installieren + ins Tailnet joinen (homelab-IP), in die Server-Tabelle/Doku aufnehmen. - [ ] SSH-Key des homelab-Hubs (pve-hetzner) in authorized_keys -> passwortloser Zugriff wie bei den anderen Hosts. - [ ] Zeit/NTP, /etc/hosts, sinnvoller Hostname (z.B. pve-jervais o.ae.). ## Phase C - ZFS-Pool - [ ] Datenttraeger-Layout klaeren (OFFEN: welche/wie viele Platten sind verbaut?). - [ ] ZFS-Pool anlegen (`ashift=12`, `compression=zstd`). - [ ] Datasets: `media` (Jellyfin), `backups`, ggf. `appdata`. - [ ] Pool als Proxmox-Storage einbinden. ## Phase D - NVIDIA-Treiber auf dem HOST (Fundament fuers Sharing) - [ ] `nouveau` blacklisten. - [ ] NVIDIA-Treiber + passende CUDA-Version auf dem Proxmox-Host installieren, `nvidia-smi` muss die 3080 zeigen. - [ ] Persistence Mode aktivieren (`nvidia-persistenced`). - [ ] Treiberversion notieren - im Container MUSS exakt dieselbe Userspace-Version rein (`--no-kernel-module`). ## Phase E - GPU-Sharing in LXC einrichten - [ ] Unprivilegierte LXC anlegen. - [ ] In der LXC-Config die GPU-Devices durchreichen: `lxc.cgroup2.devices.allow` + `lxc.mount.entry` fuer `/dev/nvidia0`, `/dev/nvidiactl`, `/dev/nvidia-uvm`, `/dev/nvidia-uvm-tools`. - [ ] Im Container denselben NVIDIA-Userspace-Treiber installieren (`--no-kernel-module`), `nvidia-smi` im Container testen. - [ ] Gegenprobe: zweiter Container sieht dieselbe Karte -> Sharing bestaetigt. ## Phase F - Jellyfin-LXC - [ ] Jellyfin in LXC installieren, ZFS-`media`-Dataset mounten. - [ ] **NVENC/NVDEC** Hardware-Transcoding aktivieren + mit einer Datei verifizieren (nvidia-smi zeigt Encoder-Last). - [ ] Bibliotheken anlegen. ## Phase G - Uebersetzungs-Pipeline-LXC (Details in #103) - [ ] Eigener LXC, teilt sich die 3080 (Phase E). - [ ] faster-whisper (STT) + NLLB-200 (MT) + Piper (DE-TTS), Pipeline auf die 3080 gepinnt. - [ ] Koexistenz mit Jellyfin unter Last testen (NVENC + CUDA gleichzeitig). ## Phase H - Cloudflared / externer Zugang - [ ] Cloudflared-Tunnel fuer Jellyfin (Subdomain unter orbitalo.net). - [ ] DNS/Tunnel-Config dokumentieren. ## Phase I - Monitoring-Integration - [ ] node_exporter + promtail -> bestehendes Prometheus/Loki (CT 110). - [ ] Host/CTs in die Hausmeister-Checks aufnehmen (Container-Status, HTTP-Health). ## Phase J - Backup (PBS) - [ ] Gaeste dieses Hosts in den vzdump-Job auf `pbs-muldenstein` aufnehmen. - [ ] Ersten Backup-Lauf verifizieren (Snapshot vorhanden). Achtung: Backup-Mail-Benachrichtigung war kaputt - siehe Backup-Gap-Thema. ## Phase K - Doku-Migration - [ ] Host in CT-999-Doku anlegen (`hosts/*.md`), je Container ein `container/ct-XXX-*.md`. - [ ] Zugangsdaten ausschliesslich in `credentials.md`. --- ## Offene Punkte / zu klaeren - **Plattenlayout** fuer den ZFS-Pool (welche Disks, Groesse, RAID/Mirror?). - **"HA"** aus der urspruenglichen Wunschliste: vermutlich **Home Assistant** (in LXC machbar). NICHT Proxmox-High-Availability - das braucht ein Cluster aus >=3 Knoten und ergibt auf einem Single-Node keinen Sinn. Bitte bestaetigen. - **Nextcloud: bewusst NICHT Teil dieses Plans** (vom Nutzer gestrichen). ## Hinweis fuer den ausfuehrenden Agenten - GPU = **LXC-Sharing**, nicht Passthrough (haeufigster Denkfehler). - Phase A ist **Konsole/BIOS** - kann NICHT per SSH erledigt werden; Reboot-Reihenfolge beachten, sonst Aussperr-Gefahr. - Verwandt: #103 (Uebersetzungs-Pipeline).
Author
Owner

Phase C konkretisiert - Datentraeger fuer ZFS-Pool

Verbaute Platte: 1x Seagate Desktop HDD.14, ST2000DM001, 2 TB, SATA 6 Gb/s, 7200 RPM, Desktop-HDD (keine NAS-/Enterprise-Platte).

Kritische Einordnung (wichtig!)

  • Einzelplatte = KEINE Redundanz. ZFS auf einer Disk erkennt Korruption per Checksum, kann sie aber NICHT reparieren (kein Mirror). Stirbt die Platte, sind die Daten weg.
  • ST2000DM001 ist beruechtigt fuer ueberdurchschnittliche Ausfallraten (Backblaze-Daten: eine der schlechtesten Serien ueberhaupt). Als "wann", nicht "ob" behandeln.

Entscheidung / Regeln fuer diese Platte

  • NUR fuer Jellyfin-Mediendaten (wiederbeschaffbar). Als Wegwerf-/Scratch-Storage behandeln.
  • KEINE Backups lokal auf diese Platte -> das backups-Dataset aus Phase C STREICHEN. Backups gehoeren auf pbs-muldenstein (siehe Phase J).
  • Proxmox-OS NICHT auf diese HDD. Boot/System gehoert auf eine separate, zuverlaessige SSD/NVMe. OFFEN: Was ist die Boot-Platte des Rechners? (kritisch zu klaeren!)
  • Pre-Flight vor Befuellen: smartctl -t long, danach Reallocated_Sector_Ct + Current_Pending_Sector pruefen. Schon Reallocations -> Platte NICHT verwenden.
  • smartd einrichten -> Frueh-Warnung bei beginnendem Plattentod.
  • Pool-Optionen: compression=zstd. copies=2 optional (halbiert Kapazitaet, gibt etwas Self-Heal) - eher skippen, stattdessen SMART ueberwachen und Daten als ersetzbar betrachten.

Fazit

Fuer Jellyfin-Medien brauchbar. Fuer alles Wichtige (Configs, State, Backups) NICHT - das gehoert auf zuverlaessigen Storage bzw. PBS.

## Phase C konkretisiert - Datentraeger fuer ZFS-Pool **Verbaute Platte:** 1x Seagate Desktop HDD.14, **ST2000DM001**, 2 TB, SATA 6 Gb/s, 7200 RPM, Desktop-HDD (keine NAS-/Enterprise-Platte). ### Kritische Einordnung (wichtig!) - **Einzelplatte = KEINE Redundanz.** ZFS auf einer Disk erkennt Korruption per Checksum, kann sie aber NICHT reparieren (kein Mirror). Stirbt die Platte, sind die Daten weg. - **ST2000DM001 ist beruechtigt** fuer ueberdurchschnittliche Ausfallraten (Backblaze-Daten: eine der schlechtesten Serien ueberhaupt). Als "wann", nicht "ob" behandeln. ### Entscheidung / Regeln fuer diese Platte - [ ] **NUR fuer Jellyfin-Mediendaten** (wiederbeschaffbar). Als Wegwerf-/Scratch-Storage behandeln. - [ ] **KEINE Backups lokal auf diese Platte** -> das `backups`-Dataset aus Phase C STREICHEN. Backups gehoeren auf **pbs-muldenstein** (siehe Phase J). - [ ] **Proxmox-OS NICHT auf diese HDD.** Boot/System gehoert auf eine separate, zuverlaessige SSD/NVMe. OFFEN: Was ist die Boot-Platte des Rechners? (kritisch zu klaeren!) - [ ] **Pre-Flight vor Befuellen:** `smartctl -t long`, danach Reallocated_Sector_Ct + Current_Pending_Sector pruefen. Schon Reallocations -> Platte NICHT verwenden. - [ ] `smartd` einrichten -> Frueh-Warnung bei beginnendem Plattentod. - [ ] Pool-Optionen: `compression=zstd`. `copies=2` optional (halbiert Kapazitaet, gibt etwas Self-Heal) - eher skippen, stattdessen SMART ueberwachen und Daten als ersetzbar betrachten. ### Fazit Fuer Jellyfin-Medien brauchbar. Fuer alles Wichtige (Configs, State, Backups) NICHT - das gehoert auf zuverlaessigen Storage bzw. PBS.
Author
Owner

Plattenlayout final geklaert

Rolle Platte
Boot / System / LXC-rootfs SanDisk Ultra 250 GB SSD (SATA)
Daten / Jellyfin-Medien (ZFS-Pool) Seagate ST2000DM001 2 TB HDD

Damit gilt:

  • Proxmox-OS auf die 250-GB-SSD installieren. Reicht locker fuer Proxmox + LXC-Container-rootfs (Medien liegen auf der HDD).
  • LXC-Container-Disks (rootfs) auf die SSD legen -> schnell. Nur das ZFS-media-Dataset auf die HDD.
  • HDD-Pool ausschliesslich fuer Jellyfin-Medien (siehe vorheriger Kommentar).

Einordnung SSD

SanDisk Ultra = Consumer-SATA-SSD (DRAM-less TLC), keine Enterprise-/PLP-Platte. Fuer einen Single-Node-Homelab-Boot voellig ok. Kein Cluster -> moderate Schreiblast, haelt jahrelang. Wer die Schreiblast minimal halten will: ext4/LVM statt ZFS-on-root fuers System (etwas weniger Write-Amplification) - ZFS-on-root ginge aber auch.

Offener Punkt "Boot-Platte" ist damit geschlossen. Verbleibend offen: nur noch "HA = Home Assistant?" bestaetigen.

## Plattenlayout final geklaert | Rolle | Platte | |---|---| | **Boot / System / LXC-rootfs** | SanDisk Ultra **250 GB SSD** (SATA) | | **Daten / Jellyfin-Medien (ZFS-Pool)** | Seagate **ST2000DM001 2 TB** HDD | ### Damit gilt: - [ ] Proxmox-OS auf die **250-GB-SSD** installieren. Reicht locker fuer Proxmox + LXC-Container-rootfs (Medien liegen auf der HDD). - [ ] LXC-Container-Disks (rootfs) auf die SSD legen -> schnell. Nur das ZFS-`media`-Dataset auf die HDD. - [ ] HDD-Pool ausschliesslich fuer Jellyfin-Medien (siehe vorheriger Kommentar). ### Einordnung SSD SanDisk Ultra = Consumer-SATA-SSD (DRAM-less TLC), keine Enterprise-/PLP-Platte. Fuer einen Single-Node-Homelab-Boot voellig ok. Kein Cluster -> moderate Schreiblast, haelt jahrelang. Wer die Schreiblast minimal halten will: ext4/LVM statt ZFS-on-root fuers System (etwas weniger Write-Amplification) - ZFS-on-root ginge aber auch. **Offener Punkt "Boot-Platte" ist damit geschlossen.** Verbleibend offen: nur noch "HA = Home Assistant?" bestaetigen.
Author
Owner

Entscheidung: HA (Home Assistant) faellt RAUS

Grund: ioBroker (CT 143, pve-mu-3) ist bereits als zentraler Smart-Home-Hub im Einsatz (inkl. InfluxDB + Grafana-Dashboards fuer Solar/Heizung/E3DC/Tesla). HA waere ~90% redundant -> doppelte Wartung + moegliche Geraete-Konflikte (zwei Hubs pollen dieselben Geraete). Kein ausreichender Mehrwert. Home Assistant wird daher NICHT auf dem neuen Host installiert.

(Falls spaeter doch lokale Sprachsteuerung gewuenscht: separat bewerten und dann ioBroker<->HA per MQTT bridgen statt duplizieren - nicht Teil dieses Plans.)


Plan-Scope steht damit fest

Gestrichen: Nextcloud, HA.
Enthalten: ZFS-Pool (Medien, ST2000DM001), GPU-Sharing per LXC (3080), Jellyfin-LXC (NVENC), Uebersetzungs-LXC (#103), Cloudflared, Monitoring, PBS-Backup, Doku-Migration.
Plattenlayout: SanDisk Ultra 250GB SSD (OS+LXC) + ST2000DM001 2TB HDD (Medien).
Alle offenen Punkte geklaert. Wartet nur noch auf: Host installiert + IP + root.

## Entscheidung: HA (Home Assistant) faellt RAUS Grund: ioBroker (CT 143, pve-mu-3) ist bereits als zentraler Smart-Home-Hub im Einsatz (inkl. InfluxDB + Grafana-Dashboards fuer Solar/Heizung/E3DC/Tesla). HA waere ~90% redundant -> doppelte Wartung + moegliche Geraete-Konflikte (zwei Hubs pollen dieselben Geraete). Kein ausreichender Mehrwert. Home Assistant wird daher NICHT auf dem neuen Host installiert. (Falls spaeter doch lokale Sprachsteuerung gewuenscht: separat bewerten und dann ioBroker<->HA per MQTT bridgen statt duplizieren - nicht Teil dieses Plans.) --- ## Plan-Scope steht damit fest Gestrichen: **Nextcloud**, **HA**. Enthalten: ZFS-Pool (Medien, ST2000DM001), GPU-Sharing per LXC (3080), Jellyfin-LXC (NVENC), Uebersetzungs-LXC (#103), Cloudflared, Monitoring, PBS-Backup, Doku-Migration. Plattenlayout: SanDisk Ultra 250GB SSD (OS+LXC) + ST2000DM001 2TB HDD (Medien). Alle offenen Punkte geklaert. Wartet nur noch auf: **Host installiert + IP + root**.
Author
Owner

KORREKTUR Plattenlayout: 2x 2TB als ZFS-MIRROR (RAID1)

Geplant war von Anfang an 2x 2TB im ZFS-Mirror (RAID1) zur Ausfallsicherheit - NICHT eine Einzelplatte. Die vorherigen Einzelplatten-Kommentare (#269/#270) sind damit ueberholt.

Finales Layout

Rolle Platte
Boot / System / LXC-rootfs SanDisk Ultra 250 GB SSD
Daten / Jellyfin-Medien 2x 2 TB im ZFS-Mirror (RAID1)
  • Nutzkapazitaet: 2 TB (gespiegelt), ueberlebt den Ausfall einer Platte. Loest die vorher angemahnte Redundanz-Schwaeche.
  • ZFS-Mirror gibt zusaetzlich Self-Healing: bei Checksum-Fehler wird vom intakten Spiegel automatisch repariert (das konnte die Einzelplatte nicht).

Wichtige Caveats

  1. DATENVERLUST-WARNUNG: Das Anlegen des ZFS-Mirror loescht beide Platten komplett. Falls die zwei Platten die aktuellen USB-Platten D:/E: sind: die ~1,76 TB auf E: ("2TB-Mobil") VORHER wegsichern, sonst sind sie weg. Erst Daten retten, dann Pool bauen.
  2. Korrelierte Ausfaelle: Wenn beide Platten ST2000DM001 (gleiches, ausfallfreudiges Modell, evtl. gleiche Charge/Alter) sind, koennen sie zeitnah zusammen sterben. Mirror ist trotzdem klar besser als Einzelplatte, ABER: smartctl -t long auf BEIDEN vor dem Bau, regelmaessige zpool scrub (z.B. woechentlich) + smartd-Alarm.
  3. Boot/System bleibt die SanDisk-SSD (nicht Teil des Mirror).

Pool-Anlage

zpool create -o ashift=12 tank mirror <disk1> <disk2> , compression=zstd, Dataset media fuer Jellyfin. Backups weiterhin auf pbs-muldenstein (nicht lokal).

## KORREKTUR Plattenlayout: 2x 2TB als ZFS-MIRROR (RAID1) Geplant war von Anfang an **2x 2TB im ZFS-Mirror (RAID1)** zur Ausfallsicherheit - NICHT eine Einzelplatte. Die vorherigen Einzelplatten-Kommentare (#269/#270) sind damit ueberholt. ### Finales Layout | Rolle | Platte | |---|---| | Boot / System / LXC-rootfs | SanDisk Ultra 250 GB SSD | | Daten / Jellyfin-Medien | **2x 2 TB im ZFS-Mirror (RAID1)** | - Nutzkapazitaet: **2 TB** (gespiegelt), ueberlebt den Ausfall **einer** Platte. Loest die vorher angemahnte Redundanz-Schwaeche. - ZFS-Mirror gibt zusaetzlich **Self-Healing**: bei Checksum-Fehler wird vom intakten Spiegel automatisch repariert (das konnte die Einzelplatte nicht). ### Wichtige Caveats 1. **DATENVERLUST-WARNUNG:** Das Anlegen des ZFS-Mirror **loescht beide Platten komplett**. Falls die zwei Platten die aktuellen USB-Platten D:/E: sind: die **~1,76 TB auf E: ("2TB-Mobil") VORHER wegsichern**, sonst sind sie weg. Erst Daten retten, dann Pool bauen. 2. **Korrelierte Ausfaelle:** Wenn beide Platten ST2000DM001 (gleiches, ausfallfreudiges Modell, evtl. gleiche Charge/Alter) sind, koennen sie zeitnah zusammen sterben. Mirror ist trotzdem klar besser als Einzelplatte, ABER: `smartctl -t long` auf BEIDEN vor dem Bau, regelmaessige `zpool scrub` (z.B. woechentlich) + `smartd`-Alarm. 3. Boot/System bleibt die SanDisk-SSD (nicht Teil des Mirror). ### Pool-Anlage `zpool create -o ashift=12 tank mirror <disk1> <disk2>` , `compression=zstd`, Dataset `media` fuer Jellyfin. Backups weiterhin auf pbs-muldenstein (nicht lokal).
Author
Owner

Freigabe: beide Mirror-Platten duerfen platt gemacht werden

Bestaetigt: Die zwei 2TB-Platten (aktuell USB D:/E:) sind die ZFS-Mirror-Platten und duerfen komplett geloescht werden - kein Backup der Inhalte noetig. Datenverlust-Caveat aus #273 ist damit erledigt.

Bau-Reihenfolge:

  1. Beide Platten intern (SATA) im neuen Host verbauen.
  2. smartctl -t long auf beiden, Ergebnis abwarten (auf ST2000DM001-Schwaechen achten).
  3. zpool create -o ashift=12 tank mirror <disk1> <disk2> , dann zfs set compression=zstd tank, Dataset tank/media.
  4. Woechentlicher zpool scrub + smartd-Alarm einrichten.
## Freigabe: beide Mirror-Platten duerfen platt gemacht werden Bestaetigt: Die zwei 2TB-Platten (aktuell USB D:/E:) sind die ZFS-Mirror-Platten und duerfen **komplett geloescht** werden - kein Backup der Inhalte noetig. Datenverlust-Caveat aus #273 ist damit erledigt. Bau-Reihenfolge: 1. Beide Platten intern (SATA) im neuen Host verbauen. 2. `smartctl -t long` auf beiden, Ergebnis abwarten (auf ST2000DM001-Schwaechen achten). 3. `zpool create -o ashift=12 tank mirror <disk1> <disk2>` , dann `zfs set compression=zstd tank`, Dataset `tank/media`. 4. Woechentlicher `zpool scrub` + `smartd`-Alarm einrichten.
Author
Owner

Backup-Anbindung an pbs-muldenstein

Neuer Host sichert auf das bestehende pbs-nvme (Muldenstein) - keine lokalen Backups auf dem Host.

Zieldaten

Feld Wert
PBS pbs-nvme (Muldenstein)
Adresse Tailscale 100.99.139.22 (Port 8007)
Datastore nvme-pool (~1,7 TB frei)
Namespace empfohlen eigener NS, z.B. jellyfin-host (trennt Snapshots sauber)

Einrichtung auf dem neuen Host

  1. Tailscale auf dem Host installieren/joinen (Voraussetzung, damit 100.99.139.22 erreichbar ist).
  2. PBS-Fingerprint holen (auf pbs-nvme): proxmox-backup-manager cert info | grep Fingerprint - oder beim Hinzufuegen aus der GUI uebernehmen.
  3. Storage anlegen (Datacenter > Storage > Add > Proxmox Backup Server), oder CLI:
    pvesm add pbs pbs-muldenstein --server 100.99.139.22 --datastore nvme-pool --username <user@pbs> --password <...> --fingerprint <FP> --namespace jellyfin-host
  4. Backup-Job anlegen (Datacenter > Backup): taeglich, alle Guests des Hosts, Storage = pbs-muldenstein, Mode snapshot.
  5. Prune/Retention auf dem Datastore/Job setzen (z.B. keep-daily 7, keep-weekly 4, keep-monthly 3) - sonst laeuft nvme-pool voll.
  6. Mailbenachrichtigung sauber konfigurieren (Lehre aus Issue #105: mailnotification nur sinnvoll wenn echte Empfaenger-Adresse hinterlegt ist - sonst bleibt ein fehlgeschlagenes Backup unbemerkt).

Was NICHT gesichert wird

  • Das ZFS-Medien-Dataset (tank/media, Jellyfin-Filme) ist bewusst nicht im Backup - ersetzbare Medien, wuerde nur den Datastore fluten. Gesichert werden die LXC-Container (Konfig/System), nicht die Mediathek.

Verifikation nach erstem Lauf

  • Snapshot auf pbs-nvme sichtbar? proxmox-backup-client snapshot list bzw. PBS-GUI.
  • Hausmeister-Backup-Freshness-Check (geplant aus #105) sollte den neuen Host mit abdecken.
## Backup-Anbindung an pbs-muldenstein Neuer Host sichert auf das bestehende **pbs-nvme** (Muldenstein) - keine lokalen Backups auf dem Host. ### Zieldaten | Feld | Wert | |---|---| | PBS | pbs-nvme (Muldenstein) | | Adresse | Tailscale `100.99.139.22` (Port 8007) | | Datastore | `nvme-pool` (~1,7 TB frei) | | Namespace | empfohlen eigener NS, z.B. `jellyfin-host` (trennt Snapshots sauber) | ### Einrichtung auf dem neuen Host 1. **Tailscale** auf dem Host installieren/joinen (Voraussetzung, damit `100.99.139.22` erreichbar ist). 2. PBS-**Fingerprint** holen (auf pbs-nvme): `proxmox-backup-manager cert info | grep Fingerprint` - oder beim Hinzufuegen aus der GUI uebernehmen. 3. **Storage anlegen** (Datacenter > Storage > Add > Proxmox Backup Server), oder CLI: `pvesm add pbs pbs-muldenstein --server 100.99.139.22 --datastore nvme-pool --username <user@pbs> --password <...> --fingerprint <FP> --namespace jellyfin-host` 4. **Backup-Job** anlegen (Datacenter > Backup): taeglich, alle Guests des Hosts, Storage = pbs-muldenstein, Mode `snapshot`. 5. **Prune/Retention** auf dem Datastore/Job setzen (z.B. keep-daily 7, keep-weekly 4, keep-monthly 3) - sonst laeuft `nvme-pool` voll. 6. **Mailbenachrichtigung** sauber konfigurieren (Lehre aus Issue #105: `mailnotification` nur sinnvoll wenn echte Empfaenger-Adresse hinterlegt ist - sonst bleibt ein fehlgeschlagenes Backup unbemerkt). ### Was NICHT gesichert wird - Das **ZFS-Medien-Dataset** (`tank/media`, Jellyfin-Filme) ist bewusst **nicht** im Backup - ersetzbare Medien, wuerde nur den Datastore fluten. Gesichert werden die LXC-Container (Konfig/System), nicht die Mediathek. ### Verifikation nach erstem Lauf - Snapshot auf pbs-nvme sichtbar? `proxmox-backup-client snapshot list` bzw. PBS-GUI. - Hausmeister-Backup-Freshness-Check (geplant aus #105) sollte den neuen Host mit abdecken.
Author
Owner

Monitoring / Logging: in das zentrale Loki einbinden

Der neue Host darf KEINE Insel sein - Logs und Metriken muessen ins bestehende zentrale Monitoring, sonst bleibt wieder etwas monatelang unbemerkt (Lehre aus #105).

Bestehende Architektur

Komponente Wo
Loki (Log-Aggregation) CT110 (portainer), Monitoring-Host
Grafana grafana.orbitalo.net (CT143 Raspi-Broker)
Log-Shipping bei Clients Promtail (Vorbild: CT151 - Promtail + prometheus-node-exporter)
Loki-Push-Endpoint http://<CT110-Tailscale-IP>:3100/loki/api/v1/push (genaue IP aus CT-999-Doku ziehen)

Einzurichten auf dem neuen Host

  1. Promtail auf dem Proxmox-Host installieren -> schickt /var/log/syslog, journal, vzdump/Backup-Logs an Loki.
  2. prometheus-node-exporter auf dem Host (CPU/RAM/Disk/Temp/Netz), wie CT151.
  3. GPU-Metriken: nvidia-gpu-exporter (oder dcgm-exporter) fuer die RTX 3080 - Auslastung/Temperatur/VRAM, wichtig weil GPU zwischen Jellyfin (NVENC/NVDEC) und Uebersetzung (CUDA) geteilt wird.
  4. In den LXCs (Jellyfin, Uebersetzung): jeweils Promtail bzw. Log-Forwarding, damit App-Logs auch in Loki landen.
  5. Labels sauber setzen (host=<neuer-host>, service=jellyfin|translate) damit in Grafana filterbar.

Alerts (damit Ausfaelle auffallen)

  • ZFS-Pool degraded/Fehler (zpool status) -> Alert.
  • SMART-Warnung der Mirror-Platten (ST2000DM001!) -> Alert.
  • GPU-Temperatur/Ausfall -> Alert.
  • Backup-Job fehlgeschlagen / kein frisches Snapshot (greift in den Hausmeister-Freshness-Check aus #105).
  • Host/Service down -> Alert.

Hinweis

Die genaue CT110-Tailscale-IP + ob Promtail oder Grafana Alloy als Agent Standard ist, vor dem Einrichten aus der CT-999-Doku (container/ct-110-*.md) bzw. von CT151 als Vorlage uebernehmen.

## Monitoring / Logging: in das zentrale Loki einbinden Der neue Host darf KEINE Insel sein - Logs und Metriken muessen ins bestehende zentrale Monitoring, sonst bleibt wieder etwas monatelang unbemerkt (Lehre aus #105). ### Bestehende Architektur | Komponente | Wo | |---|---| | Loki (Log-Aggregation) | **CT110 (portainer)**, Monitoring-Host | | Grafana | grafana.orbitalo.net (CT143 Raspi-Broker) | | Log-Shipping bei Clients | **Promtail** (Vorbild: CT151 - Promtail + prometheus-node-exporter) | | Loki-Push-Endpoint | `http://<CT110-Tailscale-IP>:3100/loki/api/v1/push` (genaue IP aus CT-999-Doku ziehen) | ### Einzurichten auf dem neuen Host 1. **Promtail** auf dem Proxmox-Host installieren -> schickt `/var/log/syslog`, `journal`, vzdump/Backup-Logs an Loki. 2. **prometheus-node-exporter** auf dem Host (CPU/RAM/Disk/Temp/Netz), wie CT151. 3. **GPU-Metriken**: `nvidia-gpu-exporter` (oder `dcgm-exporter`) fuer die RTX 3080 - Auslastung/Temperatur/VRAM, wichtig weil GPU zwischen Jellyfin (NVENC/NVDEC) und Uebersetzung (CUDA) geteilt wird. 4. **In den LXCs** (Jellyfin, Uebersetzung): jeweils Promtail bzw. Log-Forwarding, damit App-Logs auch in Loki landen. 5. **Labels** sauber setzen (`host=<neuer-host>`, `service=jellyfin|translate`) damit in Grafana filterbar. ### Alerts (damit Ausfaelle auffallen) - ZFS-Pool degraded/Fehler (`zpool status`) -> Alert. - SMART-Warnung der Mirror-Platten (ST2000DM001!) -> Alert. - GPU-Temperatur/Ausfall -> Alert. - Backup-Job fehlgeschlagen / kein frisches Snapshot (greift in den Hausmeister-Freshness-Check aus #105). - Host/Service down -> Alert. ### Hinweis Die genaue CT110-Tailscale-IP + ob Promtail oder Grafana Alloy als Agent Standard ist, vor dem Einrichten aus der CT-999-Doku (`container/ct-110-*.md`) bzw. von CT151 als Vorlage uebernehmen.
Author
Owner

Monitoring / Logging: in das zentrale Loki einbinden

Der neue Host darf KEINE Insel sein - Logs und Metriken muessen ins bestehende zentrale Monitoring, sonst bleibt wieder etwas monatelang unbemerkt (Lehre aus #105).

Bestehende Architektur

Komponente Wo
Loki (Log-Aggregation) CT110 (portainer), Monitoring-Host
Grafana grafana.orbitalo.net (CT143 Raspi-Broker)
Log-Shipping bei Clients Promtail (Vorbild: CT151 - Promtail + prometheus-node-exporter)
Loki-Push-Endpoint http://<CT110-Tailscale-IP>:3100/loki/api/v1/push (genaue IP aus CT-999-Doku ziehen)

Einzurichten

  1. Promtail auf dem Proxmox-Host -> /var/log/syslog, journal, vzdump/Backup-Logs an Loki.
  2. prometheus-node-exporter auf dem Host (CPU/RAM/Disk/Temp/Netz), wie CT151.
  3. GPU-Metriken: nvidia-gpu-exporter (oder dcgm-exporter) fuer die RTX 3080 - Auslastung/Temp/VRAM, wichtig weil GPU zwischen Jellyfin (NVENC/NVDEC) und Uebersetzung (CUDA) geteilt wird.
  4. In jeder LXC (Jellyfin, Uebersetzung): Promtail bzw. Log-Forwarding, damit App-Logs in Loki landen.
  5. Labels sauber (host=<neuer-host>, service=jellyfin|translate).

Alerts

  • ZFS-Pool degraded/Fehler (zpool status)
  • SMART-Warnung der Mirror-Platten (ST2000DM001!)
  • GPU-Temperatur/Ausfall
  • Backup fehlgeschlagen / kein frisches Snapshot (Hausmeister-Freshness-Check aus #105)
  • Host/Service down

Genaue CT110-IP + ob Promtail oder Grafana Alloy Standard ist, vor dem Einrichten aus CT-999-Doku (container/ct-110-*.md) / CT151 als Vorlage.

## Monitoring / Logging: in das zentrale Loki einbinden Der neue Host darf KEINE Insel sein - Logs und Metriken muessen ins bestehende zentrale Monitoring, sonst bleibt wieder etwas monatelang unbemerkt (Lehre aus #105). ### Bestehende Architektur | Komponente | Wo | |---|---| | Loki (Log-Aggregation) | **CT110 (portainer)**, Monitoring-Host | | Grafana | grafana.orbitalo.net (CT143 Raspi-Broker) | | Log-Shipping bei Clients | **Promtail** (Vorbild: CT151 - Promtail + prometheus-node-exporter) | | Loki-Push-Endpoint | `http://<CT110-Tailscale-IP>:3100/loki/api/v1/push` (genaue IP aus CT-999-Doku ziehen) | ### Einzurichten 1. **Promtail** auf dem Proxmox-Host -> `/var/log/syslog`, journal, vzdump/Backup-Logs an Loki. 2. **prometheus-node-exporter** auf dem Host (CPU/RAM/Disk/Temp/Netz), wie CT151. 3. **GPU-Metriken**: `nvidia-gpu-exporter` (oder `dcgm-exporter`) fuer die RTX 3080 - Auslastung/Temp/VRAM, wichtig weil GPU zwischen Jellyfin (NVENC/NVDEC) und Uebersetzung (CUDA) geteilt wird. 4. **In jeder LXC** (Jellyfin, Uebersetzung): Promtail bzw. Log-Forwarding, damit App-Logs in Loki landen. 5. **Labels** sauber (`host=<neuer-host>`, `service=jellyfin|translate`). ### Alerts - ZFS-Pool degraded/Fehler (`zpool status`) - SMART-Warnung der Mirror-Platten (ST2000DM001!) - GPU-Temperatur/Ausfall - Backup fehlgeschlagen / kein frisches Snapshot (Hausmeister-Freshness-Check aus #105) - Host/Service down Genaue CT110-IP + ob Promtail oder Grafana Alloy Standard ist, vor dem Einrichten aus CT-999-Doku (`container/ct-110-*.md`) / CT151 als Vorlage.
Author
Owner

Tailscale in ALLE CTs (nicht nur auf den Host)

Jede CT des neuen Hosts kommt direkt ins Tailnet - eigene Tailscale-IP pro Container. Vorteil: Erreichbarkeit ohne DNAT/Port-Forwarding-Gefrickel, einheitlich mit dem restlichen Homelab, und auch das PBS (100.99.139.22) + Loki sind direkt erreichbar.

Technischer Stolperstein bei LXC

Tailscale braucht in der CT entweder ein /dev/net/tun-Device oder den Userspace-Modus:

Variante A - tun-Device durchreichen (empfohlen, volle Performance):
In die CT-Config (/etc/pve/lxc/<id>.conf) auf dem Host:

lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

Voraussetzung: tun-Modul auf dem Host geladen (modprobe tun, in /etc/modules). Funktioniert auch fuer unprivilegierte CTs.

Variante B - Userspace-Networking (ohne tun):
tailscaled --tun=userspace-networking - wie bereits bei immo-tracker im Einsatz. Einfacher, aber langsamer; nur wenn tun-Bind nicht moeglich.

Pro CT

  1. tun durchreichen (Variante A) bzw. Userspace (B).
  2. tailscale up --hostname=<sprechender-name> (z.B. jellyfin, translate).
  3. In OpenMemory + CT-999-Doku die vergebene Tailscale-IP eintragen.

Hinweis

Tailscale auf dem Host ist ohnehin Pflicht (fuer PBS-Backup, siehe #275). Zusaetzlich pro CT wie hier beschrieben.

## Tailscale in ALLE CTs (nicht nur auf den Host) Jede CT des neuen Hosts kommt direkt ins Tailnet - eigene Tailscale-IP pro Container. Vorteil: Erreichbarkeit ohne DNAT/Port-Forwarding-Gefrickel, einheitlich mit dem restlichen Homelab, und auch das PBS (`100.99.139.22`) + Loki sind direkt erreichbar. ### Technischer Stolperstein bei LXC Tailscale braucht in der CT entweder ein `/dev/net/tun`-Device oder den Userspace-Modus: **Variante A - tun-Device durchreichen (empfohlen, volle Performance):** In die CT-Config (`/etc/pve/lxc/<id>.conf`) auf dem Host: ``` lxc.cgroup2.devices.allow: c 10:200 rwm lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file ``` Voraussetzung: `tun`-Modul auf dem Host geladen (`modprobe tun`, in `/etc/modules`). Funktioniert auch fuer unprivilegierte CTs. **Variante B - Userspace-Networking (ohne tun):** `tailscaled --tun=userspace-networking` - wie bereits bei immo-tracker im Einsatz. Einfacher, aber langsamer; nur wenn tun-Bind nicht moeglich. ### Pro CT 1. tun durchreichen (Variante A) bzw. Userspace (B). 2. `tailscale up --hostname=<sprechender-name>` (z.B. `jellyfin`, `translate`). 3. In OpenMemory + CT-999-Doku die vergebene Tailscale-IP eintragen. ### Hinweis Tailscale auf dem Host ist ohnehin Pflicht (fuer PBS-Backup, siehe #275). Zusaetzlich pro CT wie hier beschrieben.
Author
Owner

Arbeitsteilung: Cline baut, Aufsicht verifiziert

Rollen

  • Du (physisch, Phase A): Platten einbauen, BIOS (VT-d/IOMMU aktivieren), Proxmox-ISO installieren, Host ins LAN. Das geht NICHT remote.
  • Cline (ab Phase B, remote): ZFS, NVIDIA-Treiber, LXC, GPU-Durchreichung, Tailscale, Promtail/Exporter, PBS-Anbindung - alles per SSH.
  • Aufsicht: verifiziert den Zustand unabhaengig (nicht Clines Eigenbericht vertrauen).

Zugang fuer Cline

1. SSH-Key (Rueckgrat, deckt 100% der Arbeit):

  • Auf dem KI-Server Keypair OHNE Passphrase erzeugen (sonst haengt Cline an der Abfrage): ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\proxmox_cline -N '""'
  • Public Key in ~/.ssh/authorized_keys auf dem neuen Host.
  • Defender-Ausnahme fuer ssh.exe ist bereits gesetzt (sonst Pipe-Haenger).

2. canvrno/ProxmoxMCP (Cline-nativ, fuer strukturierte CT-Ops + Status-Aufsicht):

  • Umhuellt nur die Proxmox-API -> gut fuer CT anlegen/start/stop, Status, Storage, Snapshots. OS-Shell-Arbeit (ZFS, Treiber) bleibt SSH!
  • Erst nach Phase A einrichtbar (braucht LAN-IP + API-Token).
  • API-Token auf dem Host: pveum user token add root@pam cline-mcp --privsep 0 (Homelab-einfach) bzw. dedizierter User/Role fuer Least-Privilege.
  • Repo auf KI-Server klonen, venv, in Cline cline_mcp_settings.json eintragen (Windows: .venv\Scripts\python.exe). ENV: PROXMOX_HOST=LAN-IP, PROXMOX_USER=root@pam, PROXMOX_TOKEN_NAME=cline-mcp, PROXMOX_TOKEN_VALUE=, PROXMOX_PORT=8006, PROXMOX_VERIFY_SSL=false.

STOPP-PUNKTE (Cline darf NICHT eigenmaechtig durchlaufen)

Bei diesen Schritten erst Plan/Befehl vorlegen, Freigabe abwarten, dann ausfuehren:

  1. zpool create (ZFS-Mirror) - loescht die Platten unwiderruflich.
  2. NVIDIA-Treiber + IOMMU/GRUB-Aenderung - falsch -> Host bootet nicht mehr.
    Diese Regel kommt beim Bau zusaetzlich in die .clinerules auf dem KI-Server.

Verifikation durch Aufsicht (nach jeder Phase, per SSH)

zpool status | nvidia-smi | tailscale status | PBS-Snapshot vorhanden | pct list / CT-Health.

## Arbeitsteilung: Cline baut, Aufsicht verifiziert ### Rollen - **Du (physisch, Phase A):** Platten einbauen, BIOS (VT-d/IOMMU aktivieren), Proxmox-ISO installieren, Host ins LAN. Das geht NICHT remote. - **Cline (ab Phase B, remote):** ZFS, NVIDIA-Treiber, LXC, GPU-Durchreichung, Tailscale, Promtail/Exporter, PBS-Anbindung - alles per SSH. - **Aufsicht:** verifiziert den Zustand unabhaengig (nicht Clines Eigenbericht vertrauen). ### Zugang fuer Cline **1. SSH-Key (Rueckgrat, deckt 100% der Arbeit):** - Auf dem KI-Server Keypair OHNE Passphrase erzeugen (sonst haengt Cline an der Abfrage): `ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\proxmox_cline -N '""'` - Public Key in `~/.ssh/authorized_keys` auf dem neuen Host. - Defender-Ausnahme fuer `ssh.exe` ist bereits gesetzt (sonst Pipe-Haenger). **2. canvrno/ProxmoxMCP (Cline-nativ, fuer strukturierte CT-Ops + Status-Aufsicht):** - Umhuellt nur die Proxmox-API -> gut fuer CT anlegen/start/stop, Status, Storage, Snapshots. OS-Shell-Arbeit (ZFS, Treiber) bleibt SSH! - Erst nach Phase A einrichtbar (braucht LAN-IP + API-Token). - API-Token auf dem Host: `pveum user token add root@pam cline-mcp --privsep 0` (Homelab-einfach) bzw. dedizierter User/Role fuer Least-Privilege. - Repo auf KI-Server klonen, venv, in Cline `cline_mcp_settings.json` eintragen (Windows: `.venv\Scripts\python.exe`). ENV: `PROXMOX_HOST`=LAN-IP, `PROXMOX_USER`=root@pam, `PROXMOX_TOKEN_NAME`=cline-mcp, `PROXMOX_TOKEN_VALUE`=<secret>, `PROXMOX_PORT`=8006, `PROXMOX_VERIFY_SSL`=false. ### STOPP-PUNKTE (Cline darf NICHT eigenmaechtig durchlaufen) Bei diesen Schritten erst Plan/Befehl vorlegen, Freigabe abwarten, dann ausfuehren: 1. **`zpool create` (ZFS-Mirror)** - loescht die Platten unwiderruflich. 2. **NVIDIA-Treiber + IOMMU/GRUB-Aenderung** - falsch -> Host bootet nicht mehr. Diese Regel kommt beim Bau zusaetzlich in die `.clinerules` auf dem KI-Server. ### Verifikation durch Aufsicht (nach jeder Phase, per SSH) `zpool status` | `nvidia-smi` | `tailscale status` | PBS-Snapshot vorhanden | `pct list` / CT-Health.
Author
Owner

Entscheidungen: RAM-Ausbau + Remote-Zugang

RAM (groesstes Problem, wird aufgeruestet)

Aktuell 16 GB - zu knapp (ZFS-ARC bis 50% + Jellyfin + Uebersetzungsmodell + LXCs).

Empfehlung: 2x 32 GB DDR4-3200 CL16 (= 64 GB), NICHT alle 4 Baenke bestuecken.

  • B550 = DDR4, 4 DIMM-Slots, Board-Max meist 128 GB (4x32).
  • Ryzen-IMC-Falle: 4 bestueckte Baenke (v.a. dual-rank) zwingen den Speichertakt runter (3200 -> 2667/2133) + Instabilitaet. 2 Sticks = voller Takt, stabil.
  • 2x 32 GB: Dual-Channel, voller Takt, 2 Baenke frei fuer spaeter.
  • Alte 2x8 GB NICHT dazumischen (Timings/Ranks -> Downclock/Instabilitaet) - sauberes 2-Stick-Kit.
  • BIOS: iGPU-UMA-Buffer minimal (5600G-iGPU ungenutzt, die RTX 3080 arbeitet) - sonst RAM-Verschwendung.
  • Mit 64 GB ARC nicht hart begrenzen noetig; bei nur 32 GB zfs_arc_max ~8-12 GB klemmen.
  • Minimal-Variante falls Budget: 2x 16 GB (32 GB) - loest die Klemme auch.

Remote-/Web-Zugang: Cloudflare-Tunnel (bewusst gewaehlt)

Nutzer kennt die CF-ToS-Thematik (Video ueber CDN) und nutzt CF-Tunnel bewusst, am liebsten im LAN an CF-Tunnel. Entscheidung: Cloudflared bleibt fuer den Zugang. Tailscale ist zusaetzlich vorhanden (alle CTs) als Fallback/Direktweg.

## Entscheidungen: RAM-Ausbau + Remote-Zugang ### RAM (groesstes Problem, wird aufgeruestet) Aktuell 16 GB - zu knapp (ZFS-ARC bis 50% + Jellyfin + Uebersetzungsmodell + LXCs). **Empfehlung: 2x 32 GB DDR4-3200 CL16 (= 64 GB), NICHT alle 4 Baenke bestuecken.** - B550 = DDR4, 4 DIMM-Slots, Board-Max meist 128 GB (4x32). - **Ryzen-IMC-Falle:** 4 bestueckte Baenke (v.a. dual-rank) zwingen den Speichertakt runter (3200 -> 2667/2133) + Instabilitaet. 2 Sticks = voller Takt, stabil. - 2x 32 GB: Dual-Channel, voller Takt, 2 Baenke frei fuer spaeter. - **Alte 2x8 GB NICHT dazumischen** (Timings/Ranks -> Downclock/Instabilitaet) - sauberes 2-Stick-Kit. - **BIOS: iGPU-UMA-Buffer minimal** (5600G-iGPU ungenutzt, die RTX 3080 arbeitet) - sonst RAM-Verschwendung. - Mit 64 GB ARC nicht hart begrenzen noetig; bei nur 32 GB `zfs_arc_max` ~8-12 GB klemmen. - Minimal-Variante falls Budget: 2x 16 GB (32 GB) - loest die Klemme auch. ### Remote-/Web-Zugang: Cloudflare-Tunnel (bewusst gewaehlt) Nutzer kennt die CF-ToS-Thematik (Video ueber CDN) und nutzt CF-Tunnel bewusst, am liebsten im LAN an CF-Tunnel. **Entscheidung: Cloudflared bleibt fuer den Zugang.** Tailscale ist zusaetzlich vorhanden (alle CTs) als Fallback/Direktweg.
Author
Owner

KORREKTUR GPU-Architektur: iGPU fuer Jellyfin, RTX 3080 nur fuer Uebersetzung

Loest das fruehere GPU-Sharing-Design ab. Statt die 3080 zwischen Jellyfin und Uebersetzung zu teilen, wird sauber getrennt:

Aufgabe GPU Schnittstelle
Jellyfin-Transcoding iGPU Vega 7 (im 5600G) VAAPI (/dev/dri/renderD128)
Echtzeit-Uebersetzung RTX 3080 (komplett dediziert) CUDA

Warum besser

  1. Keine GPU-Konkurrenz mehr - die latenzkritische Uebersetzung bekommt die ganze 3080, ein Transcode kann sie nicht ausbremsen. (Loest Risiko-Punkt #3.)
  2. Vega reicht fuer Heim-Jellyfin - 5600G/VCN kann H.264 + HEVC in HW en-/decodieren; AMD-iGPU + VAAPI ist Standard-Jellyfin-Setup.
  3. NVENC-Session-Limit hinfaellig - betraf nur GeForce; Jellyfin nutzt jetzt VAAPI, nicht NVENC. (Risiko-Punkt #4 entfaellt.)

Korrektur zur frueheren UMA-Empfehlung

Da die iGPU jetzt ARBEITET: UMA-Buffer NICHT minimal, sondern ~1-2 GB geben. Bei 64 GB RAM vernachlaessigbar.

Setup-Hinweise

  • BIOS: iGPU aktiv lassen (manche Boards deaktivieren die iGPU bei steckender dedizierter Karte -> auf 'iGPU enabled'/'IGD Multi-Monitor' achten).
  • Zwei getrennte GPU-Durchreichungen statt einer geteilten: /dev/dri/renderD128 in die Jellyfin-LXC, die 3080 (NVIDIA) in die Uebersetzungs-LXC.
  • NVIDIA-Treiber-Stack nur noch fuer die Uebersetzungs-LXC noetig; Jellyfin braucht nur Mesa/VAAPI.
## KORREKTUR GPU-Architektur: iGPU fuer Jellyfin, RTX 3080 nur fuer Uebersetzung **Loest das fruehere GPU-Sharing-Design ab.** Statt die 3080 zwischen Jellyfin und Uebersetzung zu teilen, wird sauber getrennt: | Aufgabe | GPU | Schnittstelle | |---|---|---| | Jellyfin-Transcoding | **iGPU Vega 7 (im 5600G)** | VAAPI (`/dev/dri/renderD128`) | | Echtzeit-Uebersetzung | **RTX 3080 (komplett dediziert)** | CUDA | ### Warum besser 1. **Keine GPU-Konkurrenz mehr** - die latenzkritische Uebersetzung bekommt die ganze 3080, ein Transcode kann sie nicht ausbremsen. (Loest Risiko-Punkt #3.) 2. **Vega reicht fuer Heim-Jellyfin** - 5600G/VCN kann H.264 + HEVC in HW en-/decodieren; AMD-iGPU + VAAPI ist Standard-Jellyfin-Setup. 3. **NVENC-Session-Limit hinfaellig** - betraf nur GeForce; Jellyfin nutzt jetzt VAAPI, nicht NVENC. (Risiko-Punkt #4 entfaellt.) ### Korrektur zur frueheren UMA-Empfehlung Da die iGPU jetzt ARBEITET: **UMA-Buffer NICHT minimal, sondern ~1-2 GB** geben. Bei 64 GB RAM vernachlaessigbar. ### Setup-Hinweise - BIOS: **iGPU aktiv lassen** (manche Boards deaktivieren die iGPU bei steckender dedizierter Karte -> auf 'iGPU enabled'/'IGD Multi-Monitor' achten). - **Zwei getrennte GPU-Durchreichungen** statt einer geteilten: `/dev/dri/renderD128` in die Jellyfin-LXC, die 3080 (NVIDIA) in die Uebersetzungs-LXC. - NVIDIA-Treiber-Stack nur noch fuer die Uebersetzungs-LXC noetig; Jellyfin braucht nur Mesa/VAAPI.
Author
Owner

RAM-Entscheidung final: 4x 16 GB = 64 GB (Server-Kontext)

Korrigiert die fruehere 2x32-Empfehlung. Fuer DIESEN Server ist 4x 16 GB voellig ok.

Warum die '4-Baenke-Warnung' hier NICHT zaehlt

Die Regel 'nicht alle 4 Baenke fuellen' ist ein Gamer-/Enthusiasten-Thema (FCLK/RAM-Takt fuer Frames). Dieser Host ist ein Server: Jellyfin-Transcoding laeuft auf der iGPU, ZFS + LXCs sind nicht speicherbandbreiten-empfindlich. Ob RAM mit 3200 oder 2667 laeuft, ist hier praktisch irrelevant. Der einzige reale Nachteil der 4 Baenke (Downclock) faellt damit weg.

Vorgaben

  1. Matched 4er-Kit kaufen (ein Paket, zusammen getestet), idealerweise single-rank - beste Stabilitaet bei 4 Modulen. KEINE zwei einzelnen 2x16-Kits mischen.
  2. Stabilitaet > Takt: Postet die Kiste mit 4 Riegeln nicht sauber auf 3200, im BIOS auf 2933/2667 - fuer den Server null Verlust.
  3. Kompromiss bewusst akzeptiert: alle Baenke voll = kein Erweitern mehr. 64 GB reichen fuer das Vorhaben aber locker.

Kontext

DDR4 ist 2026 am Auslaufen (Hersteller auf DDR5/HBM umgestiegen) -> Preise hoch (~450 EUR fuer 64 GB). 32-GB-Module haben Knappheitsaufpreis, daher kann 4x16 sogar guenstiger als 2x32 sein.

ZFS-ARC

Mit 64 GB ARC nicht zwingend klemmen noetig; bei Bedarf zfs_arc_max moderat setzen.

## RAM-Entscheidung final: 4x 16 GB = 64 GB (Server-Kontext) **Korrigiert die fruehere 2x32-Empfehlung.** Fuer DIESEN Server ist 4x 16 GB voellig ok. ### Warum die '4-Baenke-Warnung' hier NICHT zaehlt Die Regel 'nicht alle 4 Baenke fuellen' ist ein Gamer-/Enthusiasten-Thema (FCLK/RAM-Takt fuer Frames). Dieser Host ist ein **Server**: Jellyfin-Transcoding laeuft auf der iGPU, ZFS + LXCs sind nicht speicherbandbreiten-empfindlich. Ob RAM mit 3200 oder 2667 laeuft, ist hier praktisch irrelevant. Der einzige reale Nachteil der 4 Baenke (Downclock) faellt damit weg. ### Vorgaben 1. **Matched 4er-Kit** kaufen (ein Paket, zusammen getestet), idealerweise **single-rank** - beste Stabilitaet bei 4 Modulen. KEINE zwei einzelnen 2x16-Kits mischen. 2. **Stabilitaet > Takt:** Postet die Kiste mit 4 Riegeln nicht sauber auf 3200, im BIOS auf 2933/2667 - fuer den Server null Verlust. 3. Kompromiss bewusst akzeptiert: alle Baenke voll = **kein Erweitern** mehr. 64 GB reichen fuer das Vorhaben aber locker. ### Kontext DDR4 ist 2026 am Auslaufen (Hersteller auf DDR5/HBM umgestiegen) -> Preise hoch (~450 EUR fuer 64 GB). 32-GB-Module haben Knappheitsaufpreis, daher kann 4x16 sogar guenstiger als 2x32 sein. ### ZFS-ARC Mit 64 GB ARC nicht zwingend klemmen noetig; bei Bedarf `zfs_arc_max` moderat setzen.
Author
Owner

RAM-Entscheidung final (aktualisiert): erstmal bei 16 GB bleiben

DDR4 ist zu teuer (~450 EUR fuer 64 GB) -> Start mit den vorhandenen 16 GB, Upgrade spaeter.

Warum 16 GB hier machbar ist

Die schweren Brocken (Whisper/MT/TTS) liegen im VRAM der 3080, Jellyfin transcodet auf der iGPU. Der System-RAM muss also wenig stemmen: Host + ZFS-ARC + ein paar kleine LXCs.

PFLICHT bei 16 GB

  • zfs_arc_max hart klemmen auf ~2-3 GB (sonst greift ZFS per Default bis 8 GB als Cache -> wird eng). Medien-Pool braucht keinen grossen ARC.
    Setzen: /etc/modprobe.d/zfs.conf -> options zfs zfs_arc_max=3221225472 (3 GB), dann update-initramfs -u + reboot.
  • LXCs sparsam mit RAM bestuecken (klare Limits pro CT).
  • node-exporter -> Loki-Alert bei RAM-Druck/Swap (frueh sehen, bevor OOM-Killer zuschlaegt).
  • Kleines Swap/zram als Sicherheitsnetz, aber nicht als Dauerloesung.

Upgrade-Pfad (spaeter)

Bei Bedarf auf matched 4x 16 GB = 64 GB wechseln (siehe #286: Server-Kontext, Stabilitaet vor Takt). Vorhandene 16 GB werden dann ersetzt, nicht ergaenzt (Kit-Mischung vermeiden).

## RAM-Entscheidung final (aktualisiert): erstmal bei 16 GB bleiben DDR4 ist zu teuer (~450 EUR fuer 64 GB) -> Start mit den vorhandenen **16 GB**, Upgrade spaeter. ### Warum 16 GB hier machbar ist Die schweren Brocken (Whisper/MT/TTS) liegen im **VRAM der 3080**, Jellyfin transcodet auf der **iGPU**. Der System-RAM muss also wenig stemmen: Host + ZFS-ARC + ein paar kleine LXCs. ### PFLICHT bei 16 GB - **`zfs_arc_max` hart klemmen auf ~2-3 GB** (sonst greift ZFS per Default bis 8 GB als Cache -> wird eng). Medien-Pool braucht keinen grossen ARC. Setzen: `/etc/modprobe.d/zfs.conf` -> `options zfs zfs_arc_max=3221225472` (3 GB), dann `update-initramfs -u` + reboot. - **LXCs sparsam** mit RAM bestuecken (klare Limits pro CT). - **node-exporter -> Loki-Alert bei RAM-Druck/Swap** (frueh sehen, bevor OOM-Killer zuschlaegt). - Kleines Swap/zram als Sicherheitsnetz, aber nicht als Dauerloesung. ### Upgrade-Pfad (spaeter) Bei Bedarf auf **matched 4x 16 GB = 64 GB** wechseln (siehe #286: Server-Kontext, Stabilitaet vor Takt). Vorhandene 16 GB werden dann ersetzt, nicht ergaenzt (Kit-Mischung vermeiden).
Author
Owner

Plattenlayout aktualisiert: NVMe als Boot/System

Vorhandene Kingston NV3 PCIe-4.0 M.2 NVMe kommt rein - als Boot/OS/LXC-rootfs statt der SanDisk-SATA-SSD.

Finales Layout (aktualisiert)

Rolle Platte
Boot / System / LXC-rootfs Kingston NV3 NVMe (M.2)
Daten / Jellyfin-Medien 2x 2 TB ZFS-Mirror (RAID1)
Scratch/Spare (optional) SanDisk Ultra 250 GB SATA-SSD (freigeworden)

Wichtige Einschraenkung: 5600G = PCIe 3.0

Der 5600G (Cezanne-APU) kann nur PCIe 3.0, nicht 4.0. Die NV3 (4.0) laeuft also auf PCIe-3.0-Tempo (~3500 MB/s) statt ~6000. Kein Problem - immer noch ~6x schneller als SATA (550 MB/s); fuer einen Server irrelevant. (Gilt analog fuer die 3080: laeuft PCIe 3.0 x16, fuer den Workload ok.)

SanDisk 250 GB SATA-SSD (freigeworden)

Sinnvoll: Scratch/Downloads/Transcode-Temp (ungesichert) oder Cold Spare. NICHT als ZFS L2ARC/SLOG - bei 16 GB RAM kontraproduktiv (L2ARC frisst RAM zum Indizieren), Medien-Pool braucht kein SLOG.

Hinweis

Boot/System ist weiterhin Single-Disk (kein Mirror) - CT-Configs liegen via PBS-Backup sicher; Recovery = Proxmox neu + Restore. NV3-Kapazitaet noch zu klaeren (500GB/1TB/2TB) fuer LXC-rootfs-Dimensionierung.

## Plattenlayout aktualisiert: NVMe als Boot/System Vorhandene **Kingston NV3 PCIe-4.0 M.2 NVMe** kommt rein - als Boot/OS/LXC-rootfs statt der SanDisk-SATA-SSD. ### Finales Layout (aktualisiert) | Rolle | Platte | |---|---| | Boot / System / LXC-rootfs | **Kingston NV3 NVMe (M.2)** | | Daten / Jellyfin-Medien | 2x 2 TB ZFS-Mirror (RAID1) | | Scratch/Spare (optional) | SanDisk Ultra 250 GB SATA-SSD (freigeworden) | ### Wichtige Einschraenkung: 5600G = PCIe 3.0 Der **5600G (Cezanne-APU) kann nur PCIe 3.0**, nicht 4.0. Die NV3 (4.0) laeuft also auf **PCIe-3.0-Tempo (~3500 MB/s)** statt ~6000. Kein Problem - immer noch ~6x schneller als SATA (550 MB/s); fuer einen Server irrelevant. (Gilt analog fuer die 3080: laeuft PCIe 3.0 x16, fuer den Workload ok.) ### SanDisk 250 GB SATA-SSD (freigeworden) Sinnvoll: Scratch/Downloads/Transcode-Temp (ungesichert) oder Cold Spare. **NICHT** als ZFS L2ARC/SLOG - bei 16 GB RAM kontraproduktiv (L2ARC frisst RAM zum Indizieren), Medien-Pool braucht kein SLOG. ### Hinweis Boot/System ist weiterhin Single-Disk (kein Mirror) - CT-Configs liegen via PBS-Backup sicher; Recovery = Proxmox neu + Restore. NV3-Kapazitaet noch zu klaeren (500GB/1TB/2TB) fuer LXC-rootfs-Dimensionierung.
Author
Owner

NVMe-Aufteilung: 500 GB (Boot/System)

Kingston NV3 = 500 GB - fuer Boot/OS/LXC-rootfs mehr als ausreichend.

Aufteilung (Proxmox-Standard, LVM-thin)

Bereich Groesse
Proxmox-Root (/) ~40 GB
Swap ~8 GB (oder zram)
local-lvm Thin-Pool Rest ~440 GB (alle LXC-rootfs, Templates, ISOs)

Bei 5-8 Containern a 8-30 GB bleibt locker 60-70% frei.

Dateisystem: ext4/LVM-thin (NICHT ZFS-on-root)

Bei 16 GB RAM bewusst kein ZFS fuer den Boot-Datentraeger - ein zweiter ZFS-Pool wuerde zusaetzlich ARC/RAM fressen. ZFS bleibt nur fuer den Medien-Mirror. Boot-NVMe = Proxmox-Default ext4/LVM-thin.

Synergie mit der freien SanDisk

Jellyfin-Transcode-Temp + Downloads auf die SanDisk-SATA-SSD, nicht auf die NVMe. Transcoding ist schreibintensiv/ephemer -> schont die NVMe-Schreibzyklen, SanDisk ist schnell genug und ersetzbar.

Rollenverteilung Datentraeger final

  • NVMe 500 GB -> OS + Container (langlebig)
  • SanDisk 250 GB -> Transcode-Temp + Downloads (schreibintensiv, ersetzbar)
  • 2x 2 TB ZFS-Mirror -> Mediathek
## NVMe-Aufteilung: 500 GB (Boot/System) Kingston NV3 = **500 GB** - fuer Boot/OS/LXC-rootfs mehr als ausreichend. ### Aufteilung (Proxmox-Standard, LVM-thin) | Bereich | Groesse | |---|---| | Proxmox-Root (`/`) | ~40 GB | | Swap | ~8 GB (oder zram) | | `local-lvm` Thin-Pool | Rest ~440 GB (alle LXC-rootfs, Templates, ISOs) | Bei 5-8 Containern a 8-30 GB bleibt locker 60-70% frei. ### Dateisystem: ext4/LVM-thin (NICHT ZFS-on-root) Bei 16 GB RAM bewusst **kein** ZFS fuer den Boot-Datentraeger - ein zweiter ZFS-Pool wuerde zusaetzlich ARC/RAM fressen. ZFS bleibt nur fuer den Medien-Mirror. Boot-NVMe = Proxmox-Default ext4/LVM-thin. ### Synergie mit der freien SanDisk **Jellyfin-Transcode-Temp + Downloads auf die SanDisk-SATA-SSD**, nicht auf die NVMe. Transcoding ist schreibintensiv/ephemer -> schont die NVMe-Schreibzyklen, SanDisk ist schnell genug und ersetzbar. ### Rollenverteilung Datentraeger final - **NVMe 500 GB** -> OS + Container (langlebig) - **SanDisk 250 GB** -> Transcode-Temp + Downloads (schreibintensiv, ersetzbar) - **2x 2 TB ZFS-Mirror** -> Mediathek
Author
Owner

Phase-A-Detail: Proxmox-Install mit NUR der NVMe angesteckt

Waehrend der Proxmox-Installation SanDisk UND beide 2-TB-Platten physisch abklemmen - nur die NVMe dran lassen.

Warum

  1. Kein Vergreifen am Ziel - Installer listet alle Platten; mit nur einer Platte ist das Install-Ziel unmissverstaendlich.
  2. Sauberer Bootloader - EFI-Partition + Bootloader landen garantiert auf der NVMe (kein 'EFI auf falscher Platte'-Problem).
  3. ZFS-Mirror bewusst danach - 2-TB-Platten erst nach Install anschliessen, Mirror gezielt bauen (ist ohnehin Stopp-Punkt, loescht die Platten).

Ablauf

  1. Nur NVMe dran -> Proxmox installieren.
  2. Herunterfahren, SanDisk + 2x 2 TB anstecken.
  3. BIOS: Boot-Reihenfolge zeigt auf NVMe.
  4. ZFS-Mirror auf dem 2-TB-Paar bauen (Stopp-Punkt), SanDisk als Scratch einbinden.

Wichtig fuer zpool create

/dev/disk/by-id/... verwenden, NICHT /dev/sdX - sdX-Namen koennen sich nach Umstecken verschieben, by-id ist stabil (ZFS-Best-Practice).

## Phase-A-Detail: Proxmox-Install mit NUR der NVMe angesteckt Waehrend der Proxmox-Installation **SanDisk UND beide 2-TB-Platten physisch abklemmen** - nur die NVMe dran lassen. ### Warum 1. **Kein Vergreifen am Ziel** - Installer listet alle Platten; mit nur einer Platte ist das Install-Ziel unmissverstaendlich. 2. **Sauberer Bootloader** - EFI-Partition + Bootloader landen garantiert auf der NVMe (kein 'EFI auf falscher Platte'-Problem). 3. **ZFS-Mirror bewusst danach** - 2-TB-Platten erst nach Install anschliessen, Mirror gezielt bauen (ist ohnehin Stopp-Punkt, loescht die Platten). ### Ablauf 1. Nur NVMe dran -> Proxmox installieren. 2. Herunterfahren, SanDisk + 2x 2 TB anstecken. 3. BIOS: Boot-Reihenfolge zeigt auf NVMe. 4. ZFS-Mirror auf dem 2-TB-Paar bauen (Stopp-Punkt), SanDisk als Scratch einbinden. ### Wichtig fuer `zpool create` **`/dev/disk/by-id/...` verwenden, NICHT `/dev/sdX`** - sdX-Namen koennen sich nach Umstecken verschieben, by-id ist stabil (ZFS-Best-Practice).
Author
Owner

Medien-Strategie final: lokaler ZFS-Mirror + Sync (NICHT live von SMB)

Entscheidender Kontext: Der Samba-Medienserver haengt an USB-Platten, die wiederholt eingeschlafen sind / SMB nicht erreichbar - laeuft jetzt, aber 'nicht zu 100%'. Mediathek aktuell 1,6 TB.

Entscheidung

  1. Lokale Kopie auf dem Jellyfin-Host, Jellyfin liest NUR lokal. Damit immun gegen die USB-Schlafprobleme des Medienservers. SMB-Live-Mount ist damit VERWORFEN (zu unzuverlaessig als Live-Quelle).
  2. 2x 2 TB ZFS-Mirror behalten (korrigiert die zwischenzeitliche 'Einzelplatte reicht'-Idee): Die fruehere Annahme war eine zuverlaessige externe Quelle - die gibt es hier NICHT. Stirbt die einzelne (ausfallfreudige) ST2000DM001, muesste man 1,6 TB vom unzuverlaessigen SMB neu ziehen = kein verlaesslicher Notfallplan. Der Mirror haelt die lokale Kopie durch einen Plattenausfall am Leben, ohne Abhaengigkeit vom flackrigen SMB.
  3. Sync per rsync vom Medienserver (fehlertolerant, geplant) holt neue Filme, wenn die Quelle erreichbar ist. Jellyfin liest lokal, merkt nichts vom Quell-Zustand.

Kapazitaets-Warnung

1,6 TB auf 2 TB = ~80 % voll = ZFS-Komfortgrenze. Funktioniert fuer Medien noch, aber kaum Wachstum. Bei weiterem Wachstum groessere Platten einplanen.

Zukunftsoption

Dieser Host mit zuverlaessigem Mirror koennte mittelfristig die Primaerquelle werden, der USB-Bastel-Server das Backup (Rollentausch). Spaeter zu pruefen.

Datentraeger-Rollen (aktualisiert)

  • NVMe 500 GB -> OS + Container
  • SanDisk 250 GB -> Transcode-Temp + Downloads
  • 2x 2 TB ZFS-Mirror -> lokale Mediathek-Kopie (Jellyfin liest hier), Sync vom Medienserver
## Medien-Strategie final: lokaler ZFS-Mirror + Sync (NICHT live von SMB) Entscheidender Kontext: Der Samba-Medienserver haengt an **USB-Platten, die wiederholt eingeschlafen sind / SMB nicht erreichbar** - laeuft jetzt, aber 'nicht zu 100%'. Mediathek aktuell **1,6 TB**. ### Entscheidung 1. **Lokale Kopie auf dem Jellyfin-Host, Jellyfin liest NUR lokal.** Damit immun gegen die USB-Schlafprobleme des Medienservers. SMB-Live-Mount ist damit VERWORFEN (zu unzuverlaessig als Live-Quelle). 2. **2x 2 TB ZFS-Mirror behalten** (korrigiert die zwischenzeitliche 'Einzelplatte reicht'-Idee): Die fruehere Annahme war eine *zuverlaessige* externe Quelle - die gibt es hier NICHT. Stirbt die einzelne (ausfallfreudige) ST2000DM001, muesste man 1,6 TB vom unzuverlaessigen SMB neu ziehen = kein verlaesslicher Notfallplan. Der Mirror haelt die lokale Kopie durch einen Plattenausfall am Leben, ohne Abhaengigkeit vom flackrigen SMB. 3. **Sync per `rsync`** vom Medienserver (fehlertolerant, geplant) holt neue Filme, wenn die Quelle erreichbar ist. Jellyfin liest lokal, merkt nichts vom Quell-Zustand. ### Kapazitaets-Warnung 1,6 TB auf 2 TB = **~80 % voll** = ZFS-Komfortgrenze. Funktioniert fuer Medien noch, aber **kaum Wachstum**. Bei weiterem Wachstum groessere Platten einplanen. ### Zukunftsoption Dieser Host mit zuverlaessigem Mirror koennte mittelfristig die Primaerquelle werden, der USB-Bastel-Server das Backup (Rollentausch). Spaeter zu pruefen. ### Datentraeger-Rollen (aktualisiert) - NVMe 500 GB -> OS + Container - SanDisk 250 GB -> Transcode-Temp + Downloads - **2x 2 TB ZFS-Mirror -> lokale Mediathek-Kopie (Jellyfin liest hier), Sync vom Medienserver**
Author
Owner

KORREKTUR: Medien-Mirror = mdadm RAID1 + ext4 (ZFS raus, spart RAM)

ZFS kostet RAM (ARC) - bei 16 GB ein echter Posten. Loesung: Redundanz ohne ZFS.

Entscheidung

2x 2 TB als Linux mdadm RAID1 + ext4 statt ZFS-Mirror.

  • mdadm RAID1 kostet praktisch kein RAM (kein ARC; ext4 nutzt nur den normalen, sofort reclaimbaren Page-Cache). mdadm selbst nur ein paar MB Metadaten.
  • ZFS fliegt komplett aus dem System -> zfs_arc_max-Klemmen entfaellt, RAM-Druck an der Stelle weg.

Was wegfaellt (fuer diesen Fall wertlos)

ZFS-Checksums/Self-Healing, Snapshots, Kompression - Medien sind ersetzbar, Video ist schon komprimiert (ZFS-Compression ~0 Nutzen), Snapshots fuer Mediathek unnoetig.

Was bleibt

Redundanz: ueberlebt einen Plattenausfall. Genau das wird gebraucht, weil die SMB-Quelle unzuverlaessig ist.

Monitoring-Aequivalente (statt zpool status / scrub)

  • mdadm --monitor -> Alarm bei degraded Array (in Loki)
  • monatliches checkarray (Scrub-Aequivalent von mdraid)
  • SMART weiterhin auf beiden Platten (ST2000DM001!)

Anlage

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/disk/by-id/<d1> /dev/disk/by-id/<d2> (by-id!), dann mkfs.ext4 /dev/md0, mounten, Jellyfin liest hier; Sync per rsync vom Medienserver. Bleibt Stopp-Punkt (loescht Platten).

Datentraeger-Rollen final

  • NVMe 500 GB (ext4/LVM-thin) -> OS + Container
  • SanDisk 250 GB -> Transcode-Temp + Downloads
  • 2x 2 TB mdadm RAID1 + ext4 -> lokale Mediathek-Kopie

System ist damit komplett ZFS-frei.

## KORREKTUR: Medien-Mirror = mdadm RAID1 + ext4 (ZFS raus, spart RAM) ZFS kostet RAM (ARC) - bei 16 GB ein echter Posten. Loesung: **Redundanz ohne ZFS.** ### Entscheidung **2x 2 TB als Linux mdadm RAID1 + ext4** statt ZFS-Mirror. - mdadm RAID1 kostet **praktisch kein RAM** (kein ARC; ext4 nutzt nur den normalen, sofort reclaimbaren Page-Cache). mdadm selbst nur ein paar MB Metadaten. - **ZFS fliegt komplett aus dem System** -> `zfs_arc_max`-Klemmen entfaellt, RAM-Druck an der Stelle weg. ### Was wegfaellt (fuer diesen Fall wertlos) ZFS-Checksums/Self-Healing, Snapshots, Kompression - Medien sind ersetzbar, Video ist schon komprimiert (ZFS-Compression ~0 Nutzen), Snapshots fuer Mediathek unnoetig. ### Was bleibt Redundanz: ueberlebt einen Plattenausfall. Genau das wird gebraucht, weil die SMB-Quelle unzuverlaessig ist. ### Monitoring-Aequivalente (statt zpool status / scrub) - `mdadm --monitor` -> Alarm bei degraded Array (in Loki) - monatliches `checkarray` (Scrub-Aequivalent von mdraid) - SMART weiterhin auf beiden Platten (ST2000DM001!) ### Anlage `mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/disk/by-id/<d1> /dev/disk/by-id/<d2>` (by-id!), dann `mkfs.ext4 /dev/md0`, mounten, Jellyfin liest hier; Sync per rsync vom Medienserver. Bleibt Stopp-Punkt (loescht Platten). ### Datentraeger-Rollen final - NVMe 500 GB (ext4/LVM-thin) -> OS + Container - SanDisk 250 GB -> Transcode-Temp + Downloads - 2x 2 TB **mdadm RAID1 + ext4** -> lokale Mediathek-Kopie **System ist damit komplett ZFS-frei.**
Author
Owner

FINAL: Einzelplatte 1x 2 TB ext4 (kein RAID, kein ZFS)

Entscheidung: eine Platte reicht. RAID1 ist fuer eine temporaere, bald zu ersetzende Platte, die nur eine Kopie haelt (Master liegt auf dem Medienserver), Over-Engineering.

Setup

  • 1x 2 TB ext4 -> lokale Mediathek-Kopie, Jellyfin liest hier.
  • rsync-Sync vom Medienserver holt neue Filme (fehlertolerant).
  • Kein mdadm, kein ZFS. Simpelst.

Bewusst akzeptierter Trade-off

Platte stirbt -> lokale Kopie weg -> 1,6 TB neu vom SMB ziehen (laestig, aber kein Datenverlust, Master bleibt).

Kapazitaet unkritisch

Auf ext4 ist die 80%-Grenze irrelevant (war nur ZFS-Thema) - laeuft bis ~95% problemlos. 1,6 TB auf 2 TB ok. Bei Wachstum gegen groessere Platte tauschen (so ohnehin geplant).

Optional: 2. Platte als Cold Spare

Zweite 2-TB-Platte in die Schublade als Cold Spare - stirbt die aktive ST2000DM001, Spare rein + re-syncen, ohne erst kaufen zu muessen. Null Betriebsaufwand. Optional.

Datentraeger-Rollen final

  • NVMe 500 GB (ext4/LVM-thin) -> OS + Container
  • SanDisk 250 GB -> Transcode-Temp + Downloads
  • 1x 2 TB ext4 -> lokale Mediathek (2. Platte = optional Cold Spare)

System komplett ZFS-frei UND RAID-frei. Maximal einfach.

## FINAL: Einzelplatte 1x 2 TB ext4 (kein RAID, kein ZFS) Entscheidung: **eine Platte reicht.** RAID1 ist fuer eine temporaere, bald zu ersetzende Platte, die nur eine *Kopie* haelt (Master liegt auf dem Medienserver), Over-Engineering. ### Setup - **1x 2 TB ext4** -> lokale Mediathek-Kopie, Jellyfin liest hier. - **rsync-Sync** vom Medienserver holt neue Filme (fehlertolerant). - Kein mdadm, kein ZFS. Simpelst. ### Bewusst akzeptierter Trade-off Platte stirbt -> lokale Kopie weg -> 1,6 TB neu vom SMB ziehen (laestig, aber **kein Datenverlust**, Master bleibt). ### Kapazitaet unkritisch Auf ext4 ist die 80%-Grenze irrelevant (war nur ZFS-Thema) - laeuft bis ~95% problemlos. 1,6 TB auf 2 TB ok. Bei Wachstum gegen groessere Platte tauschen (so ohnehin geplant). ### Optional: 2. Platte als Cold Spare Zweite 2-TB-Platte in die Schublade als Cold Spare - stirbt die aktive ST2000DM001, Spare rein + re-syncen, ohne erst kaufen zu muessen. Null Betriebsaufwand. Optional. ### Datentraeger-Rollen final - NVMe 500 GB (ext4/LVM-thin) -> OS + Container - SanDisk 250 GB -> Transcode-Temp + Downloads - **1x 2 TB ext4 -> lokale Mediathek** (2. Platte = optional Cold Spare) **System komplett ZFS-frei UND RAID-frei. Maximal einfach.**
Author
Owner

KORREKTUR Storage (ueberschreibt #291/#292/#293) - Medien liegen auf bestehendem RAID, NICHT lokal

Wichtige Klarstellung vom Nutzer + Supervisor-Verifikation (14.06.2026, 20:00). Die gesamte vorherige Storage-Saga (lokale 2-TB-Platte, mdadm, ZFS, ext4, rsync-Kopie) ging von einer falschen Annahme aus und ist damit hinfaellig.

Tatsaechliche Lage (verifiziert)

  • Die Jellyfin-Medien liegen auf einem RAID mit grossen Server-Platten in einem USB-Gehaeuse, das aktuell an optiplex2 (192.168.178.170) haengt und dort als SMB-Share Medien ("Medienfestplatte fuer Jellyfin") bereitgestellt wird.
  • Groesse: ~14,9 TB gesamt, ~11 TB frei (~4 TB belegt). Inhalt u.a.: Recorded TV, Heimatfilme, Youtube, Filme zum nachbearbeiten, KI Modelle.
  • Es existiert eine aktive .keepalive (heute aktualisiert) -> gegen das alte USB-Einschlaf-Problem laeuft bereits ein Keepalive.
  • Der neue Host (192.168.178.40) konnte den Share bereits read-only als Guest (vers=3.0, kein PW) lesen. Das ist exakt die dokumentierte alte Jellyfin-Quelle (alter Host: /mnt/nas, /srv/media -> //192.168.178.170/Medien).

Entscheidung / Plan (fuer spaeter)

Das USB-Gehaeuse wird direkt an den neuen Jellyfin-Host umgesteckt (USB-Kabel von optiplex2 ab, an den neuen Server dran). Dann liest Jellyfin lokal statt uebers Netz - einfachste Loesung, kein lokaler Kopier-/Sync-Schritt noetig.

Bei Anschluss am neuen Host (Supervisor, read-only, VOR jeglichem Mount):

  1. lsblk -> ein Device = Hardware-RAID; zwei Devices = JBOD.
  2. Dateisystem + Lesbarkeit der Filme pruefen, SMART (soweit die USB-Bridge es durchreicht).
  3. Read-only mounten (ro,_netdev,iocharset=utf8,x-systemd.automount), Jellyfin-Bibliotheken auf die Unterordner zeigen.
  • Es wird nichts formatiert -> der frueherer Stopp-Punkt "Plattenformatierung" entfaellt fuer dieses Vorhaben.

WICHTIGER HAKEN beim Umstecken (Abhaengigkeiten brechen!)

Auf genau dieser Platte liegen nicht nur Filme. Wird sie von optiplex2 abgezogen, brechen weg:

  • KI Modelle -> wird von CT-146 (model-library) per SMB gemountet (//192.168.178.170/Medien/KI Modelle -> /mnt/ki-modelle).
  • Filme zum nachbearbeiten -> Ziel des SaveTV-Sync (stuendlicher Cron vom alten Jellyfin-Host bzw. CT 116-Pipeline).

-> Vor/parallel zum Umstecken klaeren: Sollen diese beiden Funktionen mit auf den neuen Host umziehen (neuer Share/Mount-Pfad) oder werden sie eingestellt? Sonst laufen CT-146 und SaveTV ins Leere.

Status

  • Phase B (System-Setup) laeuft unabhaengig davon weiter (Cline).
  • Storage-Schritt = nur noch "USB-Gehaeuse anstecken + read-only mounten" statt Plattenbau. Wartet auf physisches Umstecken durch den Nutzer.
## KORREKTUR Storage (ueberschreibt #291/#292/#293) - Medien liegen auf bestehendem RAID, NICHT lokal Wichtige Klarstellung vom Nutzer + Supervisor-Verifikation (14.06.2026, 20:00). Die gesamte vorherige Storage-Saga (lokale 2-TB-Platte, mdadm, ZFS, ext4, rsync-Kopie) ging von einer **falschen Annahme** aus und ist damit **hinfaellig**. ### Tatsaechliche Lage (verifiziert) - Die Jellyfin-Medien liegen auf einem **RAID mit grossen Server-Platten in einem USB-Gehaeuse**, das aktuell an **`optiplex2` (192.168.178.170)** haengt und dort als SMB-Share `Medien` ("Medienfestplatte fuer Jellyfin") bereitgestellt wird. - Groesse: **~14,9 TB gesamt, ~11 TB frei (~4 TB belegt)**. Inhalt u.a.: Recorded TV, Heimatfilme, Youtube, `Filme zum nachbearbeiten`, `KI Modelle`. - Es existiert eine aktive `.keepalive` (heute aktualisiert) -> gegen das alte USB-Einschlaf-Problem laeuft bereits ein Keepalive. - Der neue Host (192.168.178.40) konnte den Share bereits read-only als Guest (vers=3.0, kein PW) lesen. Das ist exakt die **dokumentierte alte Jellyfin-Quelle** (alter Host: `/mnt/nas`, `/srv/media` -> `//192.168.178.170/Medien`). ### Entscheidung / Plan (fuer spaeter) **Das USB-Gehaeuse wird direkt an den neuen Jellyfin-Host umgesteckt** (USB-Kabel von optiplex2 ab, an den neuen Server dran). Dann liest Jellyfin **lokal** statt uebers Netz - einfachste Loesung, kein lokaler Kopier-/Sync-Schritt noetig. Bei Anschluss am neuen Host (Supervisor, read-only, VOR jeglichem Mount): 1. `lsblk` -> ein Device = Hardware-RAID; zwei Devices = JBOD. 2. Dateisystem + Lesbarkeit der Filme pruefen, SMART (soweit die USB-Bridge es durchreicht). 3. **Read-only** mounten (`ro,_netdev,iocharset=utf8,x-systemd.automount`), Jellyfin-Bibliotheken auf die Unterordner zeigen. - Es wird **nichts formatiert** -> der frueherer Stopp-Punkt "Plattenformatierung" entfaellt fuer dieses Vorhaben. ### WICHTIGER HAKEN beim Umstecken (Abhaengigkeiten brechen!) Auf genau dieser Platte liegen **nicht nur Filme**. Wird sie von optiplex2 abgezogen, brechen weg: - `KI Modelle` -> wird von **CT-146 (model-library)** per SMB gemountet (`//192.168.178.170/Medien/KI Modelle` -> `/mnt/ki-modelle`). - `Filme zum nachbearbeiten` -> Ziel des **SaveTV-Sync** (stuendlicher Cron vom alten Jellyfin-Host bzw. CT 116-Pipeline). -> Vor/parallel zum Umstecken klaeren: Sollen diese beiden Funktionen mit auf den neuen Host umziehen (neuer Share/Mount-Pfad) oder werden sie eingestellt? Sonst laufen CT-146 und SaveTV ins Leere. ### Status - Phase B (System-Setup) laeuft unabhaengig davon weiter (Cline). - Storage-Schritt = nur noch "USB-Gehaeuse anstecken + read-only mounten" statt Plattenbau. Wartet auf physisches Umstecken durch den Nutzer.
Author
Owner

Phase D+E (GPU) ABGESCHLOSSEN + Lehre (Supervisor-verifiziert, 14.06.2026 ~21:40)

NVIDIA-Treiber laeuft, GPU-Trennung steht. War der zaeheste Teil - mehrere Sackgassen, daher hier die Lehre festgehalten.

Endstand (unabhaengig verifiziert)

Check Ergebnis
Treiber NVIDIA 580.126.09 (Open-Module via DKMS), CUDA 13.0
nvidia-smi RTX 3080, 10 GB
CUDA-Faehigkeit /dev/nvidia-uvm vorhanden ✓
DKMS nvidia/580.126.09, 6.14.11-9-pve: installed
Kernel 6.14.11-9-pve - gepinnt (proxmox-boot-tool kernel pin)
Secure Boot disabled
Jellyfin VAAPI AMD Vega iGPU = /dev/dri/renderD128 (by-path pci-0000:30:00.0-render)
Uebersetzung RTX 3080 = /dev/nvidia0 + /dev/dri/renderD129 (CUDA)
Kernel-Cmdline kein VFIO/IOMMU/GRUB-Eingriff (LXC-Sharing-Ansatz)

LEHRE - fuer den naechsten GPU-Host nicht wiederholen

  1. Kernel zu neu = kein NVIDIA-Treiber baut. Der Proxmox-Default-Kernel 7.0.x (Build 05/2026) liess KEINEN Treiber bauen (550/570/580 scheiterten an zone_device_page_init / __vm_flags / in_irq - Kernel-APIs neuer als alle aktuellen Treiber).
    -> VOR NVIDIA-Install auf stabilen 6.14.11-9-pve wechseln (apt install proxmox-kernel-6.14), booten, dann PINNEN (proxmox-boot-tool kernel pin 6.14.11-9-pve). Ohne Pin bootet das naechste apt upgrade wieder 7.0 -> GPU tot.
  2. Secure Boot AUS (BIOS) - sonst laedt das unsignierte Modul nicht (war in Phase A vorgesehen, war aber an).
  3. nvidia-uvm NIEMALS weglassen. --no-unified-memory (vom Bauenden zwischenzeitlich als Workaround genutzt) ist Selbstbetrug: ohne uvm kein CUDA -> Uebersetzungs-Pipeline startet gar nicht. uvm ist Pflicht.
  4. Render-Node-Nummern verschieben sich nach dem Treiberwechsel (nouveau->proprietaer). Immer via readlink -f /dev/dri/by-path/pci-0000:30:00.0-render pruefen, nicht hardcoden. -> Jellyfin auf renderD128.
  5. Installationsweg: .run-Installer --silent --dkms --kernel-module-type=open --no-x-check (Debian-non-free-Paket war zu alt).

Naechste Schritte

  • Jellyfin-LXC (renderD128/VAAPI + Medien), Uebersetzungs-LXC (3080/CUDA, #103), Storage (USB-RAID umstecken - Abhaengigkeiten CT-146/SaveTV beachten, siehe #issuecomment-303), dann Cloudflared/Monitoring/PBS/Doku.
## Phase D+E (GPU) ABGESCHLOSSEN + Lehre (Supervisor-verifiziert, 14.06.2026 ~21:40) NVIDIA-Treiber laeuft, GPU-Trennung steht. War der zaeheste Teil - mehrere Sackgassen, daher hier die Lehre festgehalten. ### Endstand (unabhaengig verifiziert) | Check | Ergebnis | |---|---| | Treiber | **NVIDIA 580.126.09** (Open-Module via DKMS), CUDA 13.0 | | `nvidia-smi` | RTX 3080, 10 GB | | CUDA-Faehigkeit | `/dev/nvidia-uvm` vorhanden ✓ | | DKMS | `nvidia/580.126.09, 6.14.11-9-pve: installed` | | Kernel | `6.14.11-9-pve` - **gepinnt** (`proxmox-boot-tool kernel pin`) | | Secure Boot | **disabled** | | Jellyfin VAAPI | AMD Vega iGPU = **`/dev/dri/renderD128`** (by-path pci-0000:30:00.0-render) | | Uebersetzung | RTX 3080 = `/dev/nvidia0` + `/dev/dri/renderD129` (CUDA) | | Kernel-Cmdline | kein VFIO/IOMMU/GRUB-Eingriff (LXC-Sharing-Ansatz) | ### LEHRE - fuer den naechsten GPU-Host nicht wiederholen 1. **Kernel zu neu = kein NVIDIA-Treiber baut.** Der Proxmox-Default-Kernel **7.0.x** (Build 05/2026) liess KEINEN Treiber bauen (550/570/580 scheiterten an `zone_device_page_init` / `__vm_flags` / `in_irq` - Kernel-APIs neuer als alle aktuellen Treiber). -> **VOR NVIDIA-Install** auf stabilen **6.14.11-9-pve** wechseln (`apt install proxmox-kernel-6.14`), booten, dann **PINNEN** (`proxmox-boot-tool kernel pin 6.14.11-9-pve`). Ohne Pin bootet das naechste `apt upgrade` wieder 7.0 -> GPU tot. 2. **Secure Boot AUS** (BIOS) - sonst laedt das unsignierte Modul nicht (war in Phase A vorgesehen, war aber an). 3. **nvidia-uvm NIEMALS weglassen.** `--no-unified-memory` (vom Bauenden zwischenzeitlich als Workaround genutzt) ist Selbstbetrug: ohne uvm kein CUDA -> Uebersetzungs-Pipeline startet gar nicht. uvm ist Pflicht. 4. **Render-Node-Nummern verschieben sich** nach dem Treiberwechsel (nouveau->proprietaer). Immer via `readlink -f /dev/dri/by-path/pci-0000:30:00.0-render` pruefen, nicht hardcoden. -> Jellyfin auf renderD128. 5. Installationsweg: **.run-Installer** `--silent --dkms --kernel-module-type=open --no-x-check` (Debian-non-free-Paket war zu alt). ### Naechste Schritte - Jellyfin-LXC (renderD128/VAAPI + Medien), Uebersetzungs-LXC (3080/CUDA, #103), Storage (USB-RAID umstecken - Abhaengigkeiten CT-146/SaveTV beachten, siehe #issuecomment-303), dann Cloudflared/Monitoring/PBS/Doku.
Author
Owner

Nutzer-Entscheidungen 15.06.2026 (Supervisor-dokumentiert) + Phase B verifiziert

Supervisor-Abnahme Phase B (unabhaengig per SSH gegengeprueft, nicht Eigenbericht)

Alles bestaetigt: pve-jervais, PVE 9.2.3, Kernel 6.14.11-9-pve gepinnt, Tailscale 100.67.193.113, NVIDIA 580.126.09 (3080, CUDA 13.0, nvidia0/ctl/uvm da), DKMS installed, iGPU renderD128 (pci 30:00.0) / 3080 renderD129 (pci 10:00.0), authorized_keys=3 (KI-Server ed25519 + pve-hetzner rsa + root@pve), Repos no-subscription, NTP Europe/Berlin, kein VFIO in cmdline. Keine Abweichung.


3 Entscheidungen vom Nutzer

1. Jellyfin bauen - mit ALLEN bisherigen Funktionen, Medien wieder als Samba im LAN

  • Jellyfin-LXC auf pve-jervais (renderD128/VAAPI). Ziel: Funktionsgleich zum alten Docker-Jellyfin (10.9.11 auf debian-jellyfin-homeassistent / .149) -> Config/DB migrieren (Nutzer, Watch-State, Bibliotheken, Plugins) statt blanker Neuinstallation.
  • Das USB-RAID-Gehaeuse zieht von optiplex2 (.170) auf pve-jervais (.40) um (physisch, durch Nutzer). pve-jervais mountet die Medien lokal (Jellyfin liest lokal) UND re-exportiert sie als Samba-Share Medien im LAN -> ersetzt die bisherige Freigabe von optiplex2.
  • Empfehlung Supervisor: Samba in einer LXC laufen lassen (Gehaeuse auf Host mounten, per bind-mount in Jellyfin- bzw. Samba-LXC), Host bleibt sauber. Share-Name Medien + Gast/ro wie bisher beibehalten, damit Clients nur die IP wechseln.

2. SaveTV-Projekt loeschen (hat nie zuverlaessig funktioniert)

  • Komplette selbstgebaute SaveTV-Pipeline auf CT 116 entfernen: savetv-web.service (Port 8765/extern 9443), savetv_extra_routes.py-Hook im Git-Repo homelab-brain/homelab-ai-bot/, zugehoerige Cron-Jobs, Staging-Ordner Filme zum nachbearbeiten.
  • Achtung Deploy-Workflow CT116: Auto-Sync aus -> im Git-Repo entfernen -> commit + sofort push -> Service neu starten -> Sync wieder an.

3. Funktion "KI Modelle sammeln" zieht um

  • CT 146 (model-library, pve-mu-3) mountet aktuell //192.168.178.170/Medien/KI Modelle -> /mnt/ki-modelle. Da das Gehaeuse auf pve-jervais umzieht, muss dieser Mount auf die neue Samba-Freigabe auf pve-jervais (.40) umgestellt werden (Pfad KI Modelle bleibt auf der Platte). Daten ziehen mit dem Gehaeuse mit, nur das Mount-Ziel aendert sich.

KRITISCH vor dem physischen Umstecken (.170 -> .40)

Der SMB-Server-Wechsel von 192.168.178.170 -> 192.168.178.40 bricht ALLE Clients, die \\192.168.178.170\Medien mounten. Vor dem Abziehen ENUMERIEREN + umpunkten:

  • altes Jellyfin (.149) - wird ohnehin abgeloest (nur Jellyfin-Container dort raus; Host bleibt fuer HA/Nextcloud/zigbee2mqtt/Grafana etc.).
  • CT 146 (KI Modelle) -> Punkt 3.
  • SaveTV -> entfaellt (Punkt 2).
  • Weitere Clients pruefen, bevor optiplex2 die Platte verliert. (optiplex2-Rolle danach klaeren - ggf. frei.)

optiplex2-Share aktuell: Samba 4.17.12, Share Medien ("Medienfestplatte fuer Jellyfin"), Gast/kein PW, ~14,9 TB (~11 TB frei).

Rollen

Cline baut (Jellyfin-LXC, Samba-Re-Export, SaveTV-Removal, CT146-Ummount). Supervisor verifiziert nach jeder Phase + ueberwacht. Physisches Umstecken des Gehaeuses = Nutzer.

## Nutzer-Entscheidungen 15.06.2026 (Supervisor-dokumentiert) + Phase B verifiziert ### Supervisor-Abnahme Phase B (unabhaengig per SSH gegengeprueft, nicht Eigenbericht) Alles bestaetigt: pve-jervais, PVE 9.2.3, Kernel **6.14.11-9-pve gepinnt**, Tailscale **100.67.193.113**, NVIDIA **580.126.09** (3080, CUDA 13.0, nvidia0/ctl/uvm da), DKMS installed, iGPU renderD128 (pci 30:00.0) / 3080 renderD129 (pci 10:00.0), authorized_keys=3 (KI-Server ed25519 + pve-hetzner rsa + root@pve), Repos no-subscription, NTP Europe/Berlin, kein VFIO in cmdline. **Keine Abweichung.** --- ### 3 Entscheidungen vom Nutzer **1. Jellyfin bauen - mit ALLEN bisherigen Funktionen, Medien wieder als Samba im LAN** - Jellyfin-LXC auf pve-jervais (renderD128/VAAPI). Ziel: Funktionsgleich zum alten Docker-Jellyfin (10.9.11 auf debian-jellyfin-homeassistent / .149) -> **Config/DB migrieren** (Nutzer, Watch-State, Bibliotheken, Plugins) statt blanker Neuinstallation. - Das **USB-RAID-Gehaeuse zieht von optiplex2 (.170) auf pve-jervais (.40) um** (physisch, durch Nutzer). pve-jervais mountet die Medien lokal (Jellyfin liest lokal) UND **re-exportiert sie als Samba-Share `Medien` im LAN** -> ersetzt die bisherige Freigabe von optiplex2. - Empfehlung Supervisor: Samba in einer LXC laufen lassen (Gehaeuse auf Host mounten, per bind-mount in Jellyfin- bzw. Samba-LXC), Host bleibt sauber. Share-Name `Medien` + Gast/ro wie bisher beibehalten, damit Clients nur die IP wechseln. **2. SaveTV-Projekt loeschen** (hat nie zuverlaessig funktioniert) - Komplette selbstgebaute SaveTV-Pipeline auf **CT 116** entfernen: `savetv-web.service` (Port 8765/extern 9443), `savetv_extra_routes.py`-Hook im Git-Repo `homelab-brain/homelab-ai-bot/`, zugehoerige Cron-Jobs, Staging-Ordner `Filme zum nachbearbeiten`. - Achtung Deploy-Workflow CT116: Auto-Sync aus -> im Git-Repo entfernen -> commit + **sofort push** -> Service neu starten -> Sync wieder an. **3. Funktion "KI Modelle sammeln" zieht um** - **CT 146 (model-library, pve-mu-3)** mountet aktuell `//192.168.178.170/Medien/KI Modelle` -> `/mnt/ki-modelle`. Da das Gehaeuse auf pve-jervais umzieht, muss dieser Mount auf die **neue Samba-Freigabe auf pve-jervais (.40)** umgestellt werden (Pfad `KI Modelle` bleibt auf der Platte). Daten ziehen mit dem Gehaeuse mit, nur das Mount-Ziel aendert sich. --- ### KRITISCH vor dem physischen Umstecken (.170 -> .40) Der SMB-Server-Wechsel von **192.168.178.170 -> 192.168.178.40** bricht ALLE Clients, die `\\192.168.178.170\Medien` mounten. Vor dem Abziehen ENUMERIEREN + umpunkten: - altes Jellyfin (.149) - wird ohnehin abgeloest (nur Jellyfin-Container dort raus; Host bleibt fuer HA/Nextcloud/zigbee2mqtt/Grafana etc.). - CT 146 (KI Modelle) -> Punkt 3. - SaveTV -> entfaellt (Punkt 2). - **Weitere Clients pruefen**, bevor optiplex2 die Platte verliert. (optiplex2-Rolle danach klaeren - ggf. frei.) optiplex2-Share aktuell: Samba 4.17.12, Share `Medien` ("Medienfestplatte fuer Jellyfin"), Gast/kein PW, ~14,9 TB (~11 TB frei). ### Rollen Cline baut (Jellyfin-LXC, Samba-Re-Export, SaveTV-Removal, CT146-Ummount). Supervisor verifiziert nach jeder Phase + ueberwacht. Physisches Umstecken des Gehaeuses = Nutzer.
Author
Owner

Ausfuehrungsreihenfolge HEUTE (Nutzer-Entscheidung 15.06.2026)

Jellyfin wird ZUERST gebaut, Platten-Umzug erst danach. Staged, damit der Medien-Cutover vom funktionierenden Jellyfin entkoppelt ist.

Reihenfolge

  1. SaveTV-Cron auf .149 stoppen (root-crontab savetv_sync.py auskommentieren) - vor allem anderen.
  2. Cline: Jellyfin-LXC bauen (jetzt, Platte bleibt noch an optiplex2 .170):
    • Config/DB vom alten Docker-Jellyfin (.149, v10.9.11) migrieren -> Nutzer, Watch-State, Bibliotheken, Plugins erhalten.
    • Medien vorerst per CIFS von //192.168.178.170/Medien mounten.
    • KRITISCH: Medien im Container an STABILEM Pfad (z.B. /media). Beim spaeteren Platten-Umzug wird NUR das Backing an genau diesem Pfad von CIFS(.170) auf lokalen bind-mount getauscht -> Library-DB bleibt gueltig, kein Re-Scan/Verlust von Watch-State.
    • VAAPI: altes HW-Transcoding lief auf Intel-iGPU; auf pve-jervais ist renderD128 die AMD Vega -> HW-Transcoding NEU verifizieren, nicht annehmen.
  3. Supervisor verifiziert Jellyfin (Nutzer/Watch-State/Bibliotheken/VAAPI auf AMD).
  4. DANACH (Nutzer): Platte physisch von .170 -> .40 umstecken.
  5. Auf .40: Platte identifizieren (lsblk/FS), erst read-only mounten + Lesbarkeit pruefen, dann bind-mount am selben Container-Pfad.
  6. Cline: Samba auf .40 (Share Medien, Gast/ro) -> LAN.
  7. Clients umpunkten .170->.40: CT146 fstab (/mnt/ki-modelle), KI-Server Laufwerk Z:. (SaveTV entfaellt, alt-JF wird abgeloest.)
  8. CT-999-Doku + OpenMemory aktualisieren.

.170-Clients (vor Umzug bekannt)

alt-JF .149 (3x CIFS /mnt/nas,/mnt/nas_filme,/srv/media) | CT146 /mnt/ki-modelle | KI-Server Z: | SaveTV (gel.). Keine weiteren in der Doku.

## Ausfuehrungsreihenfolge HEUTE (Nutzer-Entscheidung 15.06.2026) **Jellyfin wird ZUERST gebaut, Platten-Umzug erst danach.** Staged, damit der Medien-Cutover vom funktionierenden Jellyfin entkoppelt ist. ### Reihenfolge 1. **SaveTV-Cron auf .149 stoppen** (root-crontab `savetv_sync.py` auskommentieren) - vor allem anderen. 2. **Cline: Jellyfin-LXC bauen** (jetzt, Platte bleibt noch an optiplex2 .170): - Config/DB vom alten Docker-Jellyfin (.149, v10.9.11) migrieren -> Nutzer, Watch-State, Bibliotheken, Plugins erhalten. - Medien **vorerst per CIFS von //192.168.178.170/Medien** mounten. - **KRITISCH: Medien im Container an STABILEM Pfad** (z.B. `/media`). Beim spaeteren Platten-Umzug wird NUR das Backing an genau diesem Pfad von CIFS(.170) auf lokalen bind-mount getauscht -> Library-DB bleibt gueltig, kein Re-Scan/Verlust von Watch-State. - VAAPI: altes HW-Transcoding lief auf Intel-iGPU; auf pve-jervais ist renderD128 die **AMD Vega** -> HW-Transcoding NEU verifizieren, nicht annehmen. 3. **Supervisor verifiziert** Jellyfin (Nutzer/Watch-State/Bibliotheken/VAAPI auf AMD). 4. **DANACH (Nutzer): Platte physisch** von .170 -> .40 umstecken. 5. Auf .40: Platte identifizieren (lsblk/FS), erst read-only mounten + Lesbarkeit pruefen, dann bind-mount am selben Container-Pfad. 6. Cline: **Samba auf .40** (Share `Medien`, Gast/ro) -> LAN. 7. Clients umpunkten .170->.40: CT146 fstab (`/mnt/ki-modelle`), KI-Server Laufwerk Z:. (SaveTV entfaellt, alt-JF wird abgeloest.) 8. CT-999-Doku + OpenMemory aktualisieren. ### .170-Clients (vor Umzug bekannt) alt-JF .149 (3x CIFS /mnt/nas,/mnt/nas_filme,/srv/media) | CT146 /mnt/ki-modelle | KI-Server Z: | SaveTV (gel.). Keine weiteren in der Doku.
Author
Owner

Build-Brief Jellyfin-Migration fuer Cline (Quellen verifiziert 15.06.2026)

Zugang Quelle (.149)

Tailscale-SSH (kein Passwort, dokumentiert): von einem Tailnet-Node ssh root@100.77.105.3 -> einmalige Browser-Freigabe (login.tailscale.com). Passwort root/astral66 + michael/Sprint-99 funktionieren NICHT.

Quelle auf .149 (Docker jellyfin/jellyfin:10.9.11)

Inhalt Pfad auf .149 Groesse
Jellyfin config (Library-DB, Nutzer, Watch-State, Plugins) /opt/jellyfin/config -> Container /config 9,4 GB (v.a. Metadaten/Artwork)
cache (NICHT mitnehmen) /opt/jellyfin/cache -
Medien /mnt/nas (CIFS //192.168.178.170/Medien) -> Container /media -

Ziel: Jellyfin-LXC auf pve-jervais

  1. Unprivilegierte LXC, iGPU renderD128 (AMD Vega) per VAAPI durchreichen (NICHT die 3080).
  2. Jellyfin installieren (Version >= 10.9.11), Dienst stoppen.
  3. config migrieren: /opt/jellyfin/config von .149 -> neues /config (rsync via Tailscale). Cache weglassen.
  4. Medien an STABILEM Pfad /media mounten - vorerst CIFS //192.168.178.170/Medien (Gast, vers=3.0,ro). Beim spaeteren Platten-Umzug nur das Backing hinter /media auf lokalen bind-mount tauschen -> Library-DB bleibt gueltig.
  5. VAAPI auf AMD NEU verifizieren: altes encoding.xml war vaapi auf Intel-iGPU; Geraet bleibt renderD128, aber AMD-Treiber (mesa-va-drivers) + Decode-Codecs gegentesten. Nicht als "laeuft schon" annehmen.
  6. Cloudflared-Tunnel fuer Jellyfin mit umziehen (wird weiter gebraucht).

Supervisor-Verifikation danach (auf .40)

LXC laeuft | Login Orbitalo/Astral1966 | Nutzer + Watch-State vorhanden | Bibliotheken sehen /media | HW-Transcoding erzeugt Last auf renderD128 (AMD) | Cloudflared erreichbar.

Hinweis

Nextcloud auf .149 = ungenutzt (letzter Login 19.12.2025, 54 MB, nur Default-Vorlagen) -> wird geloescht, nicht migriert. HA (/home/homeassistant, 339 MB) + Zigbee-Dongle = spaeterer separater Umzug, .149 vorerst NICHT abschalten.

## Build-Brief Jellyfin-Migration fuer Cline (Quellen verifiziert 15.06.2026) ### Zugang Quelle (.149) **Tailscale-SSH** (kein Passwort, dokumentiert): von einem Tailnet-Node `ssh root@100.77.105.3` -> einmalige Browser-Freigabe (login.tailscale.com). Passwort root/astral66 + michael/Sprint-99 funktionieren NICHT. ### Quelle auf .149 (Docker jellyfin/jellyfin:10.9.11) | Inhalt | Pfad auf .149 | Groesse | |---|---|---| | Jellyfin **config** (Library-DB, Nutzer, Watch-State, Plugins) | `/opt/jellyfin/config` -> Container `/config` | **9,4 GB** (v.a. Metadaten/Artwork) | | cache (NICHT mitnehmen) | `/opt/jellyfin/cache` | - | | Medien | `/mnt/nas` (CIFS //192.168.178.170/Medien) -> Container `/media` | - | ### Ziel: Jellyfin-LXC auf pve-jervais 1. Unprivilegierte LXC, **iGPU renderD128 (AMD Vega) per VAAPI** durchreichen (NICHT die 3080). 2. Jellyfin installieren (Version >= 10.9.11), Dienst stoppen. 3. **config migrieren**: `/opt/jellyfin/config` von .149 -> neues `/config` (rsync via Tailscale). Cache weglassen. 4. **Medien an STABILEM Pfad `/media`** mounten - vorerst CIFS `//192.168.178.170/Medien` (Gast, vers=3.0,ro). Beim spaeteren Platten-Umzug nur das Backing hinter `/media` auf lokalen bind-mount tauschen -> Library-DB bleibt gueltig. 5. **VAAPI auf AMD NEU verifizieren**: altes encoding.xml war `vaapi` auf Intel-iGPU; Geraet bleibt renderD128, aber AMD-Treiber (mesa-va-drivers) + Decode-Codecs gegentesten. Nicht als "laeuft schon" annehmen. 6. Cloudflared-Tunnel fuer Jellyfin mit umziehen (wird weiter gebraucht). ### Supervisor-Verifikation danach (auf .40) LXC laeuft | Login `Orbitalo/Astral1966` | Nutzer + Watch-State vorhanden | Bibliotheken sehen `/media` | HW-Transcoding erzeugt Last auf renderD128 (AMD) | Cloudflared erreichbar. ### Hinweis Nextcloud auf .149 = ungenutzt (letzter Login 19.12.2025, 54 MB, nur Default-Vorlagen) -> wird geloescht, nicht migriert. HA (`/home/homeassistant`, 339 MB) + Zigbee-Dongle = spaeterer separater Umzug, .149 vorerst NICHT abschalten.
Author
Owner

⚠️ STOPP vor config-Copy - 2 Supervisor-Flags (CT200, 15.06 17:08)

CT200 jellyfin laeuft (frisch, 10.11.11), Medien sichtbar. BEVOR die alte config von .149 kopiert wird, bitte beide Punkte klaeren - sonst bricht die Migration:

1. Mount-Pfad: /mnt/media != altes /media

Altes Jellyfin (.149) hatte Medien im Container unter /media. CT200 mountet aktuell unter /mnt/media. Die migrierte Library-DB referenziert aber /media/... -> Bibliotheken laufen ins Leere.
Fix: Medien im Container an /media mounten (Mount-Entry anpassen: /mnt/media mnt/media -> /media media), ODER nach dem Copy alle Library-Pfade /media -> /mnt/media umschreiben. Erstes ist sauberer.

2. Versionssprung 10.9.11 -> 10.11.11 = kein blanker File-Copy!

Zwischen 10.9 und 10.11 hat Jellyfin das DB-Schema umgebaut (10.10/10.11 haben die DBs zusammengefuehrt, neue jellyfin.db). Ein rsync der alten 10.9-/config auf die frische 10.11-Instanz kann die DB zerschiessen / Watch-State verlieren.
Empfehlung: entweder erst 10.9.x installieren -> config kopieren -> starten (DB migriert sauber hoch) -> dann auf 10.11 updaten, oder bewusst Bibliotheken neu scannen und nur Nutzer/Settings uebernehmen. Reiner Copy 10.9->10.11 ist riskant.

Mapping Docker -> deb beachten

Quelle ist Docker (alles in /config). Ziel ist das deb-Paket mit getrennten Pfaden: config -> /etc/jellyfin, data (DBs, Library) -> /var/lib/jellyfin, plugins/metadata entsprechend. Nicht 1:1 /config -> ein Verzeichnis.

Supervisor verifiziert nach dem Copy: Nutzer Orbitalo da, Watch-State erhalten, Bibliotheken sehen die Medien, VAAPI-Last auf renderD128.

## ⚠️ STOPP vor config-Copy - 2 Supervisor-Flags (CT200, 15.06 17:08) CT200 jellyfin laeuft (frisch, 10.11.11), Medien sichtbar. **BEVOR die alte config von .149 kopiert wird, bitte beide Punkte klaeren - sonst bricht die Migration:** ### 1. Mount-Pfad: `/mnt/media` != altes `/media` Altes Jellyfin (.149) hatte Medien im Container unter **`/media`**. CT200 mountet aktuell unter **`/mnt/media`**. Die migrierte Library-DB referenziert aber `/media/...` -> Bibliotheken laufen ins Leere. **Fix:** Medien im Container an **`/media`** mounten (Mount-Entry anpassen: `/mnt/media mnt/media` -> `/media media`), ODER nach dem Copy alle Library-Pfade `/media` -> `/mnt/media` umschreiben. Erstes ist sauberer. ### 2. Versionssprung 10.9.11 -> 10.11.11 = kein blanker File-Copy! Zwischen 10.9 und 10.11 hat Jellyfin das **DB-Schema umgebaut** (10.10/10.11 haben die DBs zusammengefuehrt, neue jellyfin.db). Ein rsync der alten 10.9-`/config` auf die frische 10.11-Instanz kann die DB zerschiessen / Watch-State verlieren. **Empfehlung:** entweder **erst 10.9.x installieren -> config kopieren -> starten (DB migriert sauber hoch) -> dann auf 10.11 updaten**, oder bewusst Bibliotheken neu scannen und nur Nutzer/Settings uebernehmen. Reiner Copy 10.9->10.11 ist riskant. ### Mapping Docker -> deb beachten Quelle ist Docker (alles in `/config`). Ziel ist das deb-Paket mit getrennten Pfaden: config -> `/etc/jellyfin`, data (DBs, Library) -> `/var/lib/jellyfin`, plugins/metadata entsprechend. Nicht 1:1 `/config` -> ein Verzeichnis. Supervisor verifiziert nach dem Copy: Nutzer `Orbitalo` da, Watch-State erhalten, Bibliotheken sehen die Medien, VAAPI-Last auf renderD128.
Author
Owner

Supervisor-Verifikation CT200: Migration NICHT angewendet + VAAPI defekt (15.06 17:45)

Unabhaengig per SSH geprueft. Der Eigenbericht "Config migriert / Bibliotheken auf /mnt/media" stimmt nicht mit dem Live-Zustand ueberein.

1. Config-Migration ist NICHT angekommen (nur gestaged)

Die Live-Instanz ist eine leere Erstinstallation:

  • GET /System/Info/Public -> StartupWizardCompleted: false, neue ServerId db6add1a...
  • /var/lib/jellyfin nur 580K, jellyfin.db unveraendert (475K, mtime 15:28 = Frischinstall)
  • root/default/ leer -> KEINE Bibliotheken, KEINE Nutzer

Die Quelle liegt korrekt im Staging /var/lib/vz/jf_migrate (intakt): data/library.db 36,9 MB, data/playback_reporting.db, root/default/ = Filme + Sammlungen. -> Es wurde also gestaged, aber nie in /var/lib/jellyfin + /etc/jellyfin importiert.
ToDo Cline: Staging mit korrektem deb-Mapping einspielen (staging/data->/var/lib/jellyfin/data, staging/config->/etc/jellyfin, metadata/plugins/root entsprechend), Jellyfin stoppen waehrend Copy. Achtung Versionssprung: Quelle hat library.db (10.9-Schema) -> 10.11 muss die DB-Migration beim Start real durchlaufen (sonst leere Bibliothek).

2. VAAPI-HW-Transcoding ist NICHT funktionsfaehig (2 Ursachen)

  • encoding.xml: HardwareAccelerationType = none (nicht vaapi) -> HW-Transcoding ist schlicht aus.
  • GPU-Device-Rechte (unprivilegierte LXC): Host renderD128 = root:render (GID 993), aber CT200 hat keine idmap -> im Container erscheint das Device als Besitzer 65534 (overflow). Der jellyfin-User ist in Container-Gruppe render=GID 992, hat damit keinen Zugriff auf das Device. Deshalb scheitert auch vainfo.
    ToDo Cline: idmap in /etc/pve/lxc/200.conf setzen, die die Host-GID 993 in den Container mappt (bzw. Proxmox dev0: /dev/dri/renderD128,gid=...), Container-render-GID angleichen; danach encoding.xml auf vaapi (Device renderD128). Erst dann macht der Transcode-Test Sinn.

Fazit

Stand jetzt: leere Jellyfin-Instanz, kein HW-Transcoding. Schritt 4 (Platte umstecken) noch NICHT freigeben - erst Migration real einspielen + VAAPI fixen, dann verifiziere ich erneut (Nutzer Orbitalo, Watch-State, Bibliotheken sehen Medien, echte GPU-Last).

## ❌ Supervisor-Verifikation CT200: Migration NICHT angewendet + VAAPI defekt (15.06 17:45) Unabhaengig per SSH geprueft. Der Eigenbericht "Config migriert / Bibliotheken auf /mnt/media" stimmt **nicht** mit dem Live-Zustand ueberein. ### 1. Config-Migration ist NICHT angekommen (nur gestaged) Die Live-Instanz ist eine **leere Erstinstallation**: - `GET /System/Info/Public` -> **`StartupWizardCompleted: false`**, neue ServerId `db6add1a...` - `/var/lib/jellyfin` nur **580K**, `jellyfin.db` unveraendert (475K, mtime 15:28 = Frischinstall) - `root/default/` **leer** -> KEINE Bibliotheken, KEINE Nutzer Die Quelle liegt korrekt im Staging `/var/lib/vz/jf_migrate` (intakt): `data/library.db` **36,9 MB**, `data/playback_reporting.db`, `root/default/` = **Filme + Sammlungen**. -> Es wurde also **gestaged, aber nie in `/var/lib/jellyfin` + `/etc/jellyfin` importiert.** **ToDo Cline:** Staging mit korrektem deb-Mapping einspielen (staging/data->/var/lib/jellyfin/data, staging/config->/etc/jellyfin, metadata/plugins/root entsprechend), Jellyfin stoppen waehrend Copy. Achtung Versionssprung: Quelle hat `library.db` (10.9-Schema) -> 10.11 muss die DB-Migration beim Start real durchlaufen (sonst leere Bibliothek). ### 2. VAAPI-HW-Transcoding ist NICHT funktionsfaehig (2 Ursachen) - **encoding.xml: `HardwareAccelerationType = none`** (nicht `vaapi`) -> HW-Transcoding ist schlicht aus. - **GPU-Device-Rechte (unprivilegierte LXC):** Host `renderD128` = root:render (GID **993**), aber CT200 hat **keine idmap** -> im Container erscheint das Device als Besitzer **65534** (overflow). Der `jellyfin`-User ist in Container-Gruppe `render`=GID **992**, hat damit **keinen Zugriff** auf das Device. Deshalb scheitert auch `vainfo`. **ToDo Cline:** idmap in `/etc/pve/lxc/200.conf` setzen, die die Host-GID 993 in den Container mappt (bzw. Proxmox `dev0: /dev/dri/renderD128,gid=...`), Container-render-GID angleichen; danach encoding.xml auf `vaapi` (Device renderD128). Erst dann macht der Transcode-Test Sinn. ### Fazit Stand jetzt: leere Jellyfin-Instanz, kein HW-Transcoding. **Schritt 4 (Platte umstecken) noch NICHT freigeben** - erst Migration real einspielen + VAAPI fixen, dann verifiziere ich erneut (Nutzer Orbitalo, Watch-State, Bibliotheken sehen Medien, echte GPU-Last).
Author
Owner

Supervisor-Verifikation CT200: Jellyfin-Migration BESTANDEN (15.06 18:00)

Alle Punkte unabhaengig per SSH geprueft – jetzt sauber:

Migration / Daten

  • StartupWizardCompleted: true, config 9,4 G, jellyfin.db 48,7 MB (library.db → jellyfin.db migriert, 10.9→10.11 durchgelaufen)
  • 11 Nutzer migriert (Hans, Holger, Klemens, Peter, Ralf, admin, karsten, kevin, michael ec, rolf, +1)
  • Watch-State erhalten: UserData = 506 Eintraege
  • 915 Medien-Items mit /media/...-Pfad in der DB

Pfad-Fix (war Show-Stopper)

  • Mount-Ziel von mnt/media auf /media korrigiert → Bibliothekspfade (/media/Recorded TV etc.) loesen jetzt auf echte Dateien auf. CIFS //192.168.178.170/Medien ist befuellt im Container sichtbar.

VAAPI HW-Transcoding – FUNKTIONIERT (entgegen "vainfo scheitert")

  • Realer Transcode als jellyfin-User: Encoder h264_vaapi + scale_vaapi, 438 fps / 17,5x Echtzeit sustained → eindeutig Hardware.
  • GPU = amdgpu @ PCI 0000:30:00.0 (AMD Vega), idmap GID 993 korrekt, jellyfin hat Device-Zugriff, encoding.xml = vaapi.
  • Hinweis: gpu_busy_percent/amdgpu_pm_info GPU Load zeigen 0 % – das ist ein Messartefakt (misst GFX-Engine, nicht den VCN-Video-Block). Der Durchsatz ist der Beweis.

Fazit

Jellyfin auf CT200 ist voll funktionsfaehig (Nutzer, Watch-History, Bibliotheken mit Inhalt, HW-Transcoding). Schritt 4 (USB-RAID von .170 auf .40 umstecken) ist jetzt freigegeben. Danach: Medien-Backing am selben Pfad /media von CIFS(.170) auf lokalen bind-mount umstellen (DB bleibt gueltig), dann Samba-Re-Export.

## ✅ Supervisor-Verifikation CT200: Jellyfin-Migration BESTANDEN (15.06 18:00) Alle Punkte unabhaengig per SSH geprueft – jetzt sauber: ### Migration / Daten - `StartupWizardCompleted: true`, config 9,4 G, `jellyfin.db` 48,7 MB (library.db → jellyfin.db migriert, 10.9→10.11 durchgelaufen) - **11 Nutzer** migriert (Hans, Holger, Klemens, Peter, Ralf, admin, karsten, kevin, michael ec, rolf, +1) - **Watch-State erhalten:** `UserData` = **506 Eintraege** - **915 Medien-Items** mit `/media/...`-Pfad in der DB ### Pfad-Fix (war Show-Stopper) - Mount-Ziel von `mnt/media` auf **`/media`** korrigiert → Bibliothekspfade (`/media/Recorded TV` etc.) loesen jetzt auf echte Dateien auf. CIFS `//192.168.178.170/Medien` ist befuellt im Container sichtbar. ### VAAPI HW-Transcoding – FUNKTIONIERT (entgegen "vainfo scheitert") - Realer Transcode als `jellyfin`-User: Encoder **`h264_vaapi`** + `scale_vaapi`, **438 fps / 17,5x Echtzeit** sustained → eindeutig Hardware. - GPU = `amdgpu` @ PCI `0000:30:00.0` (AMD Vega), idmap GID 993 korrekt, `jellyfin` hat Device-Zugriff, `encoding.xml` = `vaapi`. - Hinweis: `gpu_busy_percent`/`amdgpu_pm_info GPU Load` zeigen 0 % – das ist ein **Messartefakt** (misst GFX-Engine, nicht den VCN-Video-Block). Der Durchsatz ist der Beweis. ### Fazit Jellyfin auf CT200 ist voll funktionsfaehig (Nutzer, Watch-History, Bibliotheken mit Inhalt, HW-Transcoding). **Schritt 4 (USB-RAID von .170 auf .40 umstecken) ist jetzt freigegeben.** Danach: Medien-Backing am selben Pfad `/media` von CIFS(.170) auf lokalen bind-mount umstellen (DB bleibt gueltig), dann Samba-Re-Export.
Author
Owner

Phase J (Backup/PBS) — abgeschlossen & extern verifiziert (16.06.2026)

CT200 (Jellyfin) auf pve-jervais wird jetzt korrekt nach PBS gesichert. Supervisor-verifiziert (nicht nur "Worker meldet erfolgreich").

Endstand

Punkt Status
Storage pbs-nvme API-Token backup@pbs!pve-jervais (kein root@pam) + Namespace jellyfin-host, Datastore nvme-pool (PBS 100.99.139.22)
Snapshot ct/200 5,52 GiB im NS jellyfin-host, owner=backup@pbs!pve-jervais (per PBS-API gegengeprüft)
Schedule jellyfin-daily, täglich 03:30, Retention keep-daily=7/keep-weekly=4/keep-monthly=6
Backup-Inhalt nur CT200-Rootfs (Jellyfin-DB/Config), keine Medien

Korrekturen am ersten (fehlerhaften) Setup

Der erste Durchlauf des Workers war oberflächlich "erfolgreich", hatte aber drei Fehler, die im Supervisor-Review behoben wurden:

  1. "PBS akzeptiert nur root@pam / keine API-Tokens"falsch. Der Token funktioniert einwandfrei (per PBS-API getestet, liefert Snapshot-Daten). Er war nur falsch eingebunden. Storage wurde von root@pam auf den Token umgestellt.
  2. Backup lag im Root-Namespace statt in jellyfin-host → dort existieren bereits fremde ct/200-Backups eines anderen Nodes; der Prune-Job (vmid 200) hätte diese mit weglöschen können. Storage auf Namespace jellyfin-host umgestellt → Isolation/Prune-Kollision behoben.
  3. Secret-Leak: 3 Temp-Scripts mit dem PBS-root@pam-Passwort auf pve-jervais (/tmp/setup_ct200_backup.py, fix_ct200_backup.py, backup_ct200_final.py — letzteres vom Worker nicht erwähnt) → gelöscht. Waren nie in Git/Forgejo (Tree + History geprüft), daher kein History-Scrub/keine Passwort-Rotation nötig (privates Repo, vom Nutzer so entschieden).

Zusätzlich: verwaister Root-NS-Eintrag ct/200 (Fehlversuch von 10:36) gezielt entfernt; die 6 fremden Feb/März-Backups blieben unberührt.

Kontext / Vorgeschichte

Dieser Schritt schließt an die .149-Abschaltung an (siehe #112). Alter Jellyfin-Host debian-jellyfin-homeassistent (.149) ist stillgelegt; Jellyfin läuft auf CT200/pve-jervais.

Offen (Nutzer, physisch)

  • Alten .149-Server ausbauen, neuen PC an dessen Platz, Zigbee-Dongle ziehen.

OpenMemory + CT999-Doku aktualisiert.

## Phase J (Backup/PBS) — abgeschlossen & extern verifiziert (16.06.2026) CT200 (Jellyfin) auf **pve-jervais** wird jetzt korrekt nach PBS gesichert. Supervisor-verifiziert (nicht nur "Worker meldet erfolgreich"). ### Endstand | Punkt | Status | |---|---| | Storage `pbs-nvme` | ✅ **API-Token** `backup@pbs!pve-jervais` (kein root@pam) + Namespace `jellyfin-host`, Datastore `nvme-pool` (PBS 100.99.139.22) | | Snapshot | ✅ `ct/200` 5,52 GiB im NS `jellyfin-host`, `owner=backup@pbs!pve-jervais` (per PBS-API gegengeprüft) | | Schedule | ✅ `jellyfin-daily`, täglich 03:30, Retention keep-daily=7/keep-weekly=4/keep-monthly=6 | | Backup-Inhalt | ✅ nur CT200-Rootfs (Jellyfin-DB/Config), keine Medien | ### Korrekturen am ersten (fehlerhaften) Setup Der erste Durchlauf des Workers war oberflächlich "erfolgreich", hatte aber drei Fehler, die im Supervisor-Review behoben wurden: 1. **"PBS akzeptiert nur root@pam / keine API-Tokens"** → **falsch.** Der Token funktioniert einwandfrei (per PBS-API getestet, liefert Snapshot-Daten). Er war nur falsch eingebunden. Storage wurde von `root@pam` auf den Token umgestellt. 2. **Backup lag im Root-Namespace** statt in `jellyfin-host` → dort existieren bereits **fremde `ct/200`-Backups eines anderen Nodes**; der Prune-Job (vmid 200) hätte diese mit weglöschen können. Storage auf Namespace `jellyfin-host` umgestellt → Isolation/Prune-Kollision behoben. 3. **Secret-Leak:** 3 Temp-Scripts mit dem PBS-`root@pam`-Passwort auf pve-jervais (`/tmp/setup_ct200_backup.py`, `fix_ct200_backup.py`, `backup_ct200_final.py` — letzteres vom Worker nicht erwähnt) → gelöscht. Waren **nie** in Git/Forgejo (Tree + History geprüft), daher kein History-Scrub/keine Passwort-Rotation nötig (privates Repo, vom Nutzer so entschieden). Zusätzlich: verwaister Root-NS-Eintrag `ct/200` (Fehlversuch von 10:36) gezielt entfernt; die 6 fremden Feb/März-Backups blieben unberührt. ### Kontext / Vorgeschichte Dieser Schritt schließt an die .149-Abschaltung an (siehe #112). Alter Jellyfin-Host `debian-jellyfin-homeassistent` (.149) ist stillgelegt; Jellyfin läuft auf CT200/pve-jervais. ### Offen (Nutzer, physisch) - Alten .149-Server ausbauen, neuen PC an dessen Platz, Zigbee-Dongle ziehen. OpenMemory + CT999-Doku aktualisiert.
Author
Owner

Status-Abgleich 16.06.2026 (verifiziert auf pve-jervais)

Host pve-jervais (Tailscale 100.67.193.113, LAN .40). Alle Punkte unten direkt auf dem Host geprueft, nicht aus dem Gedaechtnis.

Phase Status Realitaet / Abweichung
A Konsole/BIOS DONE Host installiert, online, iGPU treibt Konsole
B Grundkonfig DONE no-subscription, Tailscale, Pulse-SSH-Key (Direkt-Zugriff), Hostname pve-jervais
C ZFS-Pool ABWEICHUNG Kein ZFS. Medien liegen auf exFAT /mnt/media (UUID 687B-C0E4, fstab nofail). zpool list = leer. Bewusst so, da grosse USB/exFAT-Platte uebernommen. -> Phase C gilt als erledigt in Variante exFAT.
D NVIDIA-Host DONE RTX 3080 (10 GB) sichtbar, Treiber 580.126.09, Module nvidia/uvm/drm/modeset geladen, nvidia-smi ok
E GPU-Sharing LXC TEILWEISE / OFFEN NVIDIA-3080 ist in keinen LXC durchgereicht (nvidia_uvm = 0 Nutzer). Jellyfin nutzt stattdessen die AMD-iGPU (Cezanne/Vega) via VAAPI -> 3080 bleibt komplett frei. NVIDIA-LXC-Sharing wird erst mit Phase G (Uebersetzung) gebaut.
F Jellyfin-LXC DONE (abweichende Engine) CT200 laeuft. Transcoding ueber AMD VAAPI (renderD128), nicht NVENC/3080 - bewusst, damit die 3080 fuer die Uebersetzung reserviert bleibt. Bibliothek ~897 Filme.
G Uebersetzungs-Pipeline OFFEN Kern von #103. Noch nichts gebaut. Naechstes grosses Arbeitspaket.
H Cloudflared DONE Tunnel jeyfin-debian.orbitalo.info -> CT200
I Monitoring DONE (Host) prometheus-node-exporter auf :9100, promtail auf :9080 -> Loki 100.109.206.43:3100. Offen nur: Scrape-/Health-Eintrag auf Prometheus-Seite (CT110) gegenpruefen.
J Backup (PBS) DONE pbs-nvme, Namespace jellyfin-host, Token backup@pbs!pve-jervais, jellyfin-daily 03:30, Retention 7/4/6 (siehe Backup-Kommentar)
K Doku-Migration DONE CT999 hosts/ + container/ct-200-jellyfin.md aktuell

Architektur-Klarstellung (wichtig fuer kuenftige Sessions)

Der urspruengliche Plan sah NVENC auf der 3080 fuer Jellyfin vor. Real laeuft Jellyfin auf der AMD-iGPU (VAAPI). Das ist besser fuer das Gesamtziel: die 3080 bleibt zu 100 % fuer die Echtzeit-Uebersetzung (#103, CUDA) frei - keine NVENC/CUDA-Konkurrenz. GPU-Sharing der 3080 in LXC wird daher erst beim Bau der Uebersetzungs-Pipeline relevant.

Verbleibende offene Punkte

  • Phase E (NVIDIA-LXC-Sharing) + Phase G (faster-whisper + NLLB-200 + Piper) = das eigentliche Jervais-Ziel, Details in #103. Empfehlung: Phase 0 Quality-Spike (Khmer->DE) zuerst, bevor Infra gebaut wird.
  • Phase I: Scrape-Target/Hausmeister-Health-Check fuer pve-jervais auf CT110-Seite bestaetigen.
  • Offene Wunschliste-Frage "HA" (Home Assistant in LXC?) weiterhin unbestaetigt.

Fazit: Setup-Geruest (#107) ist bis auf die Uebersetzungs-Pipeline (Phase E NVIDIA-Teil + G) abgeschlossen. Naechster Schritt liegt in #103.

## Status-Abgleich 16.06.2026 (verifiziert auf pve-jervais) Host `pve-jervais` (Tailscale 100.67.193.113, LAN .40). Alle Punkte unten direkt auf dem Host geprueft, nicht aus dem Gedaechtnis. | Phase | Status | Realitaet / Abweichung | |---|---|---| | A Konsole/BIOS | DONE | Host installiert, online, iGPU treibt Konsole | | B Grundkonfig | DONE | no-subscription, Tailscale, Pulse-SSH-Key (Direkt-Zugriff), Hostname pve-jervais | | **C ZFS-Pool** | **ABWEICHUNG** | **Kein ZFS.** Medien liegen auf **exFAT** `/mnt/media` (UUID 687B-C0E4, fstab `nofail`). `zpool list` = leer. Bewusst so, da grosse USB/exFAT-Platte uebernommen. -> Phase C gilt als erledigt in Variante exFAT. | | D NVIDIA-Host | DONE | RTX 3080 (10 GB) sichtbar, Treiber **580.126.09**, Module nvidia/uvm/drm/modeset geladen, nvidia-smi ok | | **E GPU-Sharing LXC** | **TEILWEISE / OFFEN** | NVIDIA-3080 ist in **keinen** LXC durchgereicht (nvidia_uvm = 0 Nutzer). Jellyfin nutzt stattdessen die **AMD-iGPU (Cezanne/Vega) via VAAPI** -> 3080 bleibt **komplett frei**. NVIDIA-LXC-Sharing wird erst mit Phase G (Uebersetzung) gebaut. | | **F Jellyfin-LXC** | **DONE (abweichende Engine)** | CT200 laeuft. Transcoding ueber **AMD VAAPI (renderD128)**, **nicht** NVENC/3080 - bewusst, damit die 3080 fuer die Uebersetzung reserviert bleibt. Bibliothek ~897 Filme. | | G Uebersetzungs-Pipeline | **OFFEN** | Kern von #103. Noch nichts gebaut. Naechstes grosses Arbeitspaket. | | H Cloudflared | DONE | Tunnel jeyfin-debian.orbitalo.info -> CT200 | | **I Monitoring** | **DONE (Host)** | `prometheus-node-exporter` auf :9100, `promtail` auf :9080 -> Loki **100.109.206.43:3100**. Offen nur: Scrape-/Health-Eintrag auf Prometheus-Seite (CT110) gegenpruefen. | | J Backup (PBS) | DONE | pbs-nvme, Namespace jellyfin-host, Token backup@pbs!pve-jervais, jellyfin-daily 03:30, Retention 7/4/6 (siehe Backup-Kommentar) | | K Doku-Migration | DONE | CT999 hosts/ + container/ct-200-jellyfin.md aktuell | ### Architektur-Klarstellung (wichtig fuer kuenftige Sessions) Der urspruengliche Plan sah **NVENC auf der 3080 fuer Jellyfin** vor. Real laeuft Jellyfin auf der **AMD-iGPU (VAAPI)**. Das ist **besser** fuer das Gesamtziel: die 3080 bleibt zu 100 % fuer die Echtzeit-Uebersetzung (#103, CUDA) frei - keine NVENC/CUDA-Konkurrenz. GPU-Sharing der 3080 in LXC wird daher erst beim Bau der Uebersetzungs-Pipeline relevant. ### Verbleibende offene Punkte - **Phase E (NVIDIA-LXC-Sharing)** + **Phase G (faster-whisper + NLLB-200 + Piper)** = das eigentliche Jervais-Ziel, Details in #103. Empfehlung: **Phase 0 Quality-Spike (Khmer->DE) zuerst**, bevor Infra gebaut wird. - Phase I: Scrape-Target/Hausmeister-Health-Check fuer pve-jervais auf CT110-Seite bestaetigen. - Offene Wunschliste-Frage **"HA"** (Home Assistant in LXC?) weiterhin unbestaetigt. **Fazit:** Setup-Geruest (#107) ist bis auf die Uebersetzungs-Pipeline (Phase E NVIDIA-Teil + G) abgeschlossen. Naechster Schritt liegt in #103.
Author
Owner

Update Phase E/G (16.06.2026)

Phase E (NVIDIA-LXC-Sharing): erledigt. Im Zuge des #103-Phase-0-Spikes wurde LXC CT201 jervais-translate mit RTX-3080-Passthrough gebaut; nvidia-smi im Container zeigt die 3080 (Treiber 580.126.09), fp16-Modelle liefen real auf der GPU (96-97 % Util). 3080-Sharing damit bewiesen.

Phase G (Uebersetzungs-Pipeline): Richtungswechsel. Phase-0-Validierung ergab, dass Khmer-STT lokal (Whisper) unbrauchbar ist (CER 0.95). Entscheidung des Users: Hauptbedarf = Englisch->Deutsch, Khmer-lokal verworfen. EN->DE laeuft lokal problemlos. Details + Begruendung in #103.

Naechster Schritt fuer Phase G: EN->DE-Streaming-Pipeline auf CT201, Basis-Evaluierung von PolyTalk / audio-streaming-poc (faster-whisper + NLLB + Piper). Eigentlicher Restaufwand = Handy-App (Mikro -> Tailscale -> CT201 -> Ohr).

## Update Phase E/G (16.06.2026) **Phase E (NVIDIA-LXC-Sharing): erledigt.** Im Zuge des #103-Phase-0-Spikes wurde LXC **CT201 `jervais-translate`** mit RTX-3080-Passthrough gebaut; `nvidia-smi` im Container zeigt die 3080 (Treiber 580.126.09), fp16-Modelle liefen real auf der GPU (96-97 % Util). 3080-Sharing damit bewiesen. **Phase G (Uebersetzungs-Pipeline): Richtungswechsel.** Phase-0-Validierung ergab, dass **Khmer-STT lokal (Whisper) unbrauchbar** ist (CER 0.95). Entscheidung des Users: **Hauptbedarf = Englisch->Deutsch**, Khmer-lokal verworfen. EN->DE laeuft lokal problemlos. Details + Begruendung in #103. **Naechster Schritt fuer Phase G:** EN->DE-Streaming-Pipeline auf CT201, Basis-Evaluierung von PolyTalk / audio-streaming-poc (faster-whisper + NLLB + Piper). Eigentlicher Restaufwand = Handy-App (Mikro -> Tailscale -> CT201 -> Ohr).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: orbitalo/homelab-brain#107
No description provided.