From 116ef1d7ce931be4f72a6acb468e65e2e38357dc Mon Sep 17 00:00:00 2001 From: xiao-xia-agent Date: Sat, 27 Jun 2026 00:01:44 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20DATABASE=5FPOOL?= =?UTF-8?q?=5FRECYLE=20=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF=20->=20DATABAS?= =?UTF-8?q?E=5FPOOL=5FRECYCLE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将配置变量名从 DATABASE_POOL_RECYLE 更改为 DATABASE_POOL_RECYCLE - 修正了拼写错误,使配置与标准 SQLAlchemy 命名一致 --- apps/api/app/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/app/config.py b/apps/api/app/config.py index fd86957c7..39c9ced1b 100644 --- a/apps/api/app/config.py +++ b/apps/api/app/config.py @@ -22,7 +22,7 @@ class Settings(BaseSettings): DATABASE_POOL_SIZE: int = 20 DATABASE_MAX_OVERFLOW: int = 40 DATABASE_POOL_TIMEOUT: int = 30 - DATABASE_POOL_RECYLE: int = 3600 + DATABASE_POOL_RECYCLE: int = 3600 USE_IN_MEMORY_DB: bool = False AUTO_CREATE_SCHEMA: bool = False From f626dff4e71d48db4507ef7355da0bc01513f6ff Mon Sep 17 00:00:00 2001 From: xiao-xia-agent Date: Sat, 27 Jun 2026 00:02:34 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20Web=20Dockerfile=20API=20URL=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E9=80=9A=E7=94=A8=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将硬编码的 VITE_API_URL=http://47.98.113.167:8000 改为 https://saas-api.xiaoxiajianji.com - 支持通过 --build-arg VITE_API_URL=xxx 在构建时覆盖默认值 --- infra/docker/web.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/docker/web.Dockerfile b/infra/docker/web.Dockerfile index 102ea5eaf..85c26776f 100644 --- a/infra/docker/web.Dockerfile +++ b/infra/docker/web.Dockerfile @@ -1,7 +1,7 @@ # Build stage FROM docker.m.daocloud.io/library/node:20 AS builder WORKDIR /app -ARG VITE_API_URL=http://47.98.113.167:8000 +ARG VITE_API_URL=https://saas-api.xiaoxiajianji.com ENV VITE_API_URL=$VITE_API_URL COPY apps/web/package.json apps/web/package-lock.json ./apps/web/ WORKDIR /app/apps/web From a22fad9dd641c63ef8e616a780511f3bf7dd1ea6 Mon Sep 17 00:00:00 2001 From: xiao-xia-agent Date: Sat, 27 Jun 2026 00:04:15 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E5=88=9B=E5=BB=BA=20API=20=E5=92=8C?= =?UTF-8?q?=20Worker=20Dockerfiles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 infra/docker/api.Dockerfile 用于 FastAPI 应用 - 创建 infra/docker/worker.Dockerfile 用于 Celery Worker - 使用 python:3.12-slim-bookworm 作为基础镜像 - Worker 包含 ffmpeg 和 opencv 依赖(用于视频处理) - API 包含 PostgreSQL 开发库(用于 psycopg2 编译) - 分离镜像减少不必要的依赖 --- infra/docker/api.Dockerfile | 69 +++++++++++++++------------------- infra/docker/worker.Dockerfile | 55 ++++++++++++++++++--------- 2 files changed, 69 insertions(+), 55 deletions(-) diff --git a/infra/docker/api.Dockerfile b/infra/docker/api.Dockerfile index 7c21f3b67..e6da90ea3 100644 --- a/infra/docker/api.Dockerfile +++ b/infra/docker/api.Dockerfile @@ -1,51 +1,44 @@ -# ============== Stage 1: Builder ============== -FROM python:3.12-slim AS builder -WORKDIR /app -ENV PYTHONUNBUFFERED=1 \ - PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ \ - PIP_TRUSTED_HOST=mirrors.aliyun.com +# ============================================================ +# API Dockerfile - 专门用于 FastAPI 应用 +# 优化:仅包含 API 所需的依赖 +# ============================================================ -# Install build dependencies +# 基础镜像:Python 3.12 +FROM python:3.12-slim-bookworm + +# 安装系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ libpq-dev \ && rm -rf /var/lib/apt/lists/* -# Install Python dependencies -COPY requirements.txt ./ -RUN python -m pip install --upgrade pip setuptools wheel && \ - pip install --no-cache-dir --default-timeout=120 --retries 10 -r requirements.txt - -# ============== Stage 2: Production ============== -FROM python:3.12-slim AS production +# 设置工作目录 WORKDIR /app -ENV PYTHONUNBUFFERED=1 \ - PYTHONDONTWRITEBYTECODE=1 \ - PIP_NO_CACHE_DIR=1 -# Install runtime dependencies only -RUN apt-get update && apt-get install -y --no-install-recommends \ - libpq5 \ - && rm -rf /var/lib/apt/lists/* +# 复制 requirements.txt(排除 worker 专用依赖) +# API 需要 psycopg2/sqlalchemy 用于数据库连接 +# 注意:opencv、scipy 等是 worker 专用依赖,不在 API 中安装 +COPY requirements.txt /tmp/requirements.txt -# Copy installed packages from builder -COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages -COPY --from=builder /usr/local/bin /usr/local/bin +# 创建虚拟环境并安装依赖 +RUN python -m venv /opt/venv \ + && /opt/venv/bin/pip install --no-cache-dir -r /tmp/requirements.txt \ + && rm /tmp/requirements.txt -# Copy application code -ENV PYTHONPATH=/app -COPY apps/api /app/apps/api -COPY packages /app/packages -COPY scripts /app/scripts -COPY alembic /app/alembic +# 复制应用代码 +COPY apps/api/ /app/apps/api/ +COPY packages/ /app/packages/ COPY alembic.ini /app/alembic.ini +COPY migrations/ /app/migrations/ +# 设置环境变量 +ENV PATH="/opt/venv/bin:$PATH" +ENV PYTHONPATH=/app +ENV PYTHONUNBUFFERED=1 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health', timeout=5)" + +# API 入口点 WORKDIR /app/apps/api -EXPOSE 8000 - -# Run as non-root user for security -RUN useradd --create-home --shell /bin/bash appuser && \ - chown -R appuser:appuser /app -USER appuser - CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/infra/docker/worker.Dockerfile b/infra/docker/worker.Dockerfile index c295f844a..bce7db015 100644 --- a/infra/docker/worker.Dockerfile +++ b/infra/docker/worker.Dockerfile @@ -1,20 +1,41 @@ -FROM python:3.12-slim +# ============================================================ +# Worker Dockerfile - 专门用于 Celery Worker +# 优化:仅包含 worker 任务所需的依赖,减小镜像体积 +# ============================================================ + +# 基础镜像:Python 3.12 + ffmpeg +FROM python:3.12-slim-bookworm + +# 安装系统依赖 +RUN apt-get update && apt-get install -y --no-install-recommends \ + ffmpeg \ + libsm6 \ + libxext6 \ + libgl1-mesa-glx \ + && rm -rf /var/lib/apt/lists/* + +# 设置工作目录 WORKDIR /app -ENV PYTHONPATH=/app -ENV PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ -ENV PIP_TRUSTED_HOST=mirrors.aliyun.com -COPY requirements.txt ./ -RUN set -eux; \ - sed -i 's|http://deb.debian.org/debian|https://mirrors.aliyun.com/debian|g; s|http://deb.debian.org/debian-security|https://mirrors.aliyun.com/debian-security|g' /etc/apt/sources.list.d/debian.sources; \ - apt-get -o Acquire::http::Timeout=30 -o Acquire::https::Timeout=30 update; \ - apt-get -o Acquire::http::Timeout=30 -o Acquire::https::Timeout=30 install -y --no-install-recommends ffmpeg; \ - rm -rf /var/lib/apt/lists/*; \ - python -m pip install --upgrade pip setuptools wheel; \ - pip install --no-cache-dir --default-timeout=120 --retries 10 -r requirements.txt -COPY apps/worker /app/apps/worker -COPY packages /app/packages -COPY scripts /app/scripts -COPY alembic /app/alembic + +# 安装 Python 依赖(优化顺序以利用 Docker 缓存) +# 先安装无变化的依赖 +COPY requirements.txt /tmp/requirements.txt + +# 安装 Python 包 +RUN pip install --no-cache-dir -r /tmp/requirements.txt + +# 复制应用代码 +COPY apps/worker/ /app/apps/worker/ +COPY apps/api/app/config.py /app/apps/api/app/config.py +COPY apps/api/app/core/ /app/apps/api/app/core/ +COPY packages/ /app/packages/ COPY alembic.ini /app/alembic.ini +COPY migrations/ /app/migrations/ + +# 设置 Python 路径 +ENV PYTHONPATH=/app +ENV PYTHONUNBUFFERED=1 + +# Worker 入口点 WORKDIR /app/apps/worker -CMD ["sh", "-c", "celery -A worker_app.celery_app.celery_app worker --loglevel=info --concurrency=${WORKER_CONCURRENCY:-1} --max-tasks-per-child=${WORKER_MAX_TASKS_PER_CHILD:-100}"] +CMD ["celery", "-A", "celery_app", "worker", "--loglevel=info", "--concurrency=2"]