# syntax=docker/dockerfile:1.7 # Authoritative Bun WebSocket server for @paratype/chess. # Build context: monorepo root (so workspace deps resolve). FROM oven/bun:1.3 AS deps WORKDIR /app # Manifests first for cacheable installs. COPY package.json bun.lock ./ COPY tsconfig.base.json tsconfig.json ./ COPY packages/rete/package.json packages/rete/ COPY packages/chess/package.json packages/chess/ COPY packages/server/package.json packages/server/ RUN bun install --frozen-lockfile # ---- builder: compile @paratype/rete (server resolves its "import" # field to dist/index.js, so we MUST build it before runtime). FROM deps AS builder COPY packages/rete packages/rete RUN bun run --filter @paratype/rete build # Bring in remaining sources needed at runtime. COPY packages/chess/src packages/chess/src COPY packages/chess/package.json packages/chess/ COPY packages/server packages/server # ---- runtime FROM oven/bun:1.3-slim AS runtime WORKDIR /app ENV NODE_ENV=production \ PORT=7357 \ LOG_LEVEL=info COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json # rete: built dist + its symlinked node_modules COPY --from=builder /app/packages/rete/dist packages/rete/dist COPY --from=builder /app/packages/rete/package.json packages/rete/package.json COPY --from=builder /app/packages/rete/node_modules packages/rete/node_modules # chess: source consumed by server.ts via "default" export, plus its # per-package node_modules so symlinked deps (zod, etc.) resolve. COPY --from=builder /app/packages/chess/src packages/chess/src COPY --from=builder /app/packages/chess/package.json packages/chess/package.json COPY --from=builder /app/packages/chess/node_modules packages/chess/node_modules # server: full copy already includes its node_modules. COPY --from=builder /app/packages/server packages/server EXPOSE 7357 USER bun CMD ["bun", "run", "packages/server/src/index.ts"]