# ─── Build stage ─────────────────────────────────────────────── FROM node:22-alpine AS builder WORKDIR /app RUN npm install -g pnpm@9 COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./ COPY web/package.json ./web/package.json RUN pnpm install --frozen-lockfile COPY web/ ./web/ WORKDIR /app/web RUN pnpm build # ─── Runtime stage ──────────────────────────────────────────── FROM node:22-alpine WORKDIR /app RUN npm install -g pnpm@9 tsx COPY --from=builder /app/pnpm-workspace.yaml /app/package.json /app/pnpm-lock.yaml ./ COPY --from=builder /app/web/package.json ./web/package.json RUN pnpm install --frozen-lockfile --prod COPY --from=builder /app/web/.output ./.output COPY --from=builder /app/web/src/server/db ./src/server/db COPY --from=builder /app/web/src/server/jobs ./src/server/jobs COPY --from=builder /app/web/src/server/services ./src/server/services COPY --from=builder /app/web/src/server/lib ./src/server/lib COPY --from=builder /app/web/tsconfig.json ./web/tsconfig.json ENV NODE_ENV=production # Default: run scheduler (override CMD for other use cases) CMD ["tsx", "src/server/jobs/start.ts"]