# --- frontend build --- FROM node:22-slim AS frontend WORKDIR /build COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build # --- backend runtime (also serves the built frontend) --- FROM python:3.14-slim COPY --from=ghcr.io/astral-sh/uv:0.12 /uv /usr/local/bin/uv WORKDIR /app ENV UV_PYTHON_DOWNLOADS=never UV_COMPILE_BYTECODE=1 COPY backend/pyproject.toml backend/uv.lock ./ RUN uv sync --frozen --no-dev COPY backend/app ./app COPY --from=frontend /build/dist ./static ENV FRAY_STATIC_DIR=/app/static EXPOSE 8080 CMD ["/app/.venv/bin/uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]