FROM node:22-bookworm-slim AS builder
WORKDIR /app
COPY package*.json .npmrc ./
# `.npmrc` coupe tous les scripts d'installation (D-047) : on relance nommément les deux qui
# servent au build. `next build` lance ESLint, donc le résolveur d'imports doit être lié.
RUN npm ci && npm rebuild esbuild unrs-resolver
COPY . .
RUN npm run build

# Dépendances de production seules, pour le script de migration (audit E2) — le build standalone
# ne trace que ce que Next.js atteint depuis les pages/routes, pas les scripts hors app.
FROM node:22-bookworm-slim AS deps
WORKDIR /app
COPY package*.json .npmrc ./
# `sharp` est le seul paquet de production à avoir un script d'installation (optimisation des
# images de Next.js) ; il est relié à son binaire ici, les scripts étant coupés par défaut (D-047).
RUN npm ci --omit=dev && npm rebuild sharp

FROM node:22-bookworm-slim
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
# `output: "standalone"` ne trace ni `public/` ni `.next/static` : Next.js laisse les deux à
# copier à la main. Sans cette ligne, le logo des mails répondrait 404 chez tous les destinataires
# — une image cassée dans l'en-tête de chaque message, invisible en développement où le serveur
# sert `public/` depuis le disque.
COPY --from=builder /app/public ./public
COPY --from=builder /app/knowledge ./knowledge
COPY --from=builder /app/drizzle ./drizzle
COPY --from=builder /app/scripts/migrate.ts ./scripts/migrate.ts
COPY --from=deps /app/node_modules ./node_modules
EXPOSE 3000
# Migrations versionnées jouées avant le serveur (§ 27) — remplace le `drizzle-kit push` manuel.
CMD ["sh", "-c", "node --experimental-strip-types scripts/migrate.ts && node server.js"]
