provisioning-server/migrations/0016_iso_builds.sql
Thomas Stallinger f69ed66267 feat: ISO-Build-Orchestrierung fuer personalisierte Kunden-ISOs (Phase 4)
Neue iso_builds-Tabelle (Migration 0016) + vier Endpunkte, die
tuxflotte-installer/scripts/build_customer_iso.sh als Hintergrund-Thread
anstossen: POST/GET .../iso-builds (Trigger + Liste), GET
/api/v1/iso-builds/{id} (Status-Poll) und .../download (fertige ISO
ausliefern). Aeltere abgeschlossene Builds derselben Organisation werden
nach einem erfolgreichen neuen Build automatisch aufgeraeumt (Datei +
DB-Zeile) - anodes Root-Dateisystem ist mit 28GB knapp bemessen.

WLAN-Zugangsdaten werden bewusst nicht in iso_builds gespeichert, nur
transient an build_customer_iso.sh durchgereicht.

Lokal end-to-end gegen einen Wegwerf-Postgres-Container verifiziert (alle
Migrationen 0001-0016, echter build_customer_iso.sh-Lauf gegen die
gecachte Mint-ISO, Status-Uebergaenge pending->running->completed,
Download-Endpunkt liefert byte-identische Datei, Cleanup-Logik entfernt
den vorherigen Build einer Organisation nach dem naechsten erfolgreichen
Bau). Testorganisation danach wieder geloescht.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 00:39:32 +02:00

28 lines
1.1 KiB
PL/PgSQL

BEGIN;
-- Phase 4 des Self-Service-ISO-Plans: Bautracking fuer personalisierte
-- Kunden-ISOs (siehe tuxflotte-installer/scripts/build_customer_iso.sh).
-- Der Bau selbst laeuft als Hintergrund-Thread im provisioning-server
-- (siehe run_iso_build() in app.py) - diese Tabelle ist der Status-
-- Speicher dafuer, den der Trigger-/Status-/Download-Endpoint gemeinsam
-- nutzen. WLAN-Zugangsdaten werden bewusst NICHT hier gespeichert (nur
-- transient waehrend des Baus verwendet, siehe app.py) - persistente,
-- verschluesselte Ablage ist Sache der Kundenplattform (Phase 5).
CREATE TABLE iso_builds (
id UUID PRIMARY KEY,
organization_id UUID NOT NULL
REFERENCES organizations(id)
ON DELETE CASCADE,
status TEXT NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending', 'running', 'completed', 'failed')),
output_filename TEXT,
error_message TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
started_at TIMESTAMPTZ,
finished_at TIMESTAMPTZ
);
CREATE INDEX iso_builds_organization_id_idx ON iso_builds (organization_id);
COMMIT;