# =========================================== # Stage 1: Build Frontend # =========================================== FROM node:20-alpine AS frontend-builder WORKDIR /app # Copy workspace configuration files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY packages/frontend/package.json ./packages/frontend/ # Install pnpm and dependencies RUN npm install -g pnpm && \ pnpm install --frozen-lockfile # Copy frontend source code COPY packages/frontend ./packages/frontend # Build frontend RUN cd packages/frontend && pnpm build # =========================================== # Stage 2: Build Backend # =========================================== FROM node:20-alpine AS backend-builder WORKDIR /app # Copy workspace configuration files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY packages/backend/package.json ./packages/backend/ # Install pnpm and dependencies RUN npm install -g pnpm && \ pnpm install --frozen-lockfile # Copy backend source code COPY packages/backend ./packages/backend # Generate Prisma client and build backend RUN cd packages/backend && \ npx prisma generate && \ pnpm build # =========================================== # Stage 3: Production Runtime # =========================================== FROM node:20-alpine AS production WORKDIR /app # Install OpenSSL for Prisma compatibility, nginx for reverse proxy, and ffmpeg for video processing RUN apk add --no-cache openssl nginx ffmpeg # Install pnpm globally RUN npm install -g pnpm # Copy workspace configuration files COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./ COPY packages/backend/package.json ./packages/backend/ COPY packages/frontend/package.json ./packages/frontend/ # Install ALL dependencies (including Prisma CLI needed for migrations) RUN pnpm install --frozen-lockfile # Copy backend build artifacts COPY --from=backend-builder /app/packages/backend/dist ./packages/backend/dist COPY --from=backend-builder /app/packages/backend/prisma ./packages/backend/prisma COPY --from=backend-builder /app/packages/backend/scripts ./packages/backend/scripts # Copy Prisma generated client (in pnpm workspace structure) # We need to copy the entire .pnpm directory to preserve the Prisma client COPY --from=backend-builder /app/node_modules/.pnpm ./node_modules/.pnpm # Copy frontend build artifacts COPY --from=frontend-builder /app/packages/frontend/dist ./packages/frontend/dist # Create uploads directory RUN mkdir -p /app/packages/backend/uploads # Copy nginx configuration COPY nginx.conf /etc/nginx/nginx.conf # Copy startup script COPY docker-entrypoint.sh /app/docker-entrypoint.sh RUN chmod +x /app/docker-entrypoint.sh # Expose frontend port EXPOSE 5173 # Set entrypoint CMD ["/app/docker-entrypoint.sh"]