# Production Dockerfile for API Server FROM node:18-alpine AS builder # Set working directory WORKDIR /app # Copy package files COPY package*.json ./ COPY apps/api/package*.json ./apps/api/ COPY packages/database/package*.json ./packages/database/ COPY packages/shared/package*.json ./packages/shared/ # Install dependencies RUN npm ci --only=production # Copy source code COPY apps/api/ ./apps/api/ COPY packages/database/ ./packages/database/ COPY packages/shared/ ./packages/shared/ COPY turbo.json ./ # Build the application RUN npm run build # Production stage FROM node:18-alpine # Install dumb-init for proper signal handling RUN apk add --no-cache dumb-init # Create app user RUN addgroup -g 1001 -S nodejs RUN adduser -S nextjs -u 1001 # Set working directory WORKDIR /app # Copy package files and install production dependencies only COPY --from=builder /app/package*.json ./ COPY --from=builder /app/apps/api/package*.json ./apps/api/ COPY --from=builder /app/packages/database/package*.json ./packages/database/ COPY --from=builder /app/packages/shared/package*.json ./packages/shared/ # Install production dependencies RUN npm ci --only=production && npm cache clean --force # Copy built application COPY --from=builder --chown=nextjs:nodejs /app/apps/api/dist ./apps/api/dist COPY --from=builder --chown=nextjs:nodejs /app/packages/database/dist ./packages/database/dist COPY --from=builder --chown=nextjs:nodejs /app/packages/shared/dist ./packages/shared/dist COPY --from=builder --chown=nextjs:nodejs /app/packages/database/prisma ./packages/database/prisma # Create uploads directory RUN mkdir -p /app/uploads && chown nextjs:nodejs /app/uploads # Switch to non-root user USER nextjs # Expose port EXPOSE 3333 # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3333/health || exit 1 # Set environment ENV NODE_ENV=production # Start the application with dumb-init ENTRYPOINT ["dumb-init", "--"] CMD ["node", "apps/api/dist/index.js"]