# syntax=docker/dockerfile:1 # ============================================================ # Stage 1: Build the React frontend (Vite) # ============================================================ FROM node:22-bookworm AS frontend-build WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm install COPY frontend ./ RUN npm run build # Output: /app/frontend/dist # ============================================================ # Stage 2: Build the TypeScript backend # ============================================================ FROM node:22-bookworm AS backend-build WORKDIR /app/backend COPY backend/package*.json ./ RUN npm install COPY backend ./ RUN npm run build # Output: /app/backend/dist + node_modules # ============================================================ # Stage 3: Slim runtime image # ============================================================ FROM node:22-bookworm-slim WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends \ docker.io awscli jq bash coreutils ca-certificates \ && rm -rf /var/lib/apt/lists/* # Backend runtime COPY --from=backend-build /app/backend/node_modules ./backend/node_modules COPY --from=backend-build /app/backend/dist ./backend/dist COPY backend/migrations ./backend/migrations # Frontend bundle (served by express.static via PUBLIC_DIR) COPY --from=frontend-build /app/frontend/dist ./frontend WORKDIR /app/backend ENV NODE_ENV=production PUBLIC_DIR=/app/frontend CMD ["node", "dist/server.js"]