Encoding: Pipeline-Konten, NFS-Mount, Layout und Handover-Simulation umgesetzt und verifiziert.
- 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>
This commit is contained in:
@@ -33,6 +33,18 @@ beschrieben.
|
||||
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`.
|
||||
@@ -71,12 +83,12 @@ beschrieben.
|
||||
|
||||
## Noch offen
|
||||
|
||||
1. NFSv4.2-Mount-Abnahme von `ghostnet-ki` gegen `10.0.0.2` (inkl.
|
||||
Schreib-/Lesetest als UID 982/983 und mv-Simulation als `ghost` über SMB)
|
||||
— mit der Encoding-Implementierung.
|
||||
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: Konten `gn-download`/`gn-dashboard`,
|
||||
NFS-Mount, Image-Bauten, Quadlet-Units (inkl. VPN-Sidecar), Skripte,
|
||||
Monitoring-Bereich (Collector, Dashboard).
|
||||
4. Implementierung auf ghostnet-ki: Image-Bauten, Quadlet-Units (inkl.
|
||||
VPN-Sidecar), Worker-Skript, JD2-Event-Scripter, Monitoring-Bereich
|
||||
(Collector, Dashboard).
|
||||
|
||||
@@ -32,7 +32,7 @@ beschrieben.
|
||||
| --- | --- | --- |
|
||||
| Repository | Host- und Deployment-Ansible bleibt im bestehenden Infrastructure-Repository | angenommen |
|
||||
| Dokumentation | Encoding liegt unter `docs/platform/llm-server/encoding/` und verwendet die Kennung `GNENC`; Monitoring unter `docs/platform/llm-server/monitoring/` mit der Kennung `GNMON`; CT 101 unter `docs/platform/proxmox-server/lxc/ct-101-samba/` mit GNAI-017 | umgesetzt |
|
||||
| Ausführungsidentitäten | drei gesperrte Konten: `gn-encoding` (UID/GID 982, Worker), `gn-download` (983, jDownloader2 + VPN-Sidecar), `gn-dashboard` (984, Dashboard, Monitoring-Bereich); gemeinsame Gruppe `gn-media` (GID 970) für die Übergabe-Verzeichnisse | gn-encoding eingerichtet und geprüft; weitere geplant |
|
||||
| Ausführungsidentitäten | drei gesperrte Konten: `gn-encoding` (UID 982, Worker), `gn-download` (983, jDownloader2 + VPN-Sidecar), `gn-dashboard` (984, Dashboard, Monitoring-Bereich); gemeinsame Gruppe `gn-media` (GID 970) als **primäre** Gruppe der drei Konten (AUTH_SYS über NFSv4 wirkte serverseitig nur mit primärer Gruppe; Befund 30.10.2026) | alle drei Konten eingerichtet und verifiziert 30.10.2026 (Idempotenz `changed=0`) |
|
||||
| Containertrennung | je Konto ein eigener rootless Podman-Store und ein eigener rootverwalteter Quadlet-Pfad | gn-encoding eingerichtet und verifiziert; weitere geplant |
|
||||
| Rechenressource | Encoding ist CPU-basiert ohne GPU-Zugriff; der host-seitige Metrics-Collector (Monitoring-Bereich) liest GPU-Metriken ausschließlich lesend für das Dashboard | Planungsentscheidung |
|
||||
| Parallelität | darf parallel zu AI Production oder AI Testing laufen | Planungsentscheidung |
|
||||
@@ -41,7 +41,7 @@ beschrieben.
|
||||
| VPN | der gesamte jDownloader2-Verkehr läuft über einen ProtonVPN-WireGuard-Tunnel: gluetun-Sidecar (`qmcgaw/gluetun`, gepinnt) unter `gn-download`, JD2 teilt dessen Netzwerk-Namespace, Kill Switch aktiv (kein Traffic ohne Tunnel); WireGuard-Credentials server-lokal in `/etc/ghostnet-download/vpn.env`, nicht in git | Betreiberentscheidung 19.10.2026 |
|
||||
| Anwendung | Worker-Image als Eigenbau auf Basis des gepinnten HandBrake-Images `linuxserver/handbrake:1.11.2-ls48` (`sha256:fda92bd1…48a3c7`) mit python3 und ffmpeg; die Digests von Worker- und VPN-Image werden nach dem Bau gepinnt | Betreiberentscheidung 19.10.2026 |
|
||||
| Speicherort | Pipeline-Daten liegen auf dem PVE-Host-Medienverbund (`/media/datenhdd3`; per LXC-Mount auch in CT-101 sichtbar): dort liegt die Medienbibliothek; ghostnet-ki selbst hat nur eine 2-TB-NVMe (OS + LLM) | Betreiberentscheidung 19.10.2026; NFS seit 30.10.2026 auf dem PVE-Host (GNAI-019 Entscheidung 2) |
|
||||
| Ein-/Ausgabe | NFS-Export `10.0.0.2:/media/datenhdd3/Encoding` (PVE-Host, Rolle `pve_nfs_export`, NFSv4-only, nur für 10.0.0.90, `root_squash`), gemountet auf `/var/lib/ghostnet-encoding`; Verzeichnislayout `input/`, `jd/`, `queue/`, `work/`, `output/`, `state/` | Betreiberentscheidung 19.10.2026; Umsetzung GNAI-019 (Revision 30.10.2026); Mount-Abnahme durch das Encoding-Ansible ausstehend |
|
||||
| Ein-/Ausgabe | NFS-Export `10.0.0.2:/media/datenhdd3/Encoding` (PVE-Host, Rolle `pve_nfs_export`, NFSv4-only, nur für 10.0.0.90, `root_squash`), gemountet auf `/var/lib/ghostnet-pipeline` (außerhalb der Konto-Homes); Verzeichnislayout `input/`, `jd/`, `queue/`, `work/`, `output/`, `state/` | Betreiberentscheidung 19.10.2026; Mount aktiv, Layout und Handover verifiziert 30.10.2026 |
|
||||
| Abholung | fertige Outputs per SMB über CT-101: Share `[Encode]` (`output/`, RW für `ghost`, lesend für `daidalaw`/`debugofen`) — Entnahme per `mv` in die Bibliotheks-Shares räumt `output/` auf; optionaler Clean-Job löscht Dateien nach 30 Tagen aus `output/`; kein smbd auf `ghostnet-ki` | Betreiberentscheidung 19.10.2026 |
|
||||
| Samba-Integration (CT-101) | CT-101 ist per Ansible adoptiert (GNAI-019; verifiziert 30.10.2026, `ok=47 changed=0`): Shares `[Encode]`/`[Encode-In]`/`[Encoding]`, Gruppe `gn-media` (GID 970) mit `ghost` als Mitglied; `.dlc`-Drop über `[Encode-In]`. NFS liegt nicht auf CT-101 (PVE-Host); die guest-seitige GID 970 gleicht die Host-GID 970 wegen des LXC-idmap nicht ab — Berechtigungsmodell: Mode 2777 auf den SMB-berührten Verzeichnissen (Betreiberentscheidung 30.10.2026, GNENC-002 Abschnitt 4) | Betreiberentscheidung 19.10.2026; GNAI-017/GNAI-019 |
|
||||
| Profile | drei versionierte HandBrake-Presets (SVT-AV1 10-bit, MKV, Audio-Passthrough) unter `llm-server/encoding/profiles/`; Auswahl über gleichnamige Ordner unter `input/` bzw. `queue/` | Betreiberentscheidung 19.10.2026; Presets versioniert |
|
||||
@@ -232,20 +232,19 @@ jeweils `ok=30 changed=0 failed=0`. Das gepinnte HandBrake-Image
|
||||
anschließend in den rootless Store von `gn-encoding` gezogen; der Pull
|
||||
bestätigte den Manifest-Digest.
|
||||
|
||||
Am 19.10.2026 wurde die Planung abgeschlossen (Abschnitte 2 und 7). Die
|
||||
externen Abhängigkeiten sind umgesetzt: CT-101 ist per Ansible adoptiert
|
||||
(GNAI-019, verifiziert 30.10.2026), der NFS-Export läuft auf dem PVE-Host
|
||||
(Rolle `pve_nfs_export`); der PVE-Host ist konvergiert (Export-Root
|
||||
`100000:970 2775`, NFSv4-only wirksam, `verify-production` `ok=17 changed=0`,
|
||||
Idempotenz `changed=0`; autorisierter Lauf 30.10.2026). Das
|
||||
Berechtigungsmodell für die SMB-Schreibpfade ist entschieden (Mode 2777,
|
||||
GNENC-002 Abschnitt 4); offener Restpunkt ist die NFSv4.2-Mount-Abnahme von
|
||||
ghostnet-ki. Die Implementierungsphase auf
|
||||
ghostnet-ki baut als Nächstes auf: die Konten `gn-download` und `gn-dashboard`
|
||||
samt Gruppe `gn-media` (GID 970), den NFS-Mount von `10.0.0.2`, die
|
||||
Image-Bauten mit Digest-Pinning (Worker, VPN-Sidecar, Dashboard), die
|
||||
Quadlet-Units für jDownloader2, VPN-Sidecar, Worker und Dashboard, den
|
||||
host-seitigen Metrics-Collector sowie die Skripte aus `scripts/`. Die Rolle
|
||||
Am 19.10.2026 wurde die Planung abgeschlossen (Abschnitte 2 und 7). Stand
|
||||
30.10.2026: Die externen Abhängigkeiten sind umgesetzt und verifiziert —
|
||||
CT-101 per Ansible adoptiert, der PVE-Host konvergiert (Export-Root
|
||||
`100000:970 2775`, NFSv4-only wirksam, Legacy-Medien-Cron entfernt — GNAI-017
|
||||
Abschnitt 6.9–6.11), die drei Pipeline-Konten samt Gruppe `gn-media`
|
||||
(einschließlich Primärgruppen-Umstellung, GNAI-017 Abschnitt 6.10) angelegt,
|
||||
der NFS-Mount auf `/var/lib/ghostnet-pipeline` aktiv, das Verzeichnislayout
|
||||
auf dem Export erzeugt und verifiziert, und die Handover-Simulation
|
||||
(`verify-pipeline-handover.yml`) einmal vollständig bestanden. Die
|
||||
Implementierungsphase auf ghostnet-ki baut als Nächstes auf: die Image-Bauten
|
||||
mit Digest-Pinning (Worker, VPN-Sidecar, Dashboard), die Quadlet-Units für
|
||||
jDownloader2, VPN-Sidecar, Worker und Dashboard, den host-seitigen
|
||||
Metrics-Collector sowie die Skripte aus `scripts/`. Die Rolle
|
||||
`video_encoding` stellt bis dahin sicher, dass weder Quadlet-Dateien noch
|
||||
Container für `gn-encoding` existieren.
|
||||
|
||||
|
||||
@@ -41,17 +41,21 @@ Gruppe `gn-media`: gemeinsame Gruppe der drei Konten für die Übergabe-
|
||||
Verzeichnisse und den lesenden Zugriff auf `state/`; GID 970. Alle Konten sind
|
||||
gesperrt (Passwort `!`, Shell `/usr/sbin/nologin`, Linger aktiv).
|
||||
|
||||
**Anmerkung 30.10.2026 (LXC-idmap):** Die guest-seitige Gruppe `gn-media`
|
||||
(GID 970) in CT-101 erscheint auf dem Host als GID 100970 und gleicht die
|
||||
reale Host-GID 970 der Pipeline nicht ab — die Gruppen-Alignment wirkt nur
|
||||
innerhalb von ghostnet-ki. Die SMB-Schreibpfade aus CT-101 laufen über
|
||||
guest-root (Host-UID 100000, da `admin users` Dateioperationen als root
|
||||
ausführt); siehe Abschnitt 11.
|
||||
**Anmerkung 30.10.2026 (primäre Gruppe):** Die drei Pipeline-Konten tragen
|
||||
`gn-media` als **primäre** Gruppe (die eigenen GID-Gruppen 982/983/984 bleiben
|
||||
für die Config-Verzeichnisse als Supplementary-Gruppe erhalten). Grund:
|
||||
AUTH_SYS über NFSv4 wirkte serverseitig nicht mit Supplementary-Gruppen —
|
||||
`mkdir` als 982/983 bekam EACCES, obwohl `gn-media` Gruppen-Schreibrechte
|
||||
hatte; mit primärer Gruppe 970 war der Zugriff sofort erfolgreich
|
||||
(Betriebsbefund 30.10.2026, Testreihe auf ghostnet-ki). Zudem gilt die
|
||||
LXC-idmap-Diskrepanz: die guest-seitige Gruppe `gn-media` (GID 970) in CT-101
|
||||
erscheint auf dem Host als GID 100970 — die SMB-Schreibpfade laufen über
|
||||
World-Write (Mode 2777), nicht über Gruppen-Abgleich; siehe Abschnitt 4.
|
||||
|
||||
## 4. Verzeichnislayout
|
||||
|
||||
```text
|
||||
/var/lib/ghostnet-encoding/ (NFS-Mount: 10.0.0.2:/media/datenhdd3/Encoding, PVE-Host)
|
||||
/var/lib/ghostnet-pipeline/ (NFS-Mount: 10.0.0.2:/media/datenhdd3/Encoding, PVE-Host; außerhalb der Konto-Homes)
|
||||
├── input/ gn-media 2777 SMB-Drop ([Encode-In])
|
||||
│ └── <Profil>/ gn-media 2777 nur .dlc
|
||||
├── jd/ gn-media 2770 JD2-Arbeitsverzeichnis (gn-download)
|
||||
@@ -92,16 +96,22 @@ Handover-Regeln:
|
||||
Schreibzugriffen.
|
||||
|
||||
**Berechtigungsmodell (Betreiberentscheidung 30.10.2026):** Die SMB-Zugriffe
|
||||
aus CT-101 laufen über guest-root (Host-UID 100000; `admin users` führt
|
||||
Dateioperationen als root aus). Da die Pipeline-Verzeichnisse via NFS den
|
||||
realen UIDs 982/983:970 gehören und diese im LXC-idmap nicht abgebildet sind
|
||||
(im Gast: `nobody:nogroup`), tragen `input/` und der `output/`-Baum Mode
|
||||
`2777`; `jd/`, `queue/`, `work/` und `state/` bleiben eng (2770/0750).
|
||||
aus CT-101 laufen über guest-root bzw. beliebige Gast-Identitäten (Host-UIDs
|
||||
100000+, da `admin users` Dateioperationen als root ausführt); die
|
||||
Pipeline-Verzeichnisse gehören via NFS den realen UIDs 982/983 mit primärer
|
||||
Gruppe 970. Da diese im LXC-idmap nicht abgebildet sind, tragen `input/` und
|
||||
der `output/`-Baum Mode `2777` (World-Write); `jd/`, `queue/`, `work/` und
|
||||
`state/` bleiben eng (2770/0750/2750). Der frühere Legacy-Cron auf dem
|
||||
PVE-Host (`chown -R root:root` + `chmod -R 0777` auf allen Medienplatten alle
|
||||
10 Minuten, installiert 11.10.2026) hätte jedes echte
|
||||
Berechtigungsmodell plattgewalzt und wurde am 30.10.2026 entfernt (Rolle
|
||||
`pve_media_cron`, Backup der Crontab unter `/var/backups/ghostnet/pve/`).
|
||||
|
||||
**Layout-Anlage:** Wegen `root_squash` auf dem Export kann Ansible als root
|
||||
keine chowned-Verzeichnisse anlegen; die Struktur wird als `gn-encoding`
|
||||
angelegt (runuser; Muster der Rolle `video_encoding`) oder vom Worker beim
|
||||
Start erzeugt und geprüft.
|
||||
beziehungsweise `gn-download` angelegt (`become_user`; die Rolle
|
||||
`video_encoding` erzeugt und verifiziert das Layout vollständig — Stand
|
||||
30.10.2026 umgesetzt, Verifikation bestanden).
|
||||
|
||||
**Abholung:** Die fertigen Outputs werden über CT-101 per SMB abgeholt: Share
|
||||
`[Encode]` (Pfad `/media/datenhdd3/Encoding/output`, RW für `ghost`, lesend für
|
||||
@@ -254,9 +264,13 @@ die Container gemountet (Updates ohne Image-Rebuild, versioniert über git).
|
||||
|
||||
## 11. Offene Punkte
|
||||
|
||||
1. NFSv4.2-Mount-Abnahme von `ghostnet-ki` gegen `10.0.0.2` — inkl.
|
||||
Schreib-/Lesetest als UID 982/983 über den Mount und mv-Simulation als
|
||||
`ghost` über SMB; mit der Encoding-Implementierung.
|
||||
1. **Output-Pickup über CT-101 (SMB) einmal als geschlossener Ablauf
|
||||
nachweisen:** Die Handover-Simulation (`verify-pipeline-handover.yml`)
|
||||
lief am 30.10.2026 vollständig durch (`.dlc`-Drop aus CT-101 →
|
||||
gn-download → queue → gn-encoding → output/state → gn-dashboard); das
|
||||
Lesen/Löschen des Output-Testreleases über CT-101 wurde durch den
|
||||
gleichzeitigen Server-Shutdown nicht mehr abgeschlossen und ist als
|
||||
kurzer Nachtest zu wiederholen.
|
||||
2. Feinjustierung der Ressourcenlimits nach Lasttest unter Inferenzlast
|
||||
(GNENC-001 Abschnitt 4).
|
||||
3. Rootless-TUN-Verifizierung für den VPN-Sidecar auf dem Host (Fallback:
|
||||
|
||||
Reference in New Issue
Block a user