# ─── 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 (devDeps inclus → ts-node disponible) COPY --from=backend-builder /app/backend/node_modules ./node_modules COPY --from=backend-builder /app/backend/dist ./dist COPY --from=backend-builder /app/backend/src ./src COPY --from=backend-builder /app/backend/tsconfig.json ./ 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"] # ts-node --transpile-only : contourne les erreurs de compilation tsc # (dist/index.js produit par tsc est tronqué sur certains environnements Alpine) CMD ["node_modules/.bin/ts-node", "--transpile-only", "src/index.ts"]