#!/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" if [ "${RUN_SEED:-false}" = "true" ]; then echo "[entrypoint] RUN_SEED=true – seede DB" npx prisma db seed || echo "[entrypoint] Seed fehlgeschlagen oder schon gelaufen – ignoriert" fi echo "[entrypoint] Starte Backend…" exec "$@"