fix(deploy): vollständige pg-Closure + funktionierender RUN_SEED im Runner-Image

Zwei BLOCKING-Befunde für "Deployment (Docker + externes Traefik)":

1) pg-Laufzeit-Closure unvollständig: pg-types/lib/binaryParsers.js macht
   eager require('pg-int8'), postgres-interval/index.js require('xtend/mutable').
   Beide lagen NICHT im Runner-Image -> node docker/migrate.mjs crasht beim
   Container-Start mit ERR_MODULE_NOT_FOUND, Deploy kaputt. Fix: COPY für
   pg-int8 + xtend ergänzt. Neuer Test berechnet die reale Closure aus
   node_modules und schlägt fehl, sobald ein Paket nicht ins Image kopiert
   wird (schützt vor erneutem Brechen bei pg/drizzle-Updates).

2) RUN_SEED toter Pfad: entrypoint.sh rief docker/seed.mjs auf, das nie
   existierte -> RUN_SEED=true no-opte still zu leerem Katalog. Fix:
   scripts/build-seed-bundle.mjs bündelt src/db/seed (inkl. Schema + Daten,
   pg/drizzle-orm extern) per esbuild zu selbstständigem docker/seed.mjs;
   im builder erzeugt und ins Runner-Image kopiert. entrypoint.sh bricht
   jetzt laut ab, wenn RUN_SEED=true und das Bundle fehlt, statt still zu
   überspringen. docker/seed.mjs ist generiert -> gitignored.

Verifiziert offline: tsc --noEmit, vitest (deployment + seed-Daten, 36 grün),
Bundle baut + lädt sauber (externe Imports nur pg/drizzle-orm, exit 1 ohne
DATABASE_URL). docker build/run sind im Sandbox deferred (kein Docker/Postgres).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthias Hochmeister
2026-06-09 12:54:59 +02:00
parent d50ec765ab
commit 9927711192
5 changed files with 125 additions and 8 deletions

View File

@@ -31,15 +31,17 @@ echo "[entrypoint] Wende Migrationen an ..."
node docker/migrate.mjs
# --- 3) Optionaler Seed -------------------------------------------------------
# RUN_SEED=true füllt den NÖ-Katalog (idempotente Upserts). Setzt das gebündelte
# Seed-Skript voraus (docker/seed.mjs); fehlt es, wird der Schritt übersprungen.
# RUN_SEED=true füllt den NÖ-Katalog (idempotente Upserts) über das beim Image-
# Build gebündelte Seed-Skript (docker/seed.mjs, siehe scripts/build-seed-bundle.mjs).
# Das Skript MUSS im Image vorhanden sein; fehlt es, ist das Image kaputt gebaut
# und wir brechen laut ab, statt einen leeren Katalog vorzutäuschen.
if [ "${RUN_SEED:-false}" = "true" ]; then
if [ -f docker/seed.mjs ]; then
echo "[entrypoint] Führe Katalog-Seed aus ..."
node docker/seed.mjs
else
echo "[entrypoint] RUN_SEED=true, aber docker/seed.mjs fehlt — Seed übersprungen." >&2
if [ ! -f docker/seed.mjs ]; then
echo "[entrypoint] FEHLER: RUN_SEED=true, aber docker/seed.mjs fehlt im Image." >&2
exit 1
fi
echo "[entrypoint] Führe Katalog-Seed aus ..."
node docker/seed.mjs
fi
# --- 4) App-Server starten ----------------------------------------------------