- LOG_FILE 配置: 空(默认)保持 stdout + Admin 内存日志页(重启清零); 填路径后额外写 RotatingFileHandler(单文件 10MB × 5 份,utf-8) - setup_logging 幂等挂载(按 abspath 判重,相对/绝对同文件算一个); 目录自动创建;文件基础设施失败只 warning 绝不拖垮启动 - docker-compose: api 挂 applogs 卷,默认 LOG_FILE=/app/logs/app.log, 容器重建日志不丢;.env.example/.gitignore/docs 同步 - tests/test_log_persistence.py: 落盘/幂等/空值禁用/自动建目录/失败降级 - test_p0_standings_cutoff: 匿名约束 name=None 使 any() 子串匹配 TypeError (集合顺序不定 → flaky),先判真值再匹配(存量缺陷顺手加固)
64 lines
2.1 KiB
YAML
64 lines
2.1 KiB
YAML
services:
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
environment:
|
|
POSTGRES_USER: ${POSTGRES_USER:?POSTGRES_USER 未设置}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 未设置}
|
|
POSTGRES_DB: ${POSTGRES_DB:-football}
|
|
ports:
|
|
- "${POSTGRES_PORT:-5433}:5432"
|
|
volumes:
|
|
- pgdata:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:?POSTGRES_USER 未设置}"]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 5
|
|
|
|
api:
|
|
build: .
|
|
# Fix 2: 容器内 DATABASE_URL 使用 postgres 服务名(非 localhost)
|
|
# Fix 3: 启动时先跑 alembic upgrade,再启 uvicorn
|
|
command: >
|
|
sh -c "alembic upgrade head &&
|
|
uvicorn src.api.app:app --host 0.0.0.0 --port 8000"
|
|
ports:
|
|
- "${API_PORT:-8000}:8000"
|
|
environment:
|
|
# Fix 2: 容器内 DATABASE_URL 使用 postgres 服务名(非 localhost)
|
|
# 必须覆盖 .env 中的 DATABASE_URL,因为 Settings 不读 DB_HOST/DB_PORT
|
|
DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:?POSTGRES_USER 未设置}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 未设置}@postgres:5432/${POSTGRES_DB:-football}
|
|
# 日志持久化:写入挂载卷,容器重建不丢(应用内滚动 10MB×6 份封顶)
|
|
LOG_FILE: /app/logs/app.log
|
|
env_file: .env
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "python -c \"import urllib.request; exit(0 if urllib.request.urlopen('http://localhost:8000/health/ready', timeout=5).status==200 else 1)\" || exit 1"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 15s
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
volumes:
|
|
- ./src:/app/src
|
|
- ./alembic:/app/alembic
|
|
- ./alembic.ini:/app/alembic.ini
|
|
- applogs:/app/logs
|
|
|
|
frontend:
|
|
# Fix 4: 多阶段构建 —— 先 build 静态文件,再复制到 nginx
|
|
build:
|
|
context: ./frontend
|
|
dockerfile: Dockerfile.frontend
|
|
ports:
|
|
- "${FRONTEND_PORT:-3000}:80"
|
|
volumes:
|
|
- ./frontend/nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
|
depends_on:
|
|
- api
|
|
|
|
volumes:
|
|
pgdata:
|
|
applogs:
|