Zum Inhalt springen
Farbschema wählenSprache wählen

Den App-Build-Worker betreiben

Das Frontend einer App (React, Svelte oder ein einfacher Quellordner) wird nicht im API-Prozess gebaut. Ein eigener Build-Worker pollt die Warteschlange, holt sich einen Build nach dem anderen, führt vite build aus und meldet das Ergebnis zurück. Diese Seite beschreibt, wie man ihn betreibt.

Am 28.08.2026 fand ein flottenweiter Suchlauf nach verwaisten Containern auf dem Stage-Host einen, der seit 58 Tagen unter dem Namen stage-app-builder-oneshot lief. Er trug kein com.docker.compose.project-Etikett, also gehörte er niemandem und niemand hätte ihn je neu gestartet. Er war eine Entscheidung davon entfernt, als Müll abgeräumt zu werden.

Er war kein Müll. Er war der Build-Worker und tat genau das, wofür er gebaut ist.

Zwei Dinge machten diesen Beinahe-Verlust möglich; diese Seite schließt beide:

  1. Der Name log. An oneshot ist bei einem Poller nichts wahr.
  2. Sein Ausfall ist unsichtbar. Es gibt keinen Alarm auf „niemand pollt die Build-Warteschlange”. Nimmt man den Worker weg, stauen sich App-Builds einfach: nichts schlägt fehl, nichts alarmiert, und das erste Symptom ist ein Nutzer, der meldet, ein Build „tue nichts”.

Betreibe ihn als Compose-Dienst, nie als handgestartetes docker run. Ein handgestarteter Container überlebt keinen Host-Neustart, trägt kein Projekt-Etikett und ist für jeden, der aufräumt, von Abfall nicht zu unterscheiden.

services:
supacloud-app-builder:
image: git.blockworx.tech/blockworx/supacloud-agent-unified:node
restart: unless-stopped
environment:
AGENT_TYPE: app_builder
SUPACLOUD_API_URL: https://app.example.com
RUNNER_TOKEN: ${SUPACLOUD_RUNNER_TOKEN}

Benenne ihn nach dem, was er ist. supacloud-app-builder ist der kanonische Name; alles mit oneshot, job oder temp darin ist falsch und lädt zum Löschen ein.

Variable Pflicht Bedeutung
AGENT_TYPE ja Muss exakt app_builder sein. Sie wählt den Kurzschluss im Einstiegspunkt des Runners, noch bevor die Harness-Adapter-Registry befragt wird.
SUPACLOUD_API_URL ja Basis-URL der SupaCloud-API. Nachlaufende Schrägstriche werden entfernt.
RUNNER_TOKEN ja Das Runner-Credential. SUPACLOUD_RUNNER_TOKEN wird als Alias akzeptiert.
BUILD_POLL_INTERVAL_MS nein Millisekunden zwischen zwei Abfragen einer leeren Warteschlange. Standard 5000; ein nicht-numerischer oder nicht-positiver Wert fällt auf den Standard zurück, statt zu scheitern.
BUILD_ALLOW_POSTINSTALL nein Akzeptiert 1 oder true. Erlaubt npm-postinstall-Skripte während des Builds. Lass sie ungesetzt. Sie ist aus gutem Grund standardmäßig aus: ein postinstall-Skript ist beliebiger Code aus einem Abhängigkeitsbaum.

Setze weder TASK_ID noch TASK_PROMPT. Jeder andere Runner-Modus verlangt sie; dieser ist ausdrücklich ausgenommen, weil er an keine Aufgabe gebunden ist. Sie zu setzen schadet nicht, stellt den Prozess aber falsch dar.

Fehlt SUPACLOUD_API_URL oder RUNNER_TOKEN, beendet sich der Worker sofort mit einer benannten Fehlermeldung, statt still weiterzupollen. restart: unless-stopped ist damit sicher: ein fehlkonfigurierter Worker läuft sichtbar in eine Neustartschleife, statt Arbeit vorzutäuschen.

Der Zugriff auf die Warteschlange läuft transaktional über FOR UPDATE SKIP LOCKED, zwei Worker holen sich also nie denselben Build. Ein zweiter Worker ist damit sicher und zugleich die einfachste Verteidigung gegen den lautlosen Ausfall von oben: mit einem Worker legt sein Verlust alle Builds still, mit zweien hält der Überlebende die Warteschlange in Bewegung.

Die Gesundheit des Workers ist nicht „der Container läuft” — ein Poller mit falschem Token, der in einer Neustartschleife hängt, sieht zwischen zwei Neustarts betriebsbereit aus. Prüfe stattdessen die Warteschlange:

  • Aus der Flotte: Der Container existiert, trägt ein Compose-Projekt-Etikett, und sein Log zeigt Starting unified runner in app_builder mode, gefolgt von Poll-Aktivität statt eines sich wiederholenden Startfehlers.
  • Aus dem Produkt: Stoße für eine beliebige App einen Build an und prüfe, ob er den Wartezustand verlässt. Ein Build, der wartet, während die API gesund ist, bedeutet: niemand holt ihn ab.
Symptom Ursache Behebung
Builds warten endlos, API gesund Kein Worker läuft, oder alle hängen in der Neustartschleife Prüfen, ob der Dienst läuft, und seine erste Log-Zeile lesen
Worker endet sofort, SUPACLOUD_API_URL is required Variable nicht oder leer gesetzt Setzen; ein nachlaufender Schrägstrich wird entfernt, nicht abgelehnt
Worker endet sofort, RUNNER_TOKEN is required Weder RUNNER_TOKEN noch SUPACLOUD_RUNNER_TOKEN gesetzt Eines von beiden setzen
Worker pollt, holt aber nie etwas Warteschlange ist wirklich leer, oder dem Token fehlt der Zugriff Einen Build einstellen und das Log beobachten
Container nach Host-Neustart verschwunden Er war handgestartet, kein Compose-Dienst Wie oben gezeigt als Dienst betreiben