# Video-Encoding – Dokumentationsindex und Projektstand **Dokumenten-ID:** GNENC-000-DOC **Stand:** 2026-10-30 **Status:** Planungsabschluss; externe Abhängigkeiten (CT-101, PVE-Host-NFS) umgesetzt; Implementierung auf ghostnet-ki noch nicht begonnen ## Dokumente | Dokument | Zweck / Zielgruppe | | --- | --- | | [GNENC-001-PLAN_Architecture.md](GNENC-001-PLAN_Architecture.md) | finale Architektur, Repository-Grenzen, Ressourcenmodell und offene Entscheidungen; Infrastrukturadministratoren | | [GNENC-002-PLAN_Pipeline.md](GNENC-002-PLAN_Pipeline.md) | operative Pipeline: Komponenten, Konten, Verzeichnislayout, Datenfluss, Validierung, Statusmodell; Infrastrukturadministratoren und Betreiber | Dashboard und Systemmetriken sind in den Monitoring-Bereich ausgelagert: [Monitoring → GNMON-000](../monitoring/GNMON-000-DOC_Index.md). Die Samba-/NFS-Anbindung auf CT-101 ist in [GNAI-017](../../proxmox-server/lxc/ct-101-samba/GNAI-017-PLAN_Samba-NFS-Export.md) beschrieben. ## Bestätigter Stand - Planungsabschluss am 19.10.2026: Die Pipeline besteht aus VPN-Sidecar (ProtonVPN), jDownloader2 (Download), Encoding-Worker (HandBrakeCLI + ffmpeg); Handover ausschließlich über das Filesystem, In-Progress-Schutz über Work-Ordner und atomares `mv`. - Speicherort: PVE-Host-Medienverbund `/media/datenhdd3` (per LXC-Mount auch in CT-101 sichtbar) — NFS-Export `10.0.0.2:/media/datenhdd3/Encoding`, gemountet auf `/var/lib/ghostnet-encoding` (ghostnet-ki hat nur eine 2-TB-NVMe; die Medienbibliothek liegt auf dem PVE-Host/CT-101). - CT-101 per Ansible adoptiert und PVE-Host-NFS umgesetzt (GNAI-019); Verifikation 30.10.2026: CT-101 `verify-production` `ok=47 changed=0`; PVE-Host nach autorisierter Konvergenz: Export-Root `100000:970 2775`, NFSv4-only wirksam (`-3`), `verify-production` `ok=17 changed=0`, Idempotenz `changed=0`. Berechtigungsmodell entschieden: Mode 2777 auf den SMB-berührten Verzeichnissen (GNENC-002 Abschnitt 4). - Implementierung 30.10.2026: Konten `gn-download` (983), `gn-dashboard` (984) und Gruppe `gn-media` (GID 970) per `workload_accounts` angelegt — `gn-media` als **primäre** Gruppe der drei Pipeline-Konten (AUTH_SYS über NFSv4 wirkte serverseitig nicht mit Supplementary-Gruppen; Befund 30.10.2026, GNENC-002 Abschnitt 3); Sudoers des Deploy-Kontos auf `(ALL:ALL)` verbreitert (`become_user` für die Dienstkonten). NFS-Mount auf `/var/lib/ghostnet-pipeline` aktiv (außerhalb der Homes); Layout auf dem Export erzeugt und verifiziert; Handover-Simulation (`verify-pipeline-handover.yml`) einmal vollständig bestanden (CT-101-`.dlc`-Drop → gn-download → queue → gn-encoding → output/state → gn-dashboard). Legacy-Medien-Cron auf dem PVE-Host entfernt (`pve_media_cron`, GNAI-017 Abschnitt 6.11). - Verzeichnislayout: `input//*.dlc`, `jd/`, `queue///`, `work/`, `output///` + `output/_failed/`, `state/jobs/` + `state/system.json`. - Konten: `gn-encoding` (982, eingerichtet und verifiziert), `gn-download` (983, jDownloader2 + VPN-Sidecar), `gn-dashboard` (984, Dashboard, Monitoring-Bereich); gemeinsame Gruppe `gn-media` (GID 970, auch auf CT-101). - VPN: gesamter jDownloader2-Verkehr über ProtonVPN-WireGuard (gluetun-Sidecar mit Kill Switch); WireGuard-Credentials server-lokal in `/etc/ghostnet-download/vpn.env`, nicht in git. - Profile: drei versionierte HandBrake-Presets (SVT-AV1 10-bit, MKV, Audio-Passthrough) unter `llm-server/encoding/profiles/`; Auswahl über gleichnamige Ordner, keine Auto-Detection. - Zeitplan: dauerhaft laufende Dienste; der Worker startet neue Releases nur 00:00–06:00 Uhr Europe/Berlin, laufende Jobs laufen über das Fenster hinaus (kein Abbruch am Fensterende). - Validierung: Exit 0, nicht-leere Zieldatei, Videostream vorhanden, ffmpeg-Volldecodierung ohne stderr-Fehler, Dauerabweichung ≤ 1 s. - Fehlerbehandlung: Quarantäne pro Datei nach `output/_failed/`; Status `failed` bis zur manuellen Prüfung. - Abholung: fertige Outputs per SMB über CT-101 (Share `[Encode]`, RW für `ghost`; Entnahme per `mv` räumt auf; optionaler Clean-Job nach 30 Tagen); `.dlc`-Drop über Share `[Encode-In]`; kein smbd auf `ghostnet-ki`. - Statusmodell: JSON pro Videodatei in `state/jobs/`, atomar geschrieben; Systemmetriken in `state/system.json` (Metrics-Collector des Monitoring-Bereichs). - Ressourcenlimits: Quadlet/cgroup (Worker MemoryMax 16G, Nice 10, IOWeight 50; jDownloader2 MemoryMax 2G, CPUWeight 50, IOWeight 20; VPN-Sidecar 256M). - Images: Worker als Eigenbau auf Basis des gepinnten HandBrake-Digests (`linuxserver/handbrake:1.11.2-ls48`, `sha256:fda92bd1…48a3c7`) mit python3 und ffmpeg; `jlesage/jdownloader-2` und `qmcgaw/gluetun` gepinnt. - Credentials: server-lokal unter `/etc/ghostnet-download/` (`jdownloader/`, `vpn.env`), nicht in git; Platzhalter im Repository. - Der Ansible-Grundzustand für `gn-encoding` ist eingerichtet und verifiziert (Check-Mode und Idempotenzlauf `changed=0`); es existieren noch keine Quadlets, Container oder Timer für den Encoding-Workload. ## Noch offen 1. Output-Pickup über CT-101 (SMB) einmal als geschlossener Ablauf nachweisen (Nachtest zum 30.10.2026 — der Durchlauf wurde durch den Server-Shutdown unterbrochen; GNENC-002 Abschnitt 11). 2. Feinjustierung der Ressourcenlimits nach einem repräsentativen Encoding-Test unter gleichzeitiger Inferenzlast. 3. Rootless-TUN-Verifizierung für den VPN-Sidecar auf dem Host. 4. Implementierung auf ghostnet-ki: Image-Bauten, Quadlet-Units (inkl. VPN-Sidecar), Worker-Skript, JD2-Event-Scripter, Monitoring-Bereich (Collector, Dashboard).