# /opt/photo-live/deploy/docker-compose-cn.yml —— 正式环境 cn 栈(2026-09-24)。 # 基于 infra/deploy/docker-compose.cn.yml 改造(同 ov 版偏差登记): # ① 自管 mysql:8.4 + redis:7(1Panel MySQL 是 5.7.44 不满足基线) # ② 独立桥网络 photo-net(与机上其它项目隔离) # ③ web 回环端口 18088(避开 1Panel phpMyAdmin 的 8089 段) # ④ mysql 内存调优:cn 机仅 3.5G(可用 ~1.4G),关 performance_schema、 # buffer pool 显式 128M(另建 2G swap 兜底,见部署记录) # cn 侧多两个角色:worker(sharp 图片流水线)+ sync(跨境推送/对账/统计回传)。 # sync 需出网可达:OV_API_URL(https 443)与 DATABASE_URL_OV(47.254.176.10:13306, # 安全组白名单 cn 出口 IP)。 name: photo-live-cn x-logging: &default-logging driver: json-file options: { max-size: "10m", max-file: "3" } services: mysql: image: mysql:8.4 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_bin --performance-schema=OFF --innodb-buffer-pool-size=128M environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: photo_cn MYSQL_USER: photo_cn MYSQL_PASSWORD: ${MYSQL_APP_PASSWORD} volumes: - mysql-cn-data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s retries: 24 restart: unless-stopped logging: *default-logging networks: [photo-net] redis: image: redis:7-alpine healthcheck: { test: ["CMD", "redis-cli", "ping"], interval: 5s, retries: 12 } restart: unless-stopped logging: *default-logging networks: [photo-net] api-cn: image: ${SERVER_IMAGE} command: ["api-cn"] init: true env_file: .env.production-cn environment: PORT: "8080" # 容器内固定;对外经 web 反代 restart: unless-stopped depends_on: mysql: { condition: service_healthy } redis: { condition: service_healthy } healthcheck: test: ["CMD", "curl", "-fs", "http://127.0.0.1:8080/v1/health"] interval: 30s timeout: 5s retries: 5 start_period: 20s logging: *default-logging networks: [photo-net] worker: image: ${SERVER_IMAGE} command: ["worker"] init: true env_file: .env.production-cn # 无 HTTP 端口:健康面由 restart 策略 + 日志监控承担(RUNBOOK.md) restart: unless-stopped depends_on: mysql: { condition: service_healthy } redis: { condition: service_healthy } logging: *default-logging networks: [photo-net] sync: image: ${SERVER_IMAGE} command: ["sync"] init: true env_file: .env.production-cn # 需出网:OV_API_URL(443) + DATABASE_URL_OV(13306,待安全组放行) restart: unless-stopped depends_on: mysql: { condition: service_healthy } redis: { condition: service_healthy } logging: *default-logging networks: [photo-net] web: image: ${WEB_IMAGE} init: true environment: API_UPSTREAM: http://api-cn:8080 # /v1 反代目标(含 WS /v1/realtime) ROOT_REDIRECT: /admin/ # cn 根路径直达后台 ports: - "127.0.0.1:18088:80" # 1Panel OpenResty 反代到此(站点已建) restart: unless-stopped depends_on: api-cn: { condition: service_healthy } healthcheck: test: ["CMD", "wget", "-qO", "/dev/null", "http://127.0.0.1/"] interval: 30s timeout: 5s retries: 5 start_period: 10s logging: *default-logging networks: [photo-net] volumes: mysql-cn-data: networks: photo-net: { driver: bridge }