# #006 Aufträge, Phasen, worker und Live-Fortschritt **Status:** erledigt **Meilenstein:** v0.2.0 **Labels:** feature, engine **Geschätzt:** 8 h **Tatsächlich:** 0 h 15 min ## Ziel Hintergrund-Jobs mit Phasen in der DB, live per SSE in der Web-GUI. ## Aufgaben - [x] pg-boss im worker, Modelle `Auftrag`, `Phase`, `Logeintrag`, `VmidReservierung` - [x] Phasen-Runner (frameworkfrei) mit Ereignis-Senke (DB + NOTIFY), Fehler mit Ursache + Hinweis, Abbruch zwischen Phasen - [x] SSE-Endpunkt mit Last-Event-ID, Herzschlag, `X-Accel-Buffering: no`; Polling-Fallback im Client - [x] VMID-Vergabe mit Advisory-Lock, Test mit zehn parallelen Reservierungen - [x] Live-Ansicht als Terminal-Karte (Aufbau der CLI-Ausgabe), Detail-Log, Ergebnis-Box; Verlaufsseite - [x] Verwaiste Aufträge nach worker-Neustart als fehlgeschlagen markieren; doppelt gelieferte Jobs laufen nur einmal ## Akzeptanzkriterien - [x] Zwei parallele Aufträge bekommen nie dieselbe VMID (Test) - [x] Neuladen der Seite mitten im Auftrag zeigt den vollständigen Stand (Stand kommt immer ganz, Log ab Last-Event-ID) - [x] Live geprüft mit einem echten Template-Bau auf pve-demo (#007) ## Abhängigkeiten #003 ## Notizen / Entscheidungen - **ssh2 und pg sind CommonJS:** benannte Importe gehen im Next-Bundle, aber nicht im worker unter reinem Node-ESM – jetzt Default-Importe. - **Der worker lädt `.env` selbst** (`process.loadEnvFile`, falls vorhanden); im Container kommt die Umgebung von außen. - **Kein automatisches Wiederholen** (`retryLimit: 0`): halb angelegte Gäste soll ein Mensch ansehen. - **Abfrageschleifen** (Task-Status, VM-Status) erscheinen im Detail-Log nur bei Fehlern. - **Kopfzeile** (`Auftrag.kopf`) setzt die Engine – Web und CLI zeigen denselben Text. - Client-Komponenten importieren nichts aus `src/server` (struktureller Test in `tests/zugang.test.ts`).