# À construire depuis la racine du dépôt : docker build -f server/Dockerfile .
# Base Debian 13 (trixie) : moins de failles connues que bookworm.
FROM node:24-trixie-slim AS build
RUN apt-get update && apt-get install -y --no-install-recommends openssl && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY package.json package-lock.json ./
COPY server/package.json server/
COPY client/package.json client/
RUN npm ci --workspace server --include-workspace-root=false
# npm range souvent toutes les dépendances à la racine : on garantit que le dossier existe pour le COPY final.
RUN mkdir -p server/node_modules
COPY shared shared
COPY server server
RUN cd server && npx prisma generate && npm run build

# Dépendances de production seules : ni TypeScript, ni esbuild, ni tsx dans l'image finale.
FROM node:24-trixie-slim AS deps
WORKDIR /app
COPY package.json package-lock.json ./
COPY server/package.json server/
COPY client/package.json client/
# TypeScript reste installé comme dépendance facultative de prisma : on l'enlève (son binaire Go traîne des failles, inutile au lancement).
RUN npm ci --workspace server --include-workspace-root=false --omit=dev && mkdir -p server/node_modules \
  && rm -rf node_modules/typescript node_modules/@typescript node_modules/.bin/tsc node_modules/.bin/tsserver

FROM node:24-trixie-slim
# Correctifs de sécurité Debian du jour, et npm retiré : il ne sert pas au lancement (failles dans ses propres dépendances).
RUN apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends openssl && rm -rf /var/lib/apt/lists/* \
  && rm -rf /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/corepack /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack
WORKDIR /app
ENV NODE_ENV=production
ENV PATH=/app/server/node_modules/.bin:/app/node_modules/.bin:$PATH
COPY --from=deps /app/node_modules node_modules
COPY --from=deps /app/server/node_modules server/node_modules
COPY --from=build /app/server/dist server/dist
COPY --from=build /app/server/prisma server/prisma
COPY --from=build /app/server/prisma.config.ts server/
COPY --from=build /app/server/package.json server/
# Numéro de version de Voxsen (lu par server/src/version.ts : page de statut, annuaire Communauté).
COPY --from=build /app/client/package.json client/package.json
WORKDIR /app/server
EXPOSE 3000
# « exec » : node remplace le shell et reçoit lui-même le signal d'arrêt (sinon Docker attend 10 s avant de couper).
CMD ["sh", "-c", "prisma migrate deploy && exec node dist/index.js"]
