# Stage 1: Build web FROM node:20-alpine AS web-builder WORKDIR /app COPY package*.json ./ COPY apps/web/package*.json ./apps/web/ COPY apps/server/package*.json ./apps/server/ RUN npm ci COPY . . RUN npm run build -w apps/web # Stage 2: Build server FROM node:20-alpine AS server-builder WORKDIR /app COPY --from=web-builder /app/node_modules ./node_modules COPY --from=web-builder /app/package*.json ./ COPY --from=web-builder /app/apps/web ./apps/web COPY --from=web-builder /app/apps/server ./apps/server RUN npm run build -w apps/server # Stage 3: Production FROM node:20-alpine WORKDIR /app ENV NODE_ENV=production COPY --from=server-builder /app/node_modules ./node_modules COPY --from=server-builder /app/package*.json ./ COPY --from=server-builder /app/apps/server/package*.json ./apps/server/ COPY --from=server-builder /app/apps/server/dist ./apps/server/dist COPY --from=server-builder /app/apps/web/dist ./apps/web/dist EXPOSE 3001 VOLUME ["/app/apps/server/data"] CMD ["node", "apps/server/dist/index.js"]