# ---- Builder stage ---- FROM node:22-slim AS builder WORKDIR /build RUN npm install -g pnpm@10 # Build tools for native addons (discordjs/voice may need node-gyp) RUN apt-get update -qq && apt-get install -y -qq --no-install-recommends \ python3 make g++ \ && rm -rf /var/lib/apt/lists/* # Copy source + manifests COPY services/backend/ ./ # Install ALL deps (devDeps needed for TypeScript build) RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ pnpm install --no-frozen-lockfile # Build TypeScript RUN ./node_modules/.bin/tsc # Switch to production-only deps (strips devDeps + cleans .pnpm store) RUN rm -rf node_modules && pnpm install --prod --no-frozen-lockfile # ---- Runtime stage ---- FROM node:22-alpine WORKDIR /app COPY --from=builder --chown=node:node /build/dist ./dist COPY --from=builder --chown=node:node /build/node_modules ./node_modules COPY --from=builder --chown=node:node /build/package.json ./ USER node EXPOSE 4001 HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \ CMD node -e "require('http').get('http://localhost:4001/api/health',r=>process.exit(r.statusCode===200?0:1))" CMD ["node", "dist/index.js"]