120 lines
3.7 KiB
YAML
120 lines
3.7 KiB
YAML
# =============================================================================
|
||
# 追光AI Docker Compose (生产部署)
|
||
# - 1 个 APP 容器 (Next.js, 端口 8301)
|
||
# - 1 个 CRON 容器 (supercronic 调度 25 个任务)
|
||
# - 共用同一镜像,通过 override command 区分
|
||
# - 用 network_mode: host 让容器能访问宿主机共享服务 (Redis/Nacos/MinIO)
|
||
# - 卷挂载:data、public、logs 持久化
|
||
# =============================================================================
|
||
|
||
version: '3.7'
|
||
|
||
services:
|
||
|
||
# -------------------------------------------------------------------------
|
||
# 1) APP 服务
|
||
# -------------------------------------------------------------------------
|
||
zhuiguang-ai-app:
|
||
image: zhuiguang-ai:2.1.3
|
||
container_name: zhuiguang-ai-app
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
restart: unless-stopped
|
||
network_mode: host
|
||
# 用 host 网络:直接共享宿主机网络栈
|
||
# 优点:能直接访问 127.0.0.1:6379 (Redis), :8848 (Nacos), :9000 (MinIO)
|
||
# 缺点:失去 docker 端口隔离(但端口已锁定 8301,无冲突)
|
||
|
||
environment:
|
||
# 容器内 timezone
|
||
TZ: Asia/Shanghai
|
||
NODE_ENV: production
|
||
PORT: "8301"
|
||
HOSTNAME: "0.0.0.0"
|
||
|
||
volumes:
|
||
# .env 挂载(必须,否则容器找不到 DATABASE_URL)
|
||
- ./env/.env.production:/app/.env:ro
|
||
# 持久化数据
|
||
- bot-data:/app/data
|
||
- bot-public:/app/public
|
||
# 日志(容器外可读,方便 docker logs + host 双通道)
|
||
- bot-logs:/app/logs
|
||
# 临时 prisma 缓存
|
||
- bot-prisma:/app/node_modules/.prisma
|
||
|
||
# 不依赖 DB 健康检查(DB 是外网阿里云 RDS,检测不到会拖累启动)
|
||
healthcheck:
|
||
test: ["CMD", "curl", "-f", "http://localhost:8301/api/health"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 3
|
||
start_period: 40s
|
||
|
||
logging:
|
||
driver: json-file
|
||
options:
|
||
max-size: "50m"
|
||
max-file: "5"
|
||
|
||
# 用默认 entrypoint-app.sh (在 Dockerfile 里已设)
|
||
command: ["/usr/local/bin/entrypoint-app.sh"]
|
||
|
||
# -------------------------------------------------------------------------
|
||
# 2) CRON 服务
|
||
# -------------------------------------------------------------------------
|
||
zhuiguang-ai-cron:
|
||
image: zhuiguang-ai:2.1.3
|
||
container_name: zhuiguang-ai-cron
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
restart: unless-stopped
|
||
network_mode: host
|
||
|
||
environment:
|
||
TZ: Asia/Shanghai
|
||
NODE_ENV: production
|
||
|
||
volumes:
|
||
- ./env/.env.production:/app/.env:ro
|
||
# 共享 app 的 data 卷
|
||
- bot-data:/app/data
|
||
# 共享 app 的 public 卷(cron 任务可能读 bot 头像)
|
||
- bot-public:/app/public
|
||
# 共享 app 的 logs 卷(cron 写入日志,host 可见)
|
||
- bot-logs:/app/logs
|
||
- bot-prisma:/app/node_modules/.prisma
|
||
# 挂载 crontab 文件(不挂就看不到调度表)
|
||
- ./crontab.txt:/app/crontab.txt:ro
|
||
|
||
# supercronic 健康:自检进程存活
|
||
healthcheck:
|
||
test: ["CMD", "pgrep", "-f", "supercronic"]
|
||
interval: 60s
|
||
timeout: 3s
|
||
retries: 3
|
||
start_period: 10s
|
||
|
||
logging:
|
||
driver: json-file
|
||
options:
|
||
max-size: "20m"
|
||
max-file: "3"
|
||
|
||
command: ["/usr/local/bin/entrypoint-cron.sh"]
|
||
|
||
# 依赖 app 启动完成(不强依赖 DB,data 卷在 compose 内共享)
|
||
depends_on:
|
||
- zhuiguang-ai-app
|
||
|
||
# =============================================================================
|
||
# 命名卷(持久化)
|
||
# =============================================================================
|
||
volumes:
|
||
bot-data:
|
||
bot-public:
|
||
bot-logs:
|
||
bot-prisma:
|