# syntax=docker/dockerfile:1

# ---------- Basis ----------
FROM node:24-alpine AS basis
WORKDIR /app
# tini beendet Prozesse sauber, openssl wird fuer die Geheimnis-Erzeugung gebraucht.
RUN apk add --no-cache tini openssl
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
RUN corepack enable pnpm

# ---------- Abhaengigkeiten ----------
FROM basis AS abhaengigkeiten
# pnpm-workspace.yaml muss mit, sonst blockiert pnpm 12 die erlaubten Build-Skripte.
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY prisma ./prisma
COPY prisma.config.ts ./
RUN pnpm install --frozen-lockfile

# ---------- Bauen ----------
FROM abhaengigkeiten AS bauen
ARG APP_VERSION=0.0.0
ARG GIT_SHA=""
ENV NEXT_PUBLIC_APP_VERSION=$APP_VERSION
ENV NEXT_PUBLIC_GIT_SHA=$GIT_SHA
COPY . .
RUN pnpm exec prisma generate && pnpm build

# ---------- Laufzeit ----------
FROM basis AS laufzeit
ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME=0.0.0.0
RUN addgroup -g 1001 -S laufzettel && adduser -S laufzettel -u 1001 -G laufzettel
COPY --from=bauen --chown=laufzettel:laufzettel /app/.next/standalone ./
COPY --from=bauen --chown=laufzettel:laufzettel /app/.next/static ./.next/static
COPY --from=bauen --chown=laufzettel:laufzettel /app/public ./public
USER laufzettel
EXPOSE 3000
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "server.js"]
