# Dockerfile FROM node:22-alpine AS builder WORKDIR /app # Copy package files COPY package*.json ./ COPY tsconfig.json ./ # Install all dependencies (including devDependencies for build) RUN npm ci # Copy source code COPY src ./src # Build TypeScript to JavaScript RUN npm run build # ===================================== # Production Image # ===================================== FROM node:22-alpine WORKDIR /app # Install PM2 globally RUN npm install -g pm2 # Copy package files COPY package*.json ./ # Install only production dependencies RUN npm ci --only=production # Copy compiled JavaScript from builder COPY --from=builder /app/dist ./dist # Create logs and uploads directories RUN mkdir -p logs uploads # Create non-root user RUN addgroup -g 1001 -S nodejs RUN adduser -S nodejs -u 1001 # Change ownership of the app directory RUN chown -R nodejs:nodejs /app USER nodejs # Expose port EXPOSE 5000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD node -e "require('http').get('http://localhost:5000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" # Start with PM2 CMD ["pm2-runtime", "start", "dist/server.js", "--name", "re-workflow-api"]