# Symphony 容器镜像（多阶段：uv 安装 -> 精简运行时）
# 用法：docker build -t symphony . && docker run -p 8000:8000 --env-file .env symphony

FROM python:3.12-slim AS builder

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PIP_NO_CACHE_DIR=1

RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# 安装 uv（快速依赖解析与安装）；固定版本保证构建可复现
COPY --from=ghcr.io/astral-sh/uv:0.9.26 /uv /usr/local/bin/uv

WORKDIR /app
COPY pyproject.toml uv.lock ./
# 同步生产依赖到虚拟环境（--frozen 锁定，--no-dev 排除开发依赖）
RUN uv sync --frozen --no-dev

FROM python:3.12-slim AS runtime

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PATH="/app/.venv/bin:$PATH"

WORKDIR /app
# 拷贝虚拟环境与源码
COPY --from=builder /app/.venv /app/.venv
COPY src/ /app/src/
COPY static/ /app/static/

# 非 root 运行（最小权限，缩小潜在 RCE 爆炸半径）
RUN addgroup --system app && adduser --system --ingroup app app \
    && mkdir -p /data && chown -R app:app /app /data
USER app

# 数据卷：SQLite 文件持久化（若用 postgres 则无需）
VOLUME ["/data"]
ENV SQLITE_PATH=/data/symphony.db \
    STORAGE_BACKEND=sqlite

EXPOSE 8000

# 生产默认：关闭 demo 播种与文档暴露，由部署者按需开启
ENV SEED_DEMO_DATA=false \
    EXPOSE_DOCS=false

CMD ["uvicorn", "symphony.main:app", "--host", "0.0.0.0", "--port", "8000"]
