# ───────────────────────────────────────────────────────────── # Backend Server Dockerfile # Multi-stage build for minimal production image # ───────────────────────────────────────────────────────────── # Stage 1: Build FROM node:20-alpine AS builder WORKDIR /app # Install dependencies COPY package.json package-lock.json* pnpm-lock.yaml* ./ COPY prisma ./prisma/ RUN corepack enable pnpm && pnpm install --frozen-lockfile # Generate Prisma client RUN npx prisma generate # Copy source and build COPY tsconfig.json ./ COPY src ./src/ RUN pnpm build # Stage 2: Production FROM node:20-alpine AS runner WORKDIR /app # Install Docker CLI (for Docker-in-Docker execution) RUN apk add --no-cache docker-cli # Create non-root user RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 codesync # Copy built output and dependencies COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/package.json ./ # Create logs directory RUN mkdir -p /app/logs && chown codesync:nodejs /app/logs USER codesync EXPOSE 4000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:4000/api/health || exit 1 CMD ["node", "dist/index.js"]