全项目扫描修复: Docker数据卷修复+安全requireAdmin+12页SEO+API白名单+脚本超时+常量提取+假数据删除

This commit is contained in:
ZhuiGuangAI Dev
2026-06-12 17:27:47 +08:00
parent 464924aea0
commit 4c325c8699
454 changed files with 33647 additions and 980 deletions
+246
View File
@@ -0,0 +1,246 @@
# 追光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 跑)
│ ├── install-cron.sh # 旧 host cron 安装 (停用)
│ └── ... (业务脚本)
├── 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
```bash
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. 构建镜像
```bash
cd /home/ubuntu/zhuiguang-ai
docker compose build
# 首次 5-10 分钟,之后改 code 1-3 分钟
```
### 3. 启动
```bash
docker compose up -d
# 等 30s,让 prisma migrate deploy 跑完
docker compose ps
docker compose logs -f --tail 50 zhuiguang-ai-app
```
### 4. 验证
```bash
# 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
bash scripts/install-cron-backup.sh
# 安装:每天 03:30 备份 4 个卷到 /home/ubuntu/zhuiguang-ai-backup/dockers/
```
### 6. 旧 PM2 清理(验证通过后)
```bash
# 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
```
## 五、运维命令速查
```bash
# 查看服务
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-*/
```
## 六、回滚方案
任何步骤出问题,立即回滚:
```bash
# 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
```
## 七、升级流程
```bash
# 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`,出问题能秒切回