重置项目

This commit is contained in:
2026-07-04 15:59:20 +08:00
parent 374e587f2d
commit 648a8b7f1c
224 changed files with 19700 additions and 9547 deletions
+25 -25
View File
@@ -1,15 +1,14 @@
# 两阶段构建:前端 dist 拷进后端镜像,单容器运行
# 可选:构建网络无法直连官方源时:
# 1. 传入 --build-arg USE_CN_MIRROR=1 启用国内 npm/pypi 镜像
# 2. 传入 --build-arg PYTHON_IMAGE/NODE_IMAGE 使用 Docker Hub 国内镜像站
# 可选:构建网络无法直连官方源时,传入 --build-arg USE_CN_MIRROR=1 启用国内镜像
ARG USE_CN_MIRROR=1
ARG NPM_REGISTRY=https://registry.npmmirror.com
ARG PYPI_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
ARG PYTHON_IMAGE=python:3.11-slim
ARG NODE_IMAGE=node:20-alpine
# 备用 PyPI 源:主源同步延迟/故障时自动兜底(阿里云与清华互为补充)
ARG PYPI_FALLBACK=https://mirrors.aliyun.com/pypi/simple
ARG BACKEND_EXTRAS=
# === Stage 1: 前端构建 ===
FROM ${NODE_IMAGE} AS frontend-builder
FROM node:20-alpine AS frontend-builder
ARG USE_CN_MIRROR=1
ARG NPM_REGISTRY=https://registry.npmmirror.com
WORKDIR /build
@@ -26,14 +25,21 @@ COPY frontend/ ./
RUN pnpm build
# === Stage 2: Python 运行时 ===
FROM ${PYTHON_IMAGE} AS runtime
FROM python:3.11-slim AS runtime
ARG USE_CN_MIRROR=1
ARG PYPI_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
ARG PYPI_FALLBACK=https://mirrors.aliyun.com/pypi/simple
ARG BACKEND_EXTRAS=
WORKDIR /app
# 安装 uv(快)
# 安装 uv(快) —— 国内镜像下三重兜底:主源 → 备用源 → 官方源,
# 任一成功即可,避免单一镜像同步延迟/故障导致构建失败。
# uv 发版极频繁,国内镜像同步存在时间窗口,不锁版本且无 fallback 时
# 容易遇到 "from versions: none"(索引解析不到最新版)。
RUN if [ "$USE_CN_MIRROR" = "1" ]; then \
pip install --no-cache-dir uv -i "$PYPI_INDEX"; \
pip install --no-cache-dir uv -i "$PYPI_INDEX" || \
pip install --no-cache-dir uv -i "$PYPI_FALLBACK" || \
pip install --no-cache-dir uv; \
else \
pip install --no-cache-dir uv; \
fi
@@ -41,8 +47,16 @@ RUN if [ "$USE_CN_MIRROR" = "1" ]; then \
# Backend deps
COPY README.md /README.md
COPY backend/pyproject.toml backend/uv.lock* ./
RUN if [ "$USE_CN_MIRROR" = "1" ]; then export UV_DEFAULT_INDEX="$PYPI_INDEX"; fi; \
uv sync --frozen --no-dev || uv sync --no-dev
# uv 原生支持同时挂多个 index(主源 + 备用源),会自动在两源中查找,
# 比逐个重试更稳健 —— 任一源缺包时另一源补位。
RUN if [ "$USE_CN_MIRROR" = "1" ]; then \
export UV_DEFAULT_INDEX="$PYPI_INDEX" UV_EXTRA_INDEX_URL="$PYPI_FALLBACK"; \
fi; \
set -- --no-dev; \
for extra in $BACKEND_EXTRAS; do \
set -- "$@" --extra "$extra"; \
done; \
uv sync --frozen "$@" || uv sync "$@"
# Backend code
# 注意:Docker 里 WORKDIR=/app, 而 config.py 的 _PROJECT_ROOT 是按开发布局
@@ -60,17 +74,3 @@ COPY --from=frontend-builder /build/dist ./static
ENV PYTHONPATH=/app
EXPOSE 3018
CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "3018"]
# === Stage 3: 测试镜像 ===
# 基于 runtime 追加 dev + backtest 依赖,用于运行 pytest。
# 生产镜像保持 --no-dev,此 stage 仅用于 CI/本地测试。
FROM runtime AS test
ARG USE_CN_MIRROR=1
ARG PYPI_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
RUN if [ "$USE_CN_MIRROR" = "1" ]; then export UV_DEFAULT_INDEX="$PYPI_INDEX"; fi; \
uv sync --frozen --extra backtest --extra dev || uv sync --extra backtest --extra dev
COPY backend/tests ./tests
CMD ["uv", "run", "pytest", "tests"]