# 生产/试运行部署:只有两个服务 —— app(单容器:API + worker(io 组)+ worker:agent + web 静态,单端口 4380)+ postgres。 # 用法(详见 docs/runbook/deploy.md): # cp docker/compose.env.example .env # 按注释生成 SECRET_MASTER_KEY / POSTGRES_PASSWORD # docker compose --env-file .env.deploy up -d --build # docker compose logs app | grep -i setup # 首次启动打印一次性 setup token # 开发只起数据库用 docker-compose.dev.yml。 name: umt x-logging: &logging driver: json-file options: max-size: "10m" max-file: "5" services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: umt POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请设置 POSTGRES_PASSWORD} POSTGRES_DB: umt volumes: - umt-pg-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U umt -d umt"] interval: 5s timeout: 3s retries: 20 stop_grace_period: 30s logging: *logging app: build: context: . args: APP_VERSION: ${APP_VERSION:-} APT_MIRROR: ${APT_MIRROR:-} image: uhd-media-tool:${APP_VERSION:-latest} restart: unless-stopped depends_on: postgres: condition: service_healthy environment: NODE_ENV: production DATABASE_URL: postgres://umt:${POSTGRES_PASSWORD}@postgres:5432/umt SECRET_MASTER_KEY: ${SECRET_MASTER_KEY:?请设置 SECRET_MASTER_KEY(openssl rand -hex 32)} LOG_LEVEL: ${LOG_LEVEL:-info} # 运行用户:DATA_DIR 由 entrypoint chown 成它;媒体库/下载目录需对它可读写 PUID: ${PUID:-10001} PGID: ${PGID:-10001} BACKUP_KEEP: ${BACKUP_KEEP:-14} # worker 并发:io 组(下载提交/入库复制/清理/对账/抓取等)与 agent 组(runAgent/resolveDecision)分池 WORKER_CONCURRENCY: ${WORKER_CONCURRENCY:-4} WORKER_AGENT_CONCURRENCY: ${WORKER_AGENT_CONCURRENCY:-2} # 手动按路径整理时递归遍历的文件数上限 ORGANIZE_WALK_MAX_FILES: ${ORGANIZE_WALK_MAX_FILES:-5000} ports: - "${UMT_BIND:-0.0.0.0}:${UMT_PORT:-4380}:4380" volumes: # 应用数据:agent-sessions/ backups/ exports/ tmp/ - umt-data:/data # 媒体库根与下载缓存目录按需挂载(容器内路径 = 控制台里登记的库根 / 路径映射 local 前缀): # - /srv/media:/media # - /srv/downloads:/downloads stop_grace_period: 15s logging: *logging volumes: umt-pg-data: umt-data: