6f293211a4
Der entrypoint prüft jetzt nach prisma db push, ob die User-Tabelle leer ist – wenn ja, wird automatisch geseeded. Damit muss man bei Erstinstallation nicht mehr daran denken, RUN_SEED=true zu setzen. Logik: RUN_SEED=true → Force-Seed (auch bei nicht-leerer DB; für Reset) User-Count = 0 → Auto-Seed (Default-Verhalten bei leerer DB) User-Count > 0 → kein Seed (DB schon initialisiert) Implementiert via "node -e" mit @prisma/client – kein extra Tool nötig. Fallback bei Fehlern: User-Count = -1, dann kein Seed. .env.example aktualisiert: RUN_SEED bleibt 'false' als Default und ist nur noch für Force-Reseed-Szenarien gedacht. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
60 lines
2.4 KiB
Bash
Executable File
60 lines
2.4 KiB
Bash
Executable File
#!/bin/sh
|
||
# Beim Container-Start: Schema in DB pushen (idempotent) + (optional) seed.
|
||
# RUN_SEED=true beim ersten Start setzen, danach wieder auf false.
|
||
set -e
|
||
|
||
# DATABASE_URL aus DB_*-Komponenten bauen, falls nicht explizit gesetzt.
|
||
# Wichtig: encodeURIComponent für DB_USER + DB_PASSWORD, damit Sonderzeichen
|
||
# wie $, !, #, @, :, / etc. nicht die URL-Authority-Syntax brechen.
|
||
# Wir nutzen node-eval (ist eh installiert), kein extra-Tool wie jq nötig.
|
||
if [ -z "$DATABASE_URL" ] && [ -n "$DB_USER" ] && [ -n "$DB_PASSWORD" ] && [ -n "$DB_NAME" ]; then
|
||
DATABASE_URL=$(node -e "
|
||
const u = encodeURIComponent(process.env.DB_USER);
|
||
const p = encodeURIComponent(process.env.DB_PASSWORD);
|
||
const h = process.env.DB_HOST || 'db';
|
||
const port = process.env.DB_PORT || '3306';
|
||
const n = process.env.DB_NAME;
|
||
process.stdout.write(\`mysql://\${u}:\${p}@\${h}:\${port}/\${n}\`);
|
||
")
|
||
export DATABASE_URL
|
||
echo "[entrypoint] DATABASE_URL aus DB_*-Komponenten gebaut (host=${DB_HOST:-db})"
|
||
fi
|
||
|
||
echo "[entrypoint] Warte auf Datenbank…"
|
||
# Prisma versucht selbst Connect; einfacher Retry-Loop um Race-Bedingungen
|
||
# beim parallelen Container-Start abzufangen.
|
||
TRIES=30
|
||
until npx prisma db push --skip-generate --accept-data-loss 2>/dev/null; do
|
||
TRIES=$((TRIES - 1))
|
||
if [ "$TRIES" -le 0 ]; then
|
||
echo "[entrypoint] DB nicht erreichbar – Abbruch"
|
||
exit 1
|
||
fi
|
||
echo "[entrypoint] DB noch nicht bereit – retry in 2s ($TRIES Versuche übrig)"
|
||
sleep 2
|
||
done
|
||
echo "[entrypoint] DB-Schema synced"
|
||
|
||
# Auto-Seed: wenn die User-Tabelle leer ist (= Erstinstallation), automatisch seeden.
|
||
# RUN_SEED=true erzwingt Seed auch bei nicht-leerer DB (z.B. nach Reset).
|
||
USER_COUNT=$(node -e "
|
||
const { PrismaClient } = require('@prisma/client');
|
||
const p = new PrismaClient();
|
||
p.user.count()
|
||
.then((n) => { process.stdout.write(String(n)); process.exit(0); })
|
||
.catch(() => { process.stdout.write('-1'); process.exit(0); });
|
||
" 2>/dev/null)
|
||
|
||
if [ "${RUN_SEED:-false}" = "true" ]; then
|
||
echo "[entrypoint] RUN_SEED=true – seede DB (Force)"
|
||
npx prisma db seed || echo "[entrypoint] Seed fehlgeschlagen oder schon gelaufen – ignoriert"
|
||
elif [ "$USER_COUNT" = "0" ]; then
|
||
echo "[entrypoint] DB ist leer (User-Count=0) – Auto-Seed wird ausgeführt"
|
||
npx prisma db seed || echo "[entrypoint] Auto-Seed fehlgeschlagen – ignoriert"
|
||
else
|
||
echo "[entrypoint] DB enthält $USER_COUNT User – kein Seed nötig"
|
||
fi
|
||
|
||
echo "[entrypoint] Starte Backend…"
|
||
exec "$@"
|