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:
37
scripts/build-seed-bundle.mjs
Normal file
37
scripts/build-seed-bundle.mjs
Normal file
@@ -0,0 +1,37 @@
|
||||
// Bündelt den Katalog-Seed (src/db/seed/index.ts inkl. Seed-Daten + Drizzle-
|
||||
// Schema) zu einer einzigen, selbstständigen ESM-Datei docker/seed.mjs für das
|
||||
// Laufzeit-Image — analog zu docker/migrate.mjs, aber generiert statt handgepflegt.
|
||||
//
|
||||
// Hintergrund: Der Standalone-Runner enthält weder `tsx` noch `src/`. Damit
|
||||
// RUN_SEED=true im Entrypoint tatsächlich funktioniert (statt still no-op zu
|
||||
// werden), bündeln wir die Seed-Logik beim Build zu Plain-ESM. `pg` und
|
||||
// `drizzle-orm` bleiben extern (sind im Runner als node_modules vorhanden);
|
||||
// alles andere (Schema, Seed-Daten, Upserts) wird inline gebündelt, sodass
|
||||
// keine `src/`-Dateien ins Runner-Image müssen.
|
||||
//
|
||||
// Aufruf: node scripts/build-seed-bundle.mjs (läuft im builder-Stage).
|
||||
|
||||
import { build } from "esbuild";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { dirname, resolve } from "node:path";
|
||||
|
||||
const here = dirname(fileURLToPath(import.meta.url));
|
||||
const root = resolve(here, "..");
|
||||
|
||||
await build({
|
||||
entryPoints: [resolve(root, "src/db/seed/index.ts")],
|
||||
outfile: resolve(root, "docker/seed.mjs"),
|
||||
bundle: true,
|
||||
platform: "node",
|
||||
format: "esm",
|
||||
target: "node22",
|
||||
// Im Runner vorhandene (und im Dockerfile kopierte) Laufzeit-Pakete bleiben
|
||||
// extern, damit wir keine zwei Kopien bündeln und die native pg-Kette nutzen.
|
||||
external: ["pg", "drizzle-orm", "drizzle-orm/*"],
|
||||
// src/db/seed/index.ts importiert ../../lib/audit.js NUR als `import type`
|
||||
// (Tx); damit zieht esbuild die @/db-Kette (next-auth etc.) nicht in den
|
||||
// Bundle. Die folgende alias-freie Auflösung reicht deshalb aus.
|
||||
logLevel: "info",
|
||||
});
|
||||
|
||||
console.log("docker/seed.mjs gebündelt.");
|
||||
Reference in New Issue
Block a user