# ── Stage 1 : Build TypeScript ─────────────────────────────── FROM node:20-alpine AS builder WORKDIR /app COPY package.json ./ RUN npm install --include=dev COPY tsconfig.json ./ COPY src/ ./src/ # Compile tout (app + scripts) → dist/ RUN npm run build # Copier les fichiers non-TypeScript (SQL, assets) dans dist/ RUN cp -r src/migrations dist/migrations # ── Stage 2 : Image de production ──────────────────────────── FROM node:20-alpine AS runtime WORKDIR /app ENV NODE_ENV=production # Dépendances de production uniquement COPY package.json ./ RUN npm install --omit=dev # Code compilé (app + scripts) COPY --from=builder /app/dist ./dist # Dossiers de stockage (montés via volume en prod) RUN mkdir -p /app/uploads/images /app/uploads/pdfs # Script de démarrage COPY docker-entrypoint.sh ./ RUN chmod +x /app/docker-entrypoint.sh EXPOSE 3001 ENTRYPOINT ["/app/docker-entrypoint.sh"]