# Build context is the repository root: one image serves API + built SPA. FROM node:20-slim AS frontend WORKDIR /build COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim AS live WORKDIR /srv/backend COPY backend/pyproject.toml backend/uv.lock ./ RUN uv sync --frozen --no-dev --no-install-project COPY backend/app ./app COPY eval/scenarios.yaml ../eval/scenarios.yaml COPY --from=frontend /build/dist ./app/static EXPOSE 8000 CMD ["uv", "run", "--no-sync", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] FROM live AS demo COPY eval/fixtures ../eval/fixtures