# ---------- Build-Stage ---------- # Debian statt Alpine: Prisma 5.x erkennt hier die OpenSSL-3-Engine # (debian-openssl-3.0.x) zuverlaessig. Auf aktuellen Alpine-Versionen # (OpenSSL >= 3.5) faellt Prisma auf die nicht verfuegbare 1.1-Engine # zurueck und der Client kann nicht initialisiert werden. FROM node:20-bookworm-slim AS builder WORKDIR /app COPY package.json package-lock.json ./ # ci statt install: reproduzierbarer Build aus dem Lockfile RUN npm ci # openssl-Binary: Prisma nutzt es zur Erkennung der Engine-Version. # Ohne dieses Binary faellt Prisma auf debian-openssl-1.1.x zurueck, # dessen Engine auf Bookworm (OpenSSL 3) nicht ladbar ist. RUN apt-get update -y \ && apt-get install -y --no-install-recommends openssl \ && rm -rf /var/lib/apt/lists/* COPY prisma ./prisma RUN npx prisma generate COPY . . RUN npm run build # ---------- Runtime-Stage ---------- FROM node:20-bookworm-slim AS runner WORKDIR /app ENV NODE_ENV=production ENV HOSTNAME=0.0.0.0 ENV PORT=3000 # openssl auch zur Laufzeit: die Prisma-CLI (migrate deploy) nutzt es # zur Engine-Erkennung; ohne Binary sucht sie die 1.1.x-Engine und failt. RUN apt-get update -y \ && apt-get install -y --no-install-recommends openssl \ && rm -rf /var/lib/apt/lists/* RUN addgroup --system nodejs && adduser --system --ingroup nodejs nextjs COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static # Prisma Client inkl. Query-Engine fuer den Laufzeit-Container COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma # Prisma-CLI fuer "migrate deploy" beim Start (kein npx-Download zur Laufzeit) COPY --from=builder --chown=nextjs:nodejs /app/node_modules/prisma ./node_modules/prisma COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma # bcryptjs fuer das Admin-Seed-Script (manuell ausfuehrbar, nicht beim Start) COPY --from=builder --chown=nextjs:nodejs /app/node_modules/bcryptjs ./node_modules/bcryptjs USER nextjs EXPOSE 3000 # Migrationen beim Start anwenden, optional Admin seeden, dann Server starten. # prisma migrate deploy ist idempotent und sicher fuer wiederholte Starts. # Das Seed-Script ist NICHT-destruktiv: Es legt den Admin nur an, wenn # noch keiner existiert (First-Run-Detection). Bestehende User werden # niemals geloescht. Wenn SEED_ADMIN_* nicht gesetzt sind, laeuft es # ohne Nebeneffekte durch. # Direkter node-Aufruf statt npx: im Standalone-Output existiert # node_modules/.bin nicht, daher wuerde "npx prisma" mit "not found" fehlschlagen. CMD ["sh", "-c", "node node_modules/prisma/build/index.js migrate deploy && node prisma/seed-admin.cjs && node server.js"]