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>
50 lines
1.8 KiB
Bash
50 lines
1.8 KiB
Bash
#!/bin/sh
|
|
# FlorianNetz Container-Entrypoint.
|
|
# Ablauf: auf Postgres warten -> Migrationen anwenden -> (optional) seeden ->
|
|
# App-Server starten. Idempotent: Migration + Seed nutzen Journal/Upserts.
|
|
set -eu
|
|
|
|
echo "[entrypoint] FlorianNetz startet ..."
|
|
|
|
if [ -z "${DATABASE_URL:-}" ]; then
|
|
echo "[entrypoint] FEHLER: DATABASE_URL ist nicht gesetzt." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# --- 1) Auf Postgres warten ---------------------------------------------------
|
|
# pg_isready akzeptiert die DATABASE_URL direkt; bis ~60 s pollen.
|
|
echo "[entrypoint] Warte auf Postgres ..."
|
|
ATTEMPTS=0
|
|
MAX_ATTEMPTS="${DB_WAIT_RETRIES:-60}"
|
|
until pg_isready -d "${DATABASE_URL}" >/dev/null 2>&1; do
|
|
ATTEMPTS=$((ATTEMPTS + 1))
|
|
if [ "${ATTEMPTS}" -ge "${MAX_ATTEMPTS}" ]; then
|
|
echo "[entrypoint] FEHLER: Postgres nach ${MAX_ATTEMPTS} Versuchen nicht erreichbar." >&2
|
|
exit 1
|
|
fi
|
|
sleep 1
|
|
done
|
|
echo "[entrypoint] Postgres ist erreichbar."
|
|
|
|
# --- 2) Migrationen anwenden (idempotent über das Drizzle-Journal) ------------
|
|
echo "[entrypoint] Wende Migrationen an ..."
|
|
node docker/migrate.mjs
|
|
|
|
# --- 3) Optionaler Seed -------------------------------------------------------
|
|
# 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] 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 ----------------------------------------------------
|
|
echo "[entrypoint] Starte Anwendung: $*"
|
|
exec node server.js
|