Aufträge laufen als pg-boss-Jobs im worker. Der Phasen-Runner der Engine kennt weder Proxmox noch Datenbank; eine Senke schreibt Phasen und Log in die DB und meldet per NOTIFY, die app streamt per SSE an Web und CLI (Last-Event-ID, Herzschlag, Polling-Fallback im Browser). VMIDs vergibt eine Advisory-Sperre je Server zusammen mit einer Reservierungstabelle; zehn parallele Reservierungen im Test bekommen zehn verschiedene IDs. Der Proxmox-Client hat einen Trockenmodus für den Dry-Run: Lesendes echt, Schreibendes nur aufgezeichnet. Live-Ansicht im Aufbau der CLI-Ausgabe. Im echten Betrieb aufgefallen: ssh2 und pg sind CommonJS und brauchen im worker Default-Importe. Closes #006 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
15 lines
677 B
TypeScript
15 lines
677 B
TypeScript
import { NextResponse } from "next/server";
|
|
import { api } from "@/server/api";
|
|
import { rechtErforderlich } from "@/server/auth/zugang";
|
|
import { auftragHolen, logAb } from "@/server/services/auftraege";
|
|
|
|
type Kontext = { params: Promise<{ id: string }> };
|
|
|
|
/** Detail-Log ab einer Zeilen-ID (`?ab=`), für Polling und `proxdeploy logs`. */
|
|
export const GET = api(async (anfrage: Request, { params }: Kontext) => {
|
|
await rechtErforderlich(anfrage, "lesen");
|
|
const auftrag = await auftragHolen((await params).id);
|
|
const ab = new URL(anfrage.url).searchParams.get("ab");
|
|
return NextResponse.json(await logAb(auftrag.id, BigInt(/^\d+$/.test(ab ?? "") ? ab! : "0")));
|
|
});
|