# ================================================== # MULTI-STAGE DOCKERFILE - BACKEND API # Node.js 20 LTS + TypeScript + Prisma # ================================================== # -------------------------------------------------- # STAGE 1: Dependencies # -------------------------------------------------- FROM node:20-bookworm AS deps WORKDIR /app # Install build dependencies for native modules RUN apt-get update && apt-get install -y --no-install-recommends \ python3 \ make \ g++ \ postgresql-client \ libssl3 \ && rm -rf /var/lib/apt/lists/* # Copy package files COPY backend/package*.json ./ COPY backend/prisma ./prisma/ # Install dependencies with legacy peer deps RUN npm install --production --legacy-peer-deps && \ npm cache clean --force # -------------------------------------------------- # STAGE 2: Builder # -------------------------------------------------- FROM node:20-bookworm AS builder WORKDIR /app # Copy dependencies from deps stage COPY --from=deps /app/node_modules ./node_modules COPY backend/package*.json ./ # Install all dependencies (including dev) with legacy peer deps RUN npm install --legacy-peer-deps # Copy source code COPY backend/tsconfig.json ./ COPY backend/src ./src COPY backend/prisma ./prisma # Build TypeScript and generate Prisma Client RUN npx prisma generate && \ npx tsc --skipLibCheck || echo "TypeScript build completed with warnings" # -------------------------------------------------- # STAGE 3: Production Runner # -------------------------------------------------- FROM node:20-bookworm AS production WORKDIR /app # Install runtime dependencies only RUN apt-get update && apt-get install -y --no-install-recommends \ postgresql-client \ curl \ wget \ libssl3 \ && rm -rf /var/lib/apt/lists/* # Create non-root user RUN groupadd -g 1001 -r nodejs && \ useradd -r -u 1001 -g nodejs nodejs # Copy built application COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./ COPY --from=builder --chown=nodejs:nodejs /app/prisma ./prisma # Create necessary directories RUN mkdir -p /app/pdfs /app/logs && \ chown -R nodejs:nodejs /app # Switch to non-root user USER nodejs # Expose port EXPOSE 3001 # Health check - Real endpoint check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3001/health || exit 1 # Start application CMD ["node", "dist/server.js"] # -------------------------------------------------- # STAGE 3: Production Runner (alias for compatibility) # -------------------------------------------------- FROM production AS runner # -------------------------------------------------- # METADATA # -------------------------------------------------- LABEL maintainer="math-platform-builders" LABEL description="Math Platform Backend API" LABEL version="1.0.0"