build: Docker-Betrieb und Standalone-Betrieb gleichwertig unterstuetzen

Dieselbe Codebasis laeuft nativ auf dem Rechner oder komplett im Container.

docker-compose.yml mit Profilen statt mehrerer Dateien:
- "db" laeuft immer  -> docker compose up -d db, App dann lokal per npm
- --profile full     -> zusaetzlich der App-Container
- --profile tools    -> Adminer als Datenbankoberflaeche

Dockerfile als Multi-Stage-Build auf dem Next-Standalone-Output. In die
Laufzeitschicht wandern zusaetzlich Prisma-CLI, Engines und Schema, damit der
Entrypoint beim Start "migrate deploy" ausfuehren kann. Das Alpine-Image
bekommt openssl fuer die Prisma-Engines, der Client wird zusaetzlich fuer
linux-musl-openssl-3.0.x erzeugt. Der Container laeuft als unprivilegierter
Benutzer und meldet seinen Zustand ueber /api/health.

Der Entrypoint wartet in einer Schleife auf die Datenbank, ergaenzend zum
pg_isready-Healthcheck und der depends_on-Bedingung.

scripts/setup.mjs legt die .env aus der Vorlage an und erzeugt dabei ein
zufaelliges APP_SECRET, damit die Tokens nicht mit dem Standardschluessel
verschluesselt werden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-25 19:35:04 +02:00
co-authored by Claude Opus 5
parent 72674dee4e
commit c781c5d19d
5 changed files with 275 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
#!/bin/sh
# ─────────────────────────────────────────────────────────────
# Startet Nebula im Container: erst Migrationen, dann der Server.
# ─────────────────────────────────────────────────────────────
set -e
PRISMA_CLI="/app/node_modules/prisma/build/index.js"
SCHEMA="/app/prisma/schema.prisma"
if [ -z "$DATABASE_URL" ]; then
echo "[nebula] FEHLER: DATABASE_URL ist nicht gesetzt." >&2
exit 1
fi
echo "[nebula] Migrationen werden eingespielt…"
attempt=0
max_attempts=15
until node "$PRISMA_CLI" migrate deploy --schema "$SCHEMA"; do
attempt=$((attempt + 1))
if [ "$attempt" -ge "$max_attempts" ]; then
echo "[nebula] FEHLER: Migration nach $max_attempts Versuchen fehlgeschlagen." >&2
exit 1
fi
echo "[nebula] Datenbank noch nicht bereit – neuer Versuch in 3s ($attempt/$max_attempts)"
sleep 3
done
echo "[nebula] Migrationen ok. Server startet auf Port ${PORT:-3000}."
exec "$@"