# ---- Stage 1: Build native deps + TypeScript ---- FROM node:22-slim AS builder WORKDIR /app RUN corepack enable # Build tools + Rust for native compilation RUN apt-get update -qq && apt-get install -y -qq --no-install-recommends \ python3 make g++ curl ca-certificates \ && rm -rf /var/lib/apt/lists/* \ && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable ENV PATH="/root/.cargo/bin:${PATH}" # Dependency manifests COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ COPY patches ./patches COPY packages/shared/package.json ./packages/shared/package.json COPY services/discord-gateway/package.json ./services/discord-gateway/package.json # Install ALL deps (including devDeps needed for build) RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile # Source code COPY packages/shared ./packages/shared COPY services/discord-gateway ./services/discord-gateway COPY services/discord-gateway/drizzle ./drizzle # Build RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ pnpm --filter './packages/shared' run build RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ pnpm --filter './services/discord-gateway' run build # Create production-only deployment (no devDeps) RUN pnpm deploy --legacy --filter '@bete/discord-gateway' /tmp/deploy \ && rm -rf /tmp/deploy/node_modules/.pnpm/@biomejs+biome@* \ /tmp/deploy/node_modules/.pnpm/@biomejs+cli-linux-x64@* \ /tmp/deploy/node_modules/.pnpm/typescript@* \ /tmp/deploy/node_modules/.pnpm/drizzle-kit@* \ /tmp/deploy/node_modules/.pnpm/vitest@* \ /tmp/deploy/node_modules/.pnpm/esbuild@* \ /tmp/deploy/node_modules/.pnpm/tsx@* \ /tmp/deploy/node_modules/.pnpm/@types* \ /tmp/deploy/node_modules/.pnpm/@rolldown* \ /tmp/deploy/node_modules/.pnpm/@vitest* # ---- Stage 2: Runtime (minimal) ---- FROM node:22-slim WORKDIR /app # Runtime system deps only RUN apt-get update -qq && apt-get install -y -qq --no-install-recommends \ ffmpeg ca-certificates \ && rm -rf /var/lib/apt/lists/* # Copy production-only artifacts from deploy COPY --from=builder /tmp/deploy/node_modules ./node_modules COPY --from=builder /tmp/deploy/package.json ./package.json COPY --from=builder /app/packages/shared/dist ./packages/shared/dist COPY --from=builder /app/services/discord-gateway/dist ./services/discord-gateway/dist COPY --from=builder /app/drizzle ./drizzle # Create recordings dir and set ownership RUN mkdir -p /app/recordings && chown -R node:node /app USER node HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \ CMD sh -c "kill -0 1" CMD ["node", "services/discord-gateway/dist/index.js"]