Initial commit: Kalendartool (Next.js, Prisma, Docker)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
65
Dockerfile
Normal file
65
Dockerfile
Normal file
@@ -0,0 +1,65 @@
|
||||
# ---------- 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"]
|
||||
Reference in New Issue
Block a user