From 5f3d414a48c5eea5bce00f34ee1729c03fa94b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=B1=BC=E5=BC=80=E5=8F=91?= Date: Mon, 27 Apr 2026 12:33:06 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=AF=B9=E9=BD=90=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=B8=8E=E7=94=9F=E4=BA=A7=20Docker=20=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 .dockerignore,减少构建上下文体积 - 修复 Dockerfile 缺失 config/ 目录复制 - docker-compose.test.yml: DEBUG=false, ENV=production, SECRET_KEY 强制传入 - 新增 docker-compose.dev.yml(开发专用)和 docker-compose.prod.yml(生产专用) - deploy-test.sh: 加入 SECRET_KEY 强制检查,统一步骤编号 --- python-api/.dockerignore | 99 ++++++++++++++++++++++++++++++ python-api/.gitignore | 2 +- python-api/Dockerfile | 3 +- python-api/deploy-test.sh | 8 +-- python-api/docker-compose.dev.yml | 63 +++++++++++++++++++ python-api/docker-compose.prod.yml | 77 +++++++++++++++++++++++ python-api/docker-compose.test.yml | 12 ++-- 7 files changed, 252 insertions(+), 12 deletions(-) create mode 100644 python-api/.dockerignore create mode 100644 python-api/docker-compose.dev.yml create mode 100644 python-api/docker-compose.prod.yml diff --git a/python-api/.dockerignore b/python-api/.dockerignore new file mode 100644 index 0000000..c36064d --- /dev/null +++ b/python-api/.dockerignore @@ -0,0 +1,99 @@ +# ============================================================================= +# 美家卡智影 API - Docker 构建上下文排除列表 +# ============================================================================= + +# --- Git --- +.git/ +.gitignore +.gitattributes + +# --- 环境变量(安全)--- +.env +.env.* +.env.local +.env.example + +# --- Python 虚拟环境 --- +venv/ +env/ +ENV/ +.venv/ + +# --- Python 缓存 --- +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ + +# --- 测试与覆盖率 --- +tests/ +.coverage +htmlcov/ +.tox/ + +# --- IDE / 编辑器 --- +.idea/ +.vscode/ +*.swp +*.swo +*~ +.DS_Store + +# --- 本地数据库与缓存 --- +*.db +*.sqlite3 +meijiaka.db +dump.rdb +celerybeat-schedule +.qiniu_pythonsdk_hostscache.json + +# --- 日志 --- +*.log +logs/ + +# --- Docker 自身 --- +Dockerfile +docker-compose.yml +docker-compose.*.yml +.dockerignore + +# --- 部署脚本(仅本地使用)--- +deploy-test.sh +scripts/upload_release.py + +# --- 文档 --- +README.md + +# --- 临时/数据目录 --- +data/ +local/ +temp/ +tmp/ + +# --- 开发配置 --- +.pre-commit-config.yaml +.python-version +uv.lock + +# --- Alembic 迁移版本(如不需要在容器内执行迁移可忽略)--- +# 注:若需在容器内运行 alembic upgrade,请注释掉下面这行 +# alembic/versions/ diff --git a/python-api/.gitignore b/python-api/.gitignore index 578177f..12f3ff0 100644 --- a/python-api/.gitignore +++ b/python-api/.gitignore @@ -63,7 +63,7 @@ celerybeat-schedule dump.rdb # Docker -.dockerignore +!.dockerignore # Local development local/ diff --git a/python-api/Dockerfile b/python-api/Dockerfile index cce032c..7486d72 100644 --- a/python-api/Dockerfile +++ b/python-api/Dockerfile @@ -35,8 +35,9 @@ COPY --from=builder /opt/venv /opt/venv WORKDIR /app -# 复制应用代码 +# 复制应用代码和配置 COPY app/ ./app/ +COPY config/ ./config/ COPY pyproject.toml . EXPOSE 8000 diff --git a/python-api/deploy-test.sh b/python-api/deploy-test.sh index e2aa247..78a87a9 100644 --- a/python-api/deploy-test.sh +++ b/python-api/deploy-test.sh @@ -17,7 +17,7 @@ GIT_REPO="http://git2.haodian.cn/xiaoyu/meijiaka-zy.git" API_PORT=8081 # 1. 检查 Docker -echo "[1/6] 检查 Docker 环境..." +echo "[1/7] 检查 Docker 环境..." if ! command -v docker &> /dev/null; then echo "Docker 未安装,请先安装 Docker" exit 1 @@ -31,7 +31,7 @@ echo "Docker 版本: $(docker --version)" docker compose version || echo "docker-compose 版本: $(docker-compose --version)" # 2. 克隆/更新代码 -echo "[2/6] 更新代码..." +echo "[2/7] 更新代码..." if [ -d "$PROJECT_DIR/.git" ]; then cd "$PROJECT_DIR" git pull origin master @@ -41,7 +41,7 @@ else fi # 3. 创建数据目录 -echo "[3/6] 创建数据目录..." +echo "[3/7] 创建数据目录..." mkdir -p /opt/meijiaka-zy/data/{postgres,redis,logs} chmod 755 /opt/meijiaka-zy/data @@ -64,7 +64,7 @@ fi # 检查关键环境变量 MISSING_VARS=() -for var in VOLCENGINE_API_KEY KLINGAI_ACCESS_KEY KLINGAI_SECRET_KEY; do +for var in SECRET_KEY VOLCENGINE_API_KEY KLINGAI_ACCESS_KEY KLINGAI_SECRET_KEY; do if ! grep -q "^$var=" .env || grep -q "^$var=\$" .env; then MISSING_VARS+=($var) fi diff --git a/python-api/docker-compose.dev.yml b/python-api/docker-compose.dev.yml new file mode 100644 index 0000000..00abe29 --- /dev/null +++ b/python-api/docker-compose.dev.yml @@ -0,0 +1,63 @@ +# ============================================================================= +# 美家卡智影 API - 本地开发配置(开发专用) +# ============================================================================= +# ⚠️ 此配置仅用于本地开发: +# • 挂载源码目录(热重载) +# • DEBUG=true +# • 依赖外部 docker-infra 网络 +# +# 测试/生产环境请使用: +# • docker-compose.test.yml (All-in-One 测试服) +# • docker-compose.prod.yml (生产:仅 api + scheduler) +# ============================================================================= + +services: + api: + build: + context: . + dockerfile: Dockerfile + container_name: meijiaka-zy-api-dev + environment: + - ENV=development + - DEBUG=true + - DATABASE_URL=postgresql+asyncpg://postgres:postgres@meijiaka-db:5432/meijiaka_zy + - REDIS_HOST=meijiaka-redis + - REDIS_PORT=6379 + - REDIS_DB=1 + - SECRET_KEY=dev-secret-key-change-in-production + - MINIMAX_API_KEY=${MINIMAX_API_KEY} + - MINIMAX_BASE_URL=${MINIMAX_BASE_URL:-https://api.minimaxi.com} + - VIDU_API_KEY=${VIDU_API_KEY} + - VIDU_BASE_URL=${VIDU_BASE_URL:-https://api.vidu.cn} + volumes: + - .:/app + - ~/Documents/Meijiaka-zy:/root/Documents/Meijiaka-zy + ports: + - "8081:8000" + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload + networks: + - meijiaka-network + + scheduler: + build: + context: . + dockerfile: Dockerfile + container_name: meijiaka-zy-scheduler-dev + environment: + - ENV=development + - DEBUG=true + - DATABASE_URL=postgresql+asyncpg://postgres:postgres@meijiaka-db:5432/meijiaka_zy + - REDIS_HOST=meijiaka-redis + - REDIS_PORT=6379 + - REDIS_DB=1 + - SECRET_KEY=dev-secret-key-change-in-production + volumes: + - .:/app + - ~/Documents/Meijiaka-zy:/root/Documents/Meijiaka-zy + command: python -m app.scheduler.main + networks: + - meijiaka-network + +networks: + meijiaka-network: + external: true diff --git a/python-api/docker-compose.prod.yml b/python-api/docker-compose.prod.yml new file mode 100644 index 0000000..c1a2460 --- /dev/null +++ b/python-api/docker-compose.prod.yml @@ -0,0 +1,77 @@ +# ============================================================================= +# 美家卡智影 API - 生产环境配置 +# ============================================================================= +# 说明: +# • 此配置仅运行 api + scheduler 服务 +# • 假设 PostgreSQL 和 Redis 由外部基础设施提供(云数据库 / 自建集群) +# • 与测试环境使用**同一套 Dockerfile**,仅环境变量不同 +# +# 用法: +# export $(cat .env | xargs) # 或从 CI/CD / 密钥管理注入 +# docker compose -f docker-compose.prod.yml up -d --build +# ============================================================================= + +services: + api: + build: + context: . + dockerfile: Dockerfile + container_name: meijiaka-zy-api + environment: + - ENV=production + - DEBUG=false + - DATABASE_URL=${DATABASE_URL} + - REDIS_HOST=${REDIS_HOST} + - REDIS_PORT=${REDIS_PORT:-6379} + - REDIS_DB=${REDIS_DB:-0} + - SECRET_KEY=${SECRET_KEY} + - VOLCENGINE_API_KEY=${VOLCENGINE_API_KEY} + - VOLCENGINE_BASE_URL=${VOLCENGINE_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3} + - KLINGAI_ACCESS_KEY=${KLINGAI_ACCESS_KEY} + - KLINGAI_SECRET_KEY=${KLINGAI_SECRET_KEY} + - MINIMAX_API_KEY=${MINIMAX_API_KEY} + - MINIMAX_BASE_URL=${MINIMAX_BASE_URL:-https://api.minimaxi.com} + - VIDU_API_KEY=${VIDU_API_KEY} + - VIDU_BASE_URL=${VIDU_BASE_URL:-https://api.vidu.cn} + - ANYTOCOPY_API_KEY=${ANYTOCOPY_API_KEY} + - ANYTOCOPY_API_SECRET=${ANYTOCOPY_API_SECRET} + - QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY} + - QINIU_SECRET_KEY=${QINIU_SECRET_KEY} + volumes: + # 仅持久化日志到宿主机,其他数据走对象存储 + - /opt/meijiaka-zy/logs:/root/Documents/Meijiaka-zy/logs + ports: + - "8000:8000" + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:8000/health')\""] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + + scheduler: + build: + context: . + dockerfile: Dockerfile + container_name: meijiaka-zy-scheduler + environment: + - ENV=production + - DEBUG=false + - DATABASE_URL=${DATABASE_URL} + - REDIS_HOST=${REDIS_HOST} + - REDIS_PORT=${REDIS_PORT:-6379} + - REDIS_DB=${REDIS_DB:-0} + - SECRET_KEY=${SECRET_KEY} + - VOLCENGINE_API_KEY=${VOLCENGINE_API_KEY} + - KLINGAI_ACCESS_KEY=${KLINGAI_ACCESS_KEY} + - KLINGAI_SECRET_KEY=${KLINGAI_SECRET_KEY} + - MINIMAX_API_KEY=${MINIMAX_API_KEY} + - VIDU_API_KEY=${VIDU_API_KEY} + volumes: + - /opt/meijiaka-zy/logs:/root/Documents/Meijiaka-zy/logs + command: python -m app.scheduler.main + restart: unless-stopped + depends_on: + api: + condition: service_healthy diff --git a/python-api/docker-compose.test.yml b/python-api/docker-compose.test.yml index 68a4504..89ae222 100644 --- a/python-api/docker-compose.test.yml +++ b/python-api/docker-compose.test.yml @@ -47,13 +47,13 @@ services: dockerfile: Dockerfile container_name: meijiaka-zy-api environment: - - ENV=staging - - DEBUG=true + - ENV=production + - DEBUG=false - DATABASE_URL=postgresql+asyncpg://postgres:postgres@db:5432/meijiaka_zy - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_DB=0 - - SECRET_KEY=${SECRET_KEY:-test-secret-key-change-me} + - SECRET_KEY=${SECRET_KEY} - VOLCENGINE_API_KEY=${VOLCENGINE_API_KEY} - VOLCENGINE_BASE_URL=${VOLCENGINE_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3} - KLINGAI_ACCESS_KEY=${KLINGAI_ACCESS_KEY} @@ -83,13 +83,13 @@ services: dockerfile: Dockerfile container_name: meijiaka-zy-scheduler environment: - - ENV=staging - - DEBUG=true + - ENV=production + - DEBUG=false - DATABASE_URL=postgresql+asyncpg://postgres:postgres@db:5432/meijiaka_zy - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_DB=0 - - SECRET_KEY=${SECRET_KEY:-test-secret-key-change-me} + - SECRET_KEY=${SECRET_KEY} - VOLCENGINE_API_KEY=${VOLCENGINE_API_KEY} - KLINGAI_ACCESS_KEY=${KLINGAI_ACCESS_KEY} - KLINGAI_SECRET_KEY=${KLINGAI_SECRET_KEY}