# Stage 1: install dependencies (cached layer) FROM node:22-alpine AS deps RUN corepack enable && corepack prepare pnpm@10.28.2 --activate WORKDIR /app # Copy all workspace package.json files (pnpm --frozen-lockfile needs the full workspace structure) COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY apps/cli/package.json ./apps/cli/ COPY apps/desktop/package.json ./apps/desktop/ COPY apps/gateway/package.json ./apps/gateway/ COPY apps/mobile/package.json ./apps/mobile/ COPY apps/server/package.json ./apps/server/ COPY apps/web/package.json ./apps/web/ COPY packages/core/package.json ./packages/core/ COPY packages/hooks/package.json ./packages/hooks/ COPY packages/sdk/package.json ./packages/sdk/ COPY packages/store/package.json ./packages/store/ COPY packages/types/package.json ./packages/types/ COPY packages/ui/package.json ./packages/ui/ COPY packages/utils/package.json ./packages/utils/ RUN pnpm install --frozen-lockfile --filter @multica/gateway... # Stage 2: build workspace packages that export from dist/ FROM deps AS build COPY packages/types/ ./packages/types/ COPY packages/utils/ ./packages/utils/ COPY packages/core/ ./packages/core/ RUN pnpm --filter @multica/types build && \ pnpm --filter @multica/utils build && \ pnpm --filter @multica/core build # Stage 3: runtime FROM node:22-alpine RUN corepack enable && corepack prepare pnpm@10.28.2 --activate WORKDIR /app # Copy pnpm structure + node_modules + built dist/ artifacts COPY --from=build /app ./ # Copy workspace packages needed at runtime (raw .ts source, resolved by tsx) COPY packages/sdk/ ./packages/sdk/ COPY packages/store/ ./packages/store/ # Copy gateway source + static assets COPY apps/gateway/ ./apps/gateway/ ENV NODE_ENV=production ENV PORT=3000 EXPOSE 3000 WORKDIR /app/apps/gateway CMD ["node", "--import", "tsx", "main.ts"]