# ---- Build Stage ---- FROM node:22-slim AS builder RUN corepack enable && corepack prepare pnpm@9 --activate WORKDIR /app # Copy workspace config and lockfile COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY .pnpm-approve-builds ./ # Copy package.json files for all packages COPY packages/shared/package.json packages/shared/ COPY packages/web/package.json packages/web/ COPY packages/server/package.json packages/server/ # Install dependencies RUN pnpm install --frozen-lockfile # Copy source code COPY packages/shared/ packages/shared/ COPY packages/web/ packages/web/ COPY packages/server/ packages/server/ # Build shared package first, then web and server RUN pnpm --filter @icc/shared build 2>/dev/null || true RUN pnpm --filter @icc/web build RUN pnpm --filter @icc/server build # ---- Production Stage ---- FROM node:22-slim AS production RUN corepack enable && corepack prepare pnpm@9 --activate WORKDIR /app # Copy workspace config COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY .pnpm-approve-builds ./ COPY packages/shared/package.json packages/shared/ COPY packages/server/package.json packages/server/ # Web package.json needed for workspace resolution COPY packages/web/package.json packages/web/ # Install production dependencies only RUN pnpm install --frozen-lockfile --prod # Copy built artifacts COPY --from=builder /app/packages/shared/dist packages/shared/dist/ COPY --from=builder /app/packages/shared/package.json packages/shared/ COPY --from=builder /app/packages/server/dist packages/server/dist/ COPY --from=builder /app/packages/web/dist packages/web/dist/ # Create data directory for SQLite and screenshots RUN mkdir -p /app/packages/server/data/screenshots # Set working directory to server (sqlite.db relative path) WORKDIR /app/packages/server # Environment ENV NODE_ENV=production ENV PORT=7860 ENV TZ=America/Toronto ENV DATABASE_URL=sqlite.db ENV APP_URL=* ENV DISABLE_SCREENSHOTS=true # HuggingFace Spaces exposes port 7860 EXPOSE 7860 CMD ["node", "dist/index.js"]