- workload_accounts: gn-media (GID 970), gn-download (983), gn-dashboard (984); gn-media als primäre Gruppe der Pipeline-Konten — AUTH_SYS ueber NFSv4 wirkte serverseitig nicht mit Supplementary-Gruppen (Betriebsbefund 30.10.2026); Sudoers des Deploy-Kontos auf (ALL:ALL) verbreitert (become_user) - video_encoding: NFS-Client, Mount-Unit und Pipeline-Layout auf dem Export (10.0.0.2:/media/datenhdd3/Encoding -> /var/lib/ghostnet-pipeline, ausserhalb der Homes); Layout-Anlage als Dienstkonten wegen root_squash; Verifikation der Verzeichnisrechte als gn-encoding (2777/2770/0750/2750, Gruppe 970) - pve_media_cron: Legacy-Crontab (chown root:root + chmod -R 0777 auf allen Medienplatten, alle 10 min) entfernt — haette jedes echte Berechtigungsmodell plattgewalzt; Backup unter /var/backups/ghostnet/pve/; verify-production prueft das Fehlen ab - verify-pipeline-handover.yml: Handover-Simulation über alle Identitaeten (CT-101-.dlc-Drop -> gn-download -> queue -> gn-encoding -> output/state -> gn-dashboard); einmal vollstaendig bestanden (30.10.2026) - Doku: GNENC-000/001/002, GNAI-017 (6.10/6.11), GNMON-001 auf Stand gebracht Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
95 lines
5.6 KiB
Markdown
95 lines
5.6 KiB
Markdown
# 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/<Profil>/*.dlc`, `jd/`, `queue/<Profil>/<Release>/`,
|
||
`work/`, `output/<Profil>/<Release>/` + `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).
|