Betreiberentscheidungen 31.10.2026: Umgebungen Production, Testing und
Experimental mit exklusivem GPU-Scheduling; Umschaltoperation
ai_environment_switch für kurze Downtimes mit kommunizierten Zeitfenstern;
Wartungsseite oder transparenter Endpunktwechsel für nutzerseitige Dienste;
model_store als Kernrolle für gepinnte Weights in /var/lib/ghostnet-ai/shared;
verallgemeinerte inference_engine-Rolle; Gitea-Actions-Kette mit Runner-Scope
Experimental/Testing und Production ausschließlich über Promotion-Tag;
Strata als erster Experimental-Kandidat (Abschnitt 7.6) mit gfx1030-Vorbehalten.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Rechercheberichte zu Qwen3.8-Familie, Flash-Next, Strata-Engine (Niko1221),
MTP/n-gram Speculative Decoding und RDNA2-Backends; Grundlage für
GNAI-008 Abschnitt 7.6 und die kommende Experimental-Umgebung.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- 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>
- CT 101 kennt NFS nicht mehr: samba_nfs-Rolle und Ganesha-Artefakte entfernt,
kein Podman, keine 2049-Firewall-Regel, kein seccomp-Sondereintrag; live
restlos bereinigt und deckungsgleich mit dem Playbook (verify ok=47,
Idempotenz changed=0). Dafür neue SMB-Freigabe [Encoding] (Export-Root) für
die Kontrolle von anderen Geräten als ghostnet-ki.
- Grund: Weder kernel-nfsd noch Ganesha (VFS-FSAL) laufen in einem
unprivileged LXC — open_by_handle_at braucht CAP_DAC_READ_SEARCH in der
init-userns und liefert dort immer EPERM (verifiziert auf Kernel
7.0.14-14-pve; Web-Recherche: NFS direkt auf dem PVE-Host ist gängige Praxis
und anerkannte Ausnahme vom Host-Grundsatz).
- Neuer Account ansible-deploy (UID 1001) auf dem PVE-Host 10.0.0.2 nach
LXC-Muster: gelocktes Passwort, source-restrictierter passphrase-loser Key
(nur pub im Repo), NOPASSWD-Sudoers; Host-Key-Fingerprint verifiziert.
- Neues Host-Projekt proxmox/pve-host/ansible (Schema wie die CT-Projekte):
preflight/site.yml/verify-production + Rollen pve_nfs_export (Kernel-NFS,
/etc/exports nur 10.0.0.90/32, NFSv4-only, Export-Root 100000:970 2775,
nft 2049 nur von 10.0.0.90) und pve_lxc_conf (seccomp-Leerzeile aus
101.conf entfernt). Auf dem Host grün: check changed=0, verify ok=15,
Idempotenz changed=0.
- Abnahme bestanden: NFSv4.2-Mount von ghostnet-ki gegen
10.0.0.2:/media/datenhdd3/Encoding (Export-Root 100000:970 2775 sichtbar),
sauberer Unmount. CT 101 nach Reboot: Seccomp 2, keine failed units, 17
Shares, 10 CIFS-Mounts der Workstation hängen.
- Doku aktualisiert: GNAI-017 §4.1 und GNAI-019 E2/E3/§15 revidiert,
Bereichsindex ergänzt, READMEs angepasst; PVE-Lifecycle-Skripte ohne
seccomp-Ausnahme (Hashes aktualisiert).
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Mount von ghostnet-ki schlug mit EPERM fehl: Export hatte "0 defined
clients" (kein clients-Parameter -> Zugriffspruefung schlaegt fehl)
- Ganesha 6.5: CLIENT-Block mit kleingeschriebenem `clients`, Block MUSS vor
dem EXPORT stehen (Parser ist reihenfolgeempfindlich); gegen den 6.5-Parser
verifiziert. EXPORT auf Access_Type = None (deny-by-default), CLIENT gewaehrt
10.0.0.90 RW; nftables deckelt zusaetzlich auf 2049 nur von 10.0.0.90
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Allow_Set_IO_Flusher_Fail = true: PR_SET_IO_FLUSHER braucht CAP_SYS_ADMIN
in der init-userns (im Guest nicht vorhanden) und war FATAL
- NFSv4 RecoveryRoot = /var/lib/nfs-ganesha (rw-State-Volume des Quadlets);
der Default /var/lib/nfs/ganesha ist im ReadOnly-Container nicht schreibbar
- AccessType -> Access_Type (Ganesha 6.5, sonst "Unknown parameter")
- per-export Client-Liste entfernt: Clients/clients/CLIENT-Block werden vom
6.5-Parser abgelehnt; die Client-Beschränkung (nur 10.0.0.90) wird durch
die nftables-Policy durchgesetzt (2049 nur von 10.0.0.90, default drop)
- im Image verifiziert: strict parse (-x) clean, Listener auf *:2049 OK
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- ganesha.nfsd startete im Quadlet-Container nicht: FATAL open(
/var/run/ganesha/ganesha.pid) ENOENT — /run ist im Container eine leere
rw-Tmpfs (ReadOnly=true), das Default-Pidfile-Verzeichnis existiert nicht
- Fix: -p /run/ganesha.pid in der Containerfile-CMD (CLI-Option, per
ganesha.nfsd -p im Image verifiziert); /run selbst ist rw und existiert
- Containerfile-Checksum neu gepinnt (54cf9cae..., 2026-10-30) in
samba_nfs-Default und allen drei Inventaren; Image wird beim nächsten
Lauf automatisch neu gebaut (Label-Vergleich)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- group_vars spiegelt samba_smb_config_file/passdb_file sowie
samba_access_admin_user/ssh_dropin, damit backup.yml/verify-production.yml
ohne geladene Rolle laufen (CT-100/102-Konvention); alle drei Inventare
byte-identisch
- samba_lxc_baseline: unattended-upgrades.service nach dem apt-Install
enable+starten, Task mit when: not ansible_check_mode
- samba_nfs: artifact_source_root auf playbook_dir/../.. korrigiert
(Artifacts liegen in ct-101-samba/, nicht in ansible/); gn-media-Probe mit
failed_when: false und Assert-Guard für den ersten Check-Mode-Lauf;
Ganesha-Restart-Handler mit when: not ansible_check_mode
- site.yml --check --diff gegen CT 101 grün: ok=100 changed=20 failed=0
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- ghost-Workstation-Key rotiert (Passphrase nicht mehr erinnerlich): neues
Paar id_ed25519_ghostnet_ct101_ghost, samba-ghost.pub aktualisiert und auf
CT 101 installiert; GNAI-017 Befund (f) dokumentiert die Rotation
29.10.2026; altes Paar lokal gelöscht
- pdbedit-Pfad korrigiert: /usr/sbin/pdbedit -> /usr/bin/pdbedit (Debian),
5 Stellen in audit-production/backup/verify-production/samba_smb
- passdb-Subset-Asserts parsen user:uid:gecos jetzt korrekt per
regex_replace (audit/verify/samba_smb)
- is-active-Leseproben mit failed_when: false, damit die Asserts die
klaren Fehlermeldungen liefern (audit/preflight/verify/samba_smb)
- samba_lxc_baseline enabled+startet unattended-upgrades.service nach dem
Paket-Install (CT-100/102-Konvention), README ergänzt
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- GNAI-017/GNAI-019: Cleanup als erledigt markiert (smbpasswd -x dark2devil
+ userdel -r; passdb danach nur noch ghost/daidalaw/debugofen; Konto war
gelockt, Shell /bin/false, keine Dateien außerhalb des Home)
- Inventar-Kommentare aktualisiert (UID 1002 wieder frei; ansible-deploy-UID
1005 erlaeutert); alle drei Inventare byte-identisch
- samba_access-Kommentar angepasst (dark2devil nicht mehr unter den
produktiven Accounts)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- dark2devil (UID 1002) aus der gesamten deklarierten State entfernt:
derselbe Benutzer wie debugofen (Betreiberklärung 2026-10-28); GNAI-019
Entscheidung 11 revidiert, gn-media-Mitgliedschaft nur ghost
- Share-ACLs im Inventar an die live smb.conf angeglichen (GNAI-018 R4):
admin users auf elf Shares ergänzt, write list Dokumente/Extern ergänzt,
Serien2 ohne force user/group; Template [printers] um browseable=no ergänzt
- passdb-Asserts und Audit-Loops auf die drei deklarierten Medien-User
umgestellt; Platzhalterzahl 11; provision-Script-Hash aktualisiert
- AGENTS.md (Repo-Root) um Grundwissen für Agenten ergänzt:
ghost-agent-Convention, Account-Landscape/Inventory-Pfade,
Operator-Run-Steps, LXC-Konventionen, Repo-Konventionen
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- 5 template/file-Lookups verwendeten relative Pfade (roles/..., files/...),
die sich aus playbooks/ nicht auflösen; auf playbook_dir ~ '/../...' umgestellt
- dns_pihole_container_name, dns_pihole_data_directory und dns_pihole_quadlet_path
aus den Rollen-Defaults in alle 3 Inventories gespiegelt (self-contained inventory)
- Verifiziert: gerendertes Quadlet byte-identisch mit Live-Datei, nftables weicht
nur um die Managed-Kennung ab, 18/18 Syntax-Checks
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Drei HandBrake-Presets (SVT-AV1 10-bit, MKV, Audio-Passthrough) versioniert
unter llm-server/encoding/profiles/; Profilwahl ueber gleichnamige Ordner
unter input/. Gemeinsamer NFS-Mount mit input/- und output/-Unterverzeichnissen.
Input-Loeschung nach Encoding und Validierung, Output bis Abholung, work/ pro
Lauf. Dashboard-Endpunkte fuer Fortschritt und Ressourcen als Statusanzeige.
Eigene Programme liegen kuenftig unter llm-server/encoding/scripts/.
GNENC-000/001 aktualisiert.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
HandBrake linuxserver/handbrake:1.11.2-ls48 mit amd64-Manifest-Digest
sha256:fda92bd1...48a3c7 gepinnt und per Pull im rootless Store von
gn-encoding verifiziert. Zeitfenster 00:00-06:00 Uhr Europe/Berlin mit
geordnetem Stopp und naechtlichem Retry; NFS-Mounts fuer Ein- und Ausgabe.
GNENC-000/001 aktualisiert.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
llm-server/encoding/ansible/ verwaltet mit video-encoding.yml und der Rolle
video_encoding den CPU-Only-Grundzustand des gesperrten Kontos gn-encoding
(UID/GID 982): Konto-Identität und Passwortsperre, subordinate ID-Bereiche,
Verzeichnisstruktur, Quadlet-Verzeichnis, Linger, getrennter rootless
Podman-Store sowie verwehrter GPU-Zugriff (keine render/video-Gruppe, kein
Lesezugriff auf /dev/kfd oder DRM-Render-Nodes). Ohne beschlossene
Encoder-Entscheidungen stellt die Rolle sicher, dass kein Workload definiert
ist. Check-Mode und zwei Läufe auf ghostnet-ki: jeweils ok=30 changed=0
failed=0. Preflight, host.yml (2x ok=55 changed=0) und ROCm-Probe
(ok=33 changed=0) nach der Projekt-Aufteilung erneut bestanden.
GNENC-000/001, GNAI-000 und GNAI-013 aktualisiert.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Grundkonfiguration des Servers liegt nun unter llm-server/host/ansible/
(vorher llm-server/ansible/), der LLM-Stack-Platzhalter unter llm-server/llm/
und der Encoding-Workload unter llm-server/encoding/. Dokumentation und
Pfadverweise (ansible.cfg roles_path, .venv-Tiefe, Markdown-Links) angepasst;
Linkvalidator meldet broken_local_links=0.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>