FROM node:20-alpine AS base RUN apk add --no-cache openssl openssl-dev && \ corepack enable && corepack prepare pnpm@9.15.4 --activate ENV PRISMA_QUERY_ENGINE_BINARY_TARGETS="linux-musl-arm64-openssl-3.0.x,linux-musl-openssl-3.0.x" WORKDIR /app # --- Install dependencies --- FROM base AS deps COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ COPY packages/core/package.json packages/core/ COPY packages/weather-engine/package.json packages/weather-engine/ COPY packages/market-engine/package.json packages/market-engine/ COPY packages/strategy/package.json packages/strategy/ COPY packages/trading-engine/package.json packages/trading-engine/ COPY packages/dashboard/package.json packages/dashboard/ RUN pnpm install --frozen-lockfile # --- Copy source and generate Prisma client --- FROM deps AS source COPY . . RUN pnpm db:generate # --- Bot: build TS packages (no DB needed) --- FROM source AS bot-build RUN pnpm --filter @poly-weather/core build && \ pnpm --filter @poly-weather/weather-engine build && \ pnpm --filter @poly-weather/market-engine build && \ pnpm --filter @poly-weather/strategy build && \ pnpm --filter @poly-weather/trading-engine build # --- Bot runtime --- FROM bot-build AS bot ENV NODE_ENV=production EXPOSE 3001 CMD ["sh", "-c", "pnpm --filter @poly-weather/core exec prisma db push --schema=prisma/schema.prisma --accept-data-loss && node packages/trading-engine/dist/main.js"] # --- Dashboard: build Next.js (all pages are force-dynamic, no DB needed at build) --- FROM source AS dashboard-build RUN pnpm --filter @poly-weather/core build && \ pnpm --filter @poly-weather/dashboard build # --- Dashboard runtime --- FROM dashboard-build AS dashboard ENV NODE_ENV=production EXPOSE 3000 CMD ["pnpm", "--filter", "@poly-weather/dashboard", "start"]