Files
zhuiguang-ai/docs/CONTAINERIZATION.md

8.2 KiB
Raw Permalink Blame History

追光AI 容器化部署文档

创建时间:2026-06-11
适用版本:V2.1.2+

一、为什么容器化

服务器 119.45.242.239 上有 3+ 邻居项目(zhuiguang-quant / zhenfang / snowy-fgt / agent-system)+ 3 个共享 Docker 服务(redis-cache / nacos / minio)。
本项目 (zhuiguang-ai) 改用容器化部署的好处:

  1. 环境隔离:本项目 Node 依赖与邻居项目(Java/Python)零冲突
  2. 可移植:换服务器 1 行命令起服务
  3. 可复现:Dockerfile 锁 Node 版本、依赖版本
  4. 资源上限:内存/CPU 可设限,不拖累邻居项目

二、架构

┌─────────── Host (Ubuntu 22.04) ───────────┐
│                                            │
│  ┌──────────────────────────────────┐      │
│  │ zhuiguang-ai-app (Docker)        │      │
│  │  - Next.js 14 (port 8301)        │      │
│  │  - network_mode: host            │      │
│  │  - 共享卷: data / public / logs  │      │
│  └──────────────────────────────────┘      │
│              │                             │
│              │ http://localhost:8301        │
│              ▼                             │
│  ┌──────────────────────────────────┐      │
│  │ zhuiguang-ai-cron (Docker)       │      │
│  │  - supercronic v0.2.33           │      │
│  │  - 13 个 cron 任务                │      │
│  │  - 共享卷: data / public / logs  │      │
│  └──────────────────────────────────┘      │
│                                            │
│  ┌─ 共享服务 (邻居项目共用) ─┐              │
│  │  redis-cache: 6379         │              │
│  │  nacos: 8848/9848          │              │
│  │  minio: 9000/9001          │              │
│  └────────────────────────────┘              │
│                                            │
│  ┌─ 外部服务 ─┐                              │
│  │  阿里云 RDS MySQL          │              │
│  │  DeepSeek / 各 AI/新闻 API │              │
│  └────────────┘                              │
│                                            │
│  ┌─ nginx 反代 ─┐                            │
│  │  80/443 → 8301│                           │
│  └────────────┘                              │
└────────────────────────────────────────────┘

网络模式 host 的原因:

需要访问宿主机上的 Redis/Nacos/MinIO 共享服务。bridge 网络要么把 host 的容器端口暴露给 bridge 网络(修改共享服务配置),要么用 extra_hosts: host.docker.internal(仅 Docker Desktop 支持,Linux server 需装 xinetd 替代)。
host 模式最简单,端口已锁定 8301-8310 不冲突。

三、目录结构

/home/ubuntu/zhuiguang-ai/
├── Dockerfile                    # 多阶段构建
├── docker-compose.yml            # 2 个服务编排
├── .dockerignore                 # 构建排除
├── crontab.txt                   # supercronic 调度表
├── env/
│   └── .env.production           # 生产环境变量 (DATABASE_URL / API_KEY)
├── scripts/
│   ├── entrypoint-app.sh         # APP 启动入口
│   ├── entrypoint-cron.sh        # CRON 启动入口
│   ├── backup-volumes.sh         # 卷备份 (host 跑)
│   ├── install-cron-backup.sh    # 备份 cron 安装 (host 跑)
│   └── ... (业务脚本)
├── public/                       # 静态资源 (volume)
├── data/                         # bot-characters.json (volume)
├── logs/                         # 运行日志 (volume)
└── ... (源码)

Docker 卷 (命名卷):
  zhuiguang_ai_bot_data    → /app/data
  zhuiguang_ai_bot_public  → /app/public
  zhuiguang_ai_bot_logs    → /app/logs
  zhuiguang_ai_bot_prisma  → /app/node_modules/.prisma

四、部署步骤

1. 准备 .env

cd /home/ubuntu/zhuiguang-ai
mkdir -p env
cp .env env/.env.production
chmod 600 env/.env.production
# 编辑 env/.env.production 填入生产 DATABASE_URL / API_KEY

2. 构建镜像

cd /home/ubuntu/zhuiguang-ai
docker compose build
# 首次 5-10 分钟,之后改 code 1-3 分钟

3. 启动

docker compose up -d
# 等 30s,让 prisma migrate deploy 跑完
docker compose ps
docker compose logs -f --tail 50 zhuiguang-ai-app

4. 验证

# 1) APP 探活
curl -I http://localhost:8301/api/health

# 2) CRON 探活
docker exec zhuiguang-ai-cron pgrep -f supercronic
docker exec zhuiguang-ai-cron supercronic-linux-amd64 -version

# 3) 触发 1 个 cron 任务手动跑
docker exec zhuiguang-ai-cron bash -c "set -a; . /app/.env; set +a; node /app/scripts/task1-discover-tools.mjs"

# 4) 看实时日志
docker compose logs -f zhuiguang-ai-cron

5. 安装 host 备份 cron

bash scripts/install-cron-backup.sh
# 安装:每天 03:30 备份 4 个卷到 /home/ubuntu/zhuiguang-ai-backup/dockers/

6. 旧 PM2 清理(验证通过后)

# 1) 停 PM2
pm2 stop zhuiguang-ai
# 2) 验证容器无问题 24h+ 后
pm2 delete zhuiguang-ai
pm2 save

# 3) 旧 host cron 清理(容器接管后失效)
crontab -l | grep -vE 'zhuiguang-ai|bot-activity' > /tmp/cron.new
crontab /tmp/cron.new

# 4) 旧代码归档(保留 7 天可回滚)
cd /home/ubuntu
mv zhuiguang-ai zhuiguang-ai-old-$(date +%Y%m%d)
# 把 git 仓库拉回来(容器卷只是数据,源码在 git)
git clone <repo-url> zhuiguang-ai

五、运维命令速查

# 查看服务
docker compose ps
docker compose logs -f zhuiguang-ai-app
docker compose logs -f zhuiguang-ai-cron

# 资源占用
docker stats zhuiguang-ai-app zhuiguang-ai-cron

# 进入容器
docker exec -it zhuiguang-ai-app sh
docker exec -it zhuiguang-ai-cron sh

# 手动跑一个脚本
docker exec zhuiguang-ai-cron bash -c "set -a; . /app/.env; set +a; node /app/scripts/bot-activity.mjs"

# 重启单个服务
docker compose restart zhuiguang-ai-app

# 重建镜像 + 重启
docker compose build --no-cache zhuiguang-ai-app
docker compose up -d zhuiguang-ai-app

# 备份
bash /home/ubuntu/zhuiguang-ai/scripts/backup-volumes.sh

# 回滚到 PM2
pm2 start zhuiguang-ai  # 前提:旧代码还在 /home/ubuntu/zhuiguang-ai-old-*/

六、回滚方案

任何步骤出问题,立即回滚:

# 1) 停容器
cd /home/ubuntu/zhuiguang-ai
docker compose down

# 2) 切回旧代码
cd /home/ubuntu
mv zhuiguang-ai zhuiguang-ai-failed-$(date +%Y%m%d)
mv zhuiguang-ai-old-YYYYMMDD zhuiguang-ai

# 3) 启动 PM2
cd /home/ubuntu/zhuiguang-ai
pm2 start zhuiguang-ai

# 4) 确认线上恢复
curl -I http://localhost:8301/api/health

七、升级流程

# 1) 拉新代码
cd /home/ubuntu/zhuiguang-ai
git pull

# 2) 如改了 schema 需先备份
bash scripts/backup-volumes.sh

# 3) 重新构建
docker compose build

# 4) 滚动重启(先 cron 再 app 减少任务失败)
docker compose up -d
# 或分步
docker compose up -d zhuiguang-ai-cron
docker compose up -d zhuiguang-ai-app

# 5) 验证
curl -I http://localhost:8301/api/health
docker compose logs --tail 30 zhuiguang-ai-app

八、注意事项(项目铁律)

  1. 端口锁定 8301-8310:本项目所有端口只能在这区间,容器也必须遵守
  2. 不动共享服务:Redis/Nacos/MinIO 在宿主机 Docker,绝不重启
  3. 不动邻居项目目录:/home/ubuntu/{zhuiguang-quant,zhenfang,snowy-fgt,agent-system} 只读
  4. 不动全局 crontab:用 crontab -e 追加,不要 crontab -r
  5. 不动 nginx:容器绑定 8301,nginx 反代规则不动
  6. 保留 PM2 镜像:验证通过 24h 前不要 pm2 delete,出问题能秒切回