# 构建参数默认走国内源;可在项目根 .env 中覆盖(Compose 会自动加载 .env) # 基础镜像 postgres/nginx/python/node 仍从 Docker Hub 拉取,请在 Docker Desktop 配置 registry-mirrors(见 scripts/configure-mirrors.sh) # # backend 已默认清空 HTTP(S)_PROXY,避免宿主机/IDE 代理注入容器导致访问 dashscope 失败;若必须走代理访问外网,请用 # docker-compose.override.yml 覆盖 HTTPX_TRUST_ENV=1 并设置代理变量(见 .env.example 说明) services: db: image: postgres:16-alpine container_name: exam-helper-db restart: unless-stopped environment: POSTGRES_DB: exam_helper POSTGRES_USER: exam_user POSTGRES_PASSWORD: exam_pass volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U exam_user -d exam_helper"] interval: 5s timeout: 5s retries: 10 backend: build: context: ./backend args: PIP_INDEX_URL: ${PIP_INDEX_URL:-https://mirrors.aliyun.com/pypi/simple/} PIP_TRUSTED_HOST: ${PIP_TRUSTED_HOST:-mirrors.aliyun.com} DEBIAN_MIRROR_HOST: ${DEBIAN_MIRROR_HOST:-mirrors.aliyun.com} container_name: exam-helper-backend restart: unless-stopped # 改善容器内解析 dashscope.aliyuncs.com(若仍 ConnectError,再检查宿主机网络/代理) dns: - 223.5.5.5 - 223.6.6.6 healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health', timeout=3).read()", ] interval: 5s timeout: 5s retries: 12 start_period: 25s # 先加载 .env.example;若存在 .env 则合并覆盖(推荐用 start.sh 或 scripts/bootstrap-env.sh 生成 .env) env_file: - .env.example - path: .env required: false environment: DATABASE_URL: postgresql+psycopg://exam_user:exam_pass@db:5432/exam_helper # 本地开发 Vite + Docker 前端均需允许 CORS_ORIGINS: http://localhost:5173,http://localhost:8173 UPLOAD_DIR: /app/uploads # 覆盖 .env 中可能误带的代理,保证访问千问与 pip 行为解耦(千问用 httpx trust_env=false + 此处清空) HTTPX_TRUST_ENV: "0" HTTP_PROXY: "" HTTPS_PROXY: "" ALL_PROXY: "" http_proxy: "" https_proxy: "" all_proxy: "" NO_PROXY: "*" volumes: - uploads_data:/app/uploads depends_on: db: condition: service_healthy # 仅绑定本机回环;需手机/局域网访问可改为 "8866:8000" ports: - "127.0.0.1:8866:8000" frontend: build: context: ./frontend args: NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmmirror.com} DEBIAN_MIRROR_HOST: ${DEBIAN_MIRROR_HOST:-mirrors.aliyun.com} ALPINE_MIRROR_HOST: ${ALPINE_MIRROR_HOST:-mirrors.aliyun.com} container_name: exam-helper-frontend restart: unless-stopped depends_on: backend: condition: service_healthy ports: - "127.0.0.1:8173:80" volumes: postgres_data: uploads_data: