# ─── ShootTracker — Application principale ──────────────────────────────────── # Multi-stage : Build frontend React → Build backend Node.js → Runtime # ─── Stage 1 : Build frontend React ────────────────────────────────────────── FROM node:20-alpine AS frontend-builder WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm install --include=dev COPY frontend/ ./ RUN npm run build # ─── Stage 2 : Build backend Node.js ───────────────────────────────────────── FROM node:20-alpine AS backend-builder WORKDIR /app/backend COPY backend/package*.json ./ RUN npm install --include=dev COPY backend/ ./ RUN npm run build # ─── Stage 3 : Runtime ──────────────────────────────────────────────────────── FROM node:20-alpine AS runtime WORKDIR /app # Copier node_modules et build backend COPY --from=backend-builder /app/backend/node_modules ./node_modules COPY --from=backend-builder /app/backend/dist ./dist COPY --from=backend-builder /app/backend/package.json ./ # Copier le frontend buildé (servi par Express) COPY --from=frontend-builder /app/frontend/dist ./public # Créer les dossiers de données (volume monté en prod) RUN mkdir -p /app/data/uploads ENV NODE_ENV=production ENV PORT=3001 # JWT_SECRET doit être injecté via variable d'environnement au runtime HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \ CMD wget -qO- http://localhost:3001/api/health || exit 1 EXPOSE 3001 # Volume pour SQLite DB + uploads (persistant entre les redémarrages) VOLUME ["/app/data"] CMD ["node", "dist/index.js"]