Files
Artista-Filmcamp/Dockerfile
T
Nick SzaunigandClaude Opus 5.5 c84eb1e740
Docker-Images bauen und veroeffentlichen / build-and-push (push) Successful in 2m17s
refactor(k8s): schlanker Umfang, Postgres und Medien auf SMB
Auf Wunsch des Betreibers auf das Noetige reduziert: StatefulSet
PostgreSQL, Services, Ingress, App-Deployment, zwei SMB-PersistentVolumes
(Postgres-Daten, Medien). Beibehalten nach Absprache: Worker-CronJob
(Folgeraten, Reservierungsfreigabe, Mail-Wiederholung), ConfigMap und die
NetworkPolicies (Sicherheitsbefund Rate-Limit-Umgehung).

- Migration als initContainer im App-Deployment statt eigenem Job
- Entfernt: Backup-CronJob/-Volume (NAS sichert die Freigabe),
  Migrations-CronJob, PodDisruptionBudget, HTTP-Redirect-Ingress und
  Middleware, Namespace-Objekt (einmalig von Hand anzulegen)
- PostgreSQL auf SMB als bewusste, dokumentierte Ausnahme mit
  hard, cache=strict, SMB 3.1.1 + seal, uid 70 / 0700

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-27 20:36:30 +02:00

63 lines
2.7 KiB
Docker

# syntax=docker/dockerfile:1
#
# Zwei Images aus einem Build:
# docker build --target runner -t <registry>/artista-modelcamp:<tag> .
# docker build --target tools -t <registry>/artista-modelcamp-tools:<tag> .
#
# runner: der Next.js-Server (standalone), sonst nichts.
# tools: Prisma-CLI + tsx fuer die Migration (initContainer im App-Deployment),
# den Worker (CronJob) und `admin:create`.
# Beide IMMER mit demselben Tag bauen und ausrollen — sie teilen das
# Datenbankschema.
FROM node:22.23.2-alpine3.24 AS base
RUN corepack enable
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED=1
# --- Abhaengigkeiten --------------------------------------------------------
FROM base AS deps
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
# postinstall (prisma generate) braucht das Schema, das erst im builder
# vorliegt; generiert wird dort ausdruecklich.
RUN pnpm install --frozen-lockfile --ignore-scripts
# --- Build ------------------------------------------------------------------
FROM base AS builder
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Zur Build-Zeit wird keine Datenbank und kein Secret benoetigt.
RUN mkdir -p public && pnpm prisma generate && pnpm next build
# --- Laufzeit: Anwendung ------------------------------------------------------
FROM node:22.23.2-alpine3.24 AS runner
WORKDIR /app
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
PORT=3000 \
HOSTNAME=0.0.0.0 \
MEDIA_DIR=/app/media
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 --ingroup nodejs nextjs
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
# Schreibbar fuer den Bild-Cache; im Cluster ein emptyDir (reiner Cache).
RUN mkdir -p /app/.next/cache /app/media && chown -R nextjs:nodejs /app/.next/cache /app/media
USER 1001
EXPOSE 3000
CMD ["node", "server.js"]
# --- Laufzeit: Werkzeuge (Migration, Worker, Admin-Anlage) --------------------
FROM base AS tools
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 --ingroup nodejs nextjs
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=nextjs:nodejs /app/src ./src
COPY --from=builder --chown=nextjs:nodejs /app/scripts ./scripts
COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma
COPY --from=builder --chown=nextjs:nodejs /app/prisma.config.ts /app/package.json /app/tsconfig.json ./
ENV PATH="/app/node_modules/.bin:${PATH}"
USER 1001
# Standard: Migrationen anwenden. Worker: ["tsx", "scripts/worker.ts"].
CMD ["prisma", "migrate", "deploy"]