全项目扫描修复: Docker数据卷修复+安全requireAdmin+12页SEO+API白名单+脚本超时+常量提取+假数据删除
This commit is contained in:
+152
-22
@@ -6,19 +6,122 @@
|
||||
- 重启脚本仅扫描8301-8310范围
|
||||
- **强制要求:本项目端口必须锁定在8301-8310区间内,禁止使用其他端口,因为本服务器同时运行其他产品**
|
||||
|
||||
## 服务器连接信息(重要!总是需要)
|
||||
- **IP地址**: 119.45.242.239
|
||||
- **登录用户**: ubuntu
|
||||
- **SSH密钥**: `C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem`
|
||||
- **SSH命令**: `ssh -i "C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem" ubuntu@119.45.242.239`
|
||||
- **SCP示例**: `scp -i "C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem" localfile ubuntu@119.45.242.239:/home/ubuntu/zhuiguang-ai/`
|
||||
|
||||
## 服务器与基础设施
|
||||
- **域名**: www.zhuig.com (HTTPS,SSL证书自动续期)
|
||||
- **云服务器**: 119.45.242.239 (登录名: **ubuntu**, 密钥: `C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem`)
|
||||
- **部署目录**: /home/ubuntu/zhuiguang-ai
|
||||
- **访问地址**: https://www.zhuig.com (HTTP自动跳转HTTPS)
|
||||
- **数据库**: 阿里云RDS MySQL — rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306
|
||||
- **Redis**: 云服务器上已有(Docker容器redis-cache:6379),与其他项目共用,有密码认证
|
||||
- **本地Git同步目录**: K:\git-repos
|
||||
- **开发机**: E:\ZG_Dev\ZhuiGuangAI\zhuiguang-ai
|
||||
- **部署目录**: /home/ubuntu/zhuiguang-ai
|
||||
- **访问地址**: https://www.zhuig.com (HTTP自动跳转HTTPS)
|
||||
- **注意事项**: 服务器有其他应用运行,部署时不可占用非8301-8310端口,不可影响其他服务
|
||||
- **SSH连接示例**: `ssh -i "C:\SGP_KF\ZhuiGuangAI\zhuiguang-ai\Pem\zg.pem" ubuntu@119.45.242.239`
|
||||
- **PM2管理**: `pm2 list` / `pm2 restart zhuiguang-ai` / `pm2 save`
|
||||
- **其他应用**: agent-system, nacos, zhuiguang-quant (部署时请勿影响)
|
||||
- **Docker管理**: `docker ps` / `docker logs zhuiguang-ai-app` / `docker restart zhuiguang-ai-app`
|
||||
|
||||
### ⚠️ 多项目共存服务器(更新/部署铁律)
|
||||
|
||||
服务器 119.45.242.239 上**同时运行多个项目**和**多个共享服务**,任何代码更新、部署、运维操作必须严格隔离,绝不能影响其他项目。
|
||||
|
||||
#### 当前服务器实际部署清单(2026-06-10 巡检)
|
||||
|
||||
| 项目 | 路径 | 占用端口 | 进程 |
|
||||
|------|------|----------|------|
|
||||
| **zhuiguang-ai(我们)** | /home/ubuntu/zhuiguang-ai | 8301 (next-server) | Docker: zhuiguang-ai-app + zhuiguang-ai-cron |
|
||||
| zhuiguang-ai-backup | /home/ubuntu/zhuiguang-ai-backup | — | 静态备份 |
|
||||
| zhuiguang-quant | /home/ubuntu/zhuiguang-quant | 8701 / 8802 (java) | 独立 java 进程 |
|
||||
| zhenfang | /home/ubuntu/zhenfang | — | — |
|
||||
| snowy-fgt | /home/ubuntu/snowy-fgt | 7001 (gunicorn) | 独立 gunicorn |
|
||||
| agent-system | /home/ubuntu/agent-system | — | — |
|
||||
| nacos | /home/ubuntu/nacos | 8601 / 8602 (java) | 独立 java 进程 |
|
||||
|
||||
#### 共享服务(绝对不能动)
|
||||
|
||||
| 服务 | 端口 | 容器名 | 共享给 |
|
||||
|------|------|--------|--------|
|
||||
| Redis | 6379 | redis-cache (Docker) | 所有项目 |
|
||||
| Nacos | 8848 / 9848 | nacos (Docker) | 注册中心 |
|
||||
| MinIO | 9000 / 9001 | minio (Docker) | 文件存储 |
|
||||
| nginx | 80 / 443 / 8720 / 8801 | 系统 nginx | 反向代理多域名 |
|
||||
|
||||
#### 铁律(更新/部署前必读)
|
||||
|
||||
1. **端口锁定 8301-8310**:本项目所有 HTTP/WS 服务只能使用 8301-8310 区间。禁止占用 80/443/8601-8802/8848/9000-9001/6379/7001 等任何其他端口。Docker 容器启动时若发现目标端口被占,**先排查是哪个项目在用**,绝不能 kill 别人的进程。
|
||||
2. **进程隔离**:禁止 `pkill -f node` / `pkill -f java` / `pkill -f nginx` / `pkill -f docker` 等全局杀进程。重启本项目**只能重启 Docker 容器**(`docker restart zhuiguang-ai-app`)或 8301-8310 端口上的进程。
|
||||
3. **禁止修改其他项目目录**:`/home/ubuntu/{zhuiguang-quant,zhenfang,snowy-fgt,agent-system,nacos}` 及其子目录**只读**,不要 `cd` 进去 `git pull` / `npm install` / 改文件。
|
||||
4. **禁止修改共享服务配置**:
|
||||
- 不动 Redis(6379)—— 别人可能正在用我们的 key 以外的数据
|
||||
- 不动 Nacos(8848)—— 注册中心是全局的
|
||||
- 不动 MinIO(9000)—— 文件存储多项目共用
|
||||
- 不动 nginx 主配置 / sites-enabled 下的其他站点 —— 我们的反代规则放在独立文件,文件名带 `zhuiguang` 前缀
|
||||
- 不 `docker restart` / `docker stop` / `docker rm` 任何邻居容器(本项目容器名以 `zhuiguang-ai` 开头)
|
||||
5. **数据库隔离**:阿里云 RDS 上的数据库是本项目专用(`zhuiguang_ai`),但**严禁 `DROP DATABASE` / `TRUNCATE` 全表 / 删 migration 文件**。改 schema 必须 `prisma migrate dev` 生成新 migration 走前向变更。绝不执行任何会清空数据的脚本。
|
||||
6. **Crontab 隔离**:本项目定时任务已全部迁移到容器内 supercronic 调度(`zhuiguang-ai-cron` 容器),主机 crontab 已清空。**禁止在主机 crontab 中添加本项目定时任务**,所有定时任务通过更新 `crontab.txt` 并重建 cron 容器完成。也禁止 `crontab -r` 清空(可能影响邻居项目)。
|
||||
7. **磁盘隔离**:`/home/ubuntu/zhuiguang-ai/logs/` 是本项目日志目录;`/home/ubuntu/logs/` 是其他项目的,**不要混淆**。本项目备份只放 `/home/ubuntu/zhuiguang-ai-backup/`。
|
||||
8. **环境变量隔离**:只读 `/home/ubuntu/zhuiguang-ai/.env`。**不要改 `~/.bashrc` / `/etc/environment` / `/etc/profile`** 等全局环境文件,全局变量可能影响其他项目。
|
||||
9. **部署前自检清单**(强制):
|
||||
- [ ] `docker ps --filter name=zhuiguang-ai` —— 确认当前运行的容器
|
||||
- [ ] `ss -tlnp | grep :8301` —— 确认 8301 是容器进程
|
||||
- [ ] `git status` —— 确认本地代码只动本项目文件
|
||||
- [ ] `npx tsc --noEmit` —— 零错误
|
||||
- [ ] **不动** `/home/ubuntu/` 下其他项目目录
|
||||
- **不动** Redis/Nacos/MinIO 容器
|
||||
- **不动** nginx/sites-enabled 下非 zhuiguang 开头的文件
|
||||
- **不动** 全局 crontab(本项目已用 supercronic 容器)
|
||||
10. **部署后自检清单**(强制):
|
||||
- [ ] `docker ps` —— zhuiguang-ai-app 和 zhuiguang-ai-cron 状态 healthy
|
||||
- [ ] `curl -I https://www.zhuig.com` —— 200,且响应时间 < 3s
|
||||
- [ ] `ss -tlnp | grep :8301` —— 进程为 Docker 容器内 next-server
|
||||
- [ ] `docker logs --tail 20 zhuiguang-ai-app` —— 无 ERROR
|
||||
- [ ] 其他项目(zhuiguang-quant/zhenfang/snowy-fgt/nacos 等)的进程仍在、状态正常
|
||||
|
||||
#### 反例(禁止操作)
|
||||
|
||||
```bash
|
||||
# ❌ 禁止 —— 全局杀进程
|
||||
pkill -f node
|
||||
pkill -f java
|
||||
kill -9 $(pgrep node)
|
||||
systemctl restart nginx
|
||||
|
||||
# ❌ 禁止 —— 改其他项目
|
||||
cd /home/ubuntu/zhuiguang-quant && git pull
|
||||
rm -rf /home/ubuntu/zhenfang
|
||||
docker restart redis-cache
|
||||
docker stop nacos
|
||||
vi /etc/nginx/nginx.conf
|
||||
crontab -r
|
||||
|
||||
# ❌ 禁止 —— 改共享服务
|
||||
redis-cli FLUSHALL
|
||||
mysql -e "DROP DATABASE ..."
|
||||
```
|
||||
|
||||
#### 正例(本项目更新/部署的标准做法)
|
||||
|
||||
```bash
|
||||
# ✅ 只动本项目
|
||||
cd /home/ubuntu/zhuiguang-ai
|
||||
git pull
|
||||
docker build -t zhuiguang-ai:latest .
|
||||
docker stop zhuiguang-ai-app zhuiguang-ai-cron
|
||||
docker rm zhuiguang-ai-app zhuiguang-ai-cron
|
||||
# 然后重新 docker run(参考 docker-compose.yml 或 CONTAINERIZATION.md)
|
||||
|
||||
# ✅ 查看状态时不漏看其他项目
|
||||
docker ps --filter name=zhuiguang-ai # 看本项目容器状态
|
||||
ss -tlnp | grep -E ':(8301|8601|8701|8802)' # 看我们的端口 + 邻居项目的端口
|
||||
|
||||
# ✅ 日志查看
|
||||
docker logs --tail 50 zhuiguang-ai-app # APP 容器日志
|
||||
docker logs --tail 50 zhuiguang-ai-cron # Cron 容器日志
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 技术栈
|
||||
- Next.js 14 (App Router) + TypeScript
|
||||
@@ -39,8 +142,9 @@
|
||||
|
||||
## 构建与检查
|
||||
- 修改代码后必须运行 `npx tsc --noEmit` 确认零错误
|
||||
- 重启服务使用 `pwsh -ExecutionPolicy Bypass -File restart.ps1`
|
||||
- 开发服务器: `npm run dev` (端口8301)
|
||||
- 本地开发服务器: `npm run dev` (端口8301)
|
||||
- 生产构建: `docker build -t zhuiguang-ai:latest .`
|
||||
- 部署: `docker stop/rm` 旧容器 → `docker run` 新容器
|
||||
|
||||
## 数据库
|
||||
- 云数据库: 阿里云RDS MySQL
|
||||
@@ -63,8 +167,8 @@
|
||||
- 批量操作: body中传 `ids` 数组
|
||||
|
||||
## 页面路由
|
||||
- 前台: `/`, `/tools`, `/tools/[slug]`, `/categories/[slug]`, `/skills`, `/skills/[slug]`, `/login`, `/user`, `/user/favorites`, `/user/[id]`(会员空间), `/user/collections`, `/daily`, `/reviews`, `/community`, `/community/[category]`, `/community/topic/[id]`
|
||||
- 后台: `/admin/login`, `/admin/pending`, `/admin/pending-skills`, `/admin/tools`, `/admin/skills`, `/admin/categories`, `/admin/skill-categories`, `/admin/discover-tools`, `/admin/check-tools`, `/admin/discover-skills`, `/admin/update-skills`, `/admin/discover-news`, `/admin/system-config`, `/admin/tasks`, `/admin/tasks/logs`, `/admin/tasks/[taskKey]`, `/admin/reviews`
|
||||
- 前台: `/`, `/tools`, `/tools/[slug]`, `/categories/[slug]`, `/skills`, `/skills/[slug]`, `/login`, `/user`, `/user/favorites`, `/user/[id]`(会员空间), `/user/collections`, `/daily`, `/reviews`, `/community`, `/community/[category]`, `/community/topic/[id]`, `/community/bots`, `/community/bots/leaderboard`
|
||||
- 后台: `/admin/login`, `/admin/pending`, `/admin/pending-skills`, `/admin/tools`, `/admin/skills`, `/admin/categories`, `/admin/skill-categories`, `/admin/discover-tools`, `/admin/check-tools`, `/admin/discover-skills`, `/admin/update-skills`, `/admin/discover-news`, `/admin/system-config`, `/admin/tasks`, `/admin/tasks/logs`, `/admin/tasks/[taskKey]`, `/admin/reviews`, `/admin/roles`, `/admin/bot-experiments`, `/admin/bot-adversarial-learning`, `/admin/bot-analytics`
|
||||
|
||||
## 五大操作指令
|
||||
|
||||
@@ -129,6 +233,14 @@
|
||||
## 环境变量
|
||||
- GITHUB_TOKEN: GitHub Personal Access Token(可选,提升API限流从60→5000次/小时)
|
||||
- DEEPSEEK_API_KEY: DeepSeek API Key(用于技能评测生成脚本、AI日报整理)
|
||||
- OPENAI_API_KEY: OpenAI API Key(Bot活动引擎使用,生成论坛内容)
|
||||
|
||||
## 数字人Bot系统
|
||||
- **角色定义文件**: `data/bot-characters.json` — 112个Bot角色定义,所有Bot脚本和前端工具依赖此文件
|
||||
- **Bot头像目录**: `public/bot-avatars/` — 程序化SVG头像(112个,~2.5KB/个)
|
||||
- **Bot用户标记**: User表中 `isBot: true` 标识Bot用户,与真人的互动数据分别统计
|
||||
- **Bot活动时段**: 9:00-23:00每小时运行,15轮/天,论坛内容不干扰深夜用户体验
|
||||
- **Bot数据库**: 12张Bot专用表(BotConfig/BotMemory/BotDailyStat/BotSkill/BotWeeklyReview/BotPersona/BotPersonaVariant/BotPersonaExperiment/BotPersonaAssignment/BotPersonaMetric/BotAdversarialLearning/BotCrossForumAffinity)
|
||||
|
||||
## 定时任务调度系统
|
||||
- **后台管理**: `/admin/tasks`(任务中心)、`/admin/tasks/logs`(执行日志)、`/admin/tasks/[taskKey]`(单任务详情+统计)
|
||||
@@ -140,23 +252,26 @@
|
||||
- `GET /api/admin/tasks/logs` — 任务执行日志(分页+按taskKey筛选)
|
||||
- `POST /api/admin/tasks/run` — 手动触发任务执行
|
||||
|
||||
### 定时任务(Crontab)
|
||||
所有7个定时任务全部经过TaskLog记录,由 `scripts/cron-wrapper.sh` 统一入口执行(自动加载 `.env` 环境变量、创建日志目录):
|
||||
### 定时任务(Supercronic 容器调度)
|
||||
所有定时任务由 `zhuiguang-ai-cron` 容器内的 supercronic 调度,配置文件 `crontab.txt`。不再使用主机 crontab + cron-wrapper.sh。
|
||||
|
||||
| 时间 | 任务 | 脚本 | TaskKey | 说明 |
|
||||
|------|------|------|---------|------|
|
||||
| 01:00 | Task5 更新星值 | `scripts/task5-update-stars.mjs` | task5-update-stars | 更新所有GitHub技能Stars数+日/周/月变化 |
|
||||
| 03:00 | Task3 工具巡检 | `scripts/task3-check-tools.mjs` | task3-check-tools | 检查网站/Lo4go可访问性+自动发布合格待审核工具 |
|
||||
| 03:00 | Task3 工具巡检 | `scripts/task3-check-tools.mjs` | task3-check-tools | 检查网站/Logo可访问性+自动发布合格待审核工具 |
|
||||
| 04:00 | Bot技能结晶 | `scripts/bot-skill-crystallize.mjs` | bot-skill-crystallize | 扫过去14天高互动Bot话题→DeepSeek解构共性→入库BotSkill(usageCount驱动调用);末尾回收7天前成熟技能更新successRate(<30%且使用≥3次自动isActive=false) |
|
||||
| 05:00 | Bot亲和度与画像 | `scripts/bot-affinity-update.mjs` | bot-affinity-update | 刷BotCrossForumAffinity(affinity=min(1, samples/total/4))和BotPersona(avgReplyLength/questionRatio/stanceKeywords/topHumanUsers/topTopicTypes/lastTopicTitles,bot-activity发帖时注入prompt) |
|
||||
| 04:00 | Task6 评测热门 | `scripts/task6-review-hot.mjs` | task6-review-hot | 评测2个最热未评测GitHub技能(五维评测) |
|
||||
| 05:00 | Task4 发现技能 | `scripts/daily-discover.mjs` | task4-discover-skills | GitHub搜索≥1000 stars项目→DeepSeek预评测→入库PendingSkill |
|
||||
| 06:00 | Task1 发现工具 | `scripts/task1-discover-tools.mjs` | task1-discover-tools | 36kr/IT之家/开源中国RSS→DeepSeek提取工具→入库PendingTool |
|
||||
| 07:30 | AI日报 | `scripts/daily-news.mjs` | daily-news | 多源搜索真实新闻+DeepSeek整理格式→发布日报 |
|
||||
| 21:30 | Bot反馈闭环 | `scripts/bot-feedback-loop.mjs` | bot-feedback-loop | 扫描Bot自己帖子下的新回复→存反馈记忆→按概率触发二次回复(仅expert bots,配额high=6/medium=3/low=1) |
|
||||
| 周日02:00 | Bot周度复盘 | `scripts/bot-weekly-review.mjs` | bot-weekly-review | 算engagementScore→生成REFLECTION记忆→决定下周配额tier(写入BotWeeklyReview.nextWeekQuota,bot-activity下次跑时动态覆盖) |
|
||||
| 08:00 | Task7 新闻推社区 | `scripts/task7-news-to-community.mjs` | task7-news-to-community | 将当日日报新闻分发到社区4个板块(AI工具推荐/AI资讯/技术探讨/观点讨论) |
|
||||
|
||||
- Crontab 位于服务器: `crontab -l`(ubuntu用户),安装脚本: `bash scripts/install-cron.sh`
|
||||
- 统一入口: `scripts/cron-wrapper.sh <TASK_NAME> <SCRIPT_PATH>` — 自动加载 `.env`、创建日志目录、记录执行结果
|
||||
- 日志目录: `/home/ubuntu/zhuiguang-ai/logs/`(task1.log ~ task7.log, daily-news.log)
|
||||
- **关键**: crontab 环境不加载 `.env`,所有定时任务必须通过 wrapper 执行;`.env` 值不能加引号
|
||||
- 调度配置: `crontab.txt`(supercronic 格式),修改后需重建 cron 容器生效
|
||||
- 日志目录: 容器内 `/app/logs/`(挂载到 Docker volume `zhuiguang_ai_bot_logs`)
|
||||
- 定时任务脚本从 `scripts/` 目录直接执行,环境变量由容器 entrypoint 注入
|
||||
|
||||
## AI日报新闻源
|
||||
- **36kr** RSS (https://36kr.com/feed) — 国内科技资讯
|
||||
@@ -175,10 +290,11 @@
|
||||
- Chart.js组件需用dynamic import + ssr: false,不支持服务端渲染
|
||||
- Prisma 7.8需通过PrismaMariaDb适配器初始化,不能直接new PrismaClient()
|
||||
- 服务器环境SSL证书问题: 运行脚本需设置$env:NODE_TLS_REJECT_UNAUTHORIZED="0"
|
||||
- **crontab env隔离**: crontab 不加载 `.env`,必须用 wrapper 脚本 `source .env` + `set -a`/`set +a`
|
||||
- **.env 引号陷阱**: `.env` 值禁止加引号,`xargs` 导出会保留引号导致 SQL 语法错误
|
||||
- **PrismaMariaDb 协议**: adapter 只接受 `mariadb://`,`.env` 中的 `mysql://` 需在脚本中 `.replace('mysql://', 'mariadb://')`
|
||||
- **.mjs 不支持 TS**: `.mjs` 文件不能有 TypeScript 类型注解(`const x: Type =`),需用纯 JS 语法
|
||||
- **crontab env 隔离**: 本项目已迁移到容器内 supercronic 调度,不再依赖主机 crontab
|
||||
- **Supercronic 环境变量**: entrypoint-cron.sh 中 `set -a; . /app/.env; set +a` 注入环境变量到 supercronic 子进程
|
||||
- **Prisma 7 datasource.url**: 必须放在 `prisma.config.ts` 中,不能在 `schema.prisma` 的 datasource 块里写 `url`
|
||||
- **Docker build 期 Next.js 模块求值**: server page 和 API route 在 build 时会被求值,如果依赖 env 变量(如 DATABASE_URL、API_KEY),需加 `export const dynamic = "force-dynamic"` 或懒加载
|
||||
- **Docker 多阶段构建**: deps → builder → runner,利用 layer cache 加速重复构建
|
||||
|
||||
### 6. 安全原则
|
||||
- 敏感信息(密钥、密码、Token)必须使用环境变量,禁止硬编码
|
||||
@@ -191,6 +307,20 @@
|
||||
- **数据库外键回退值禁止硬编码**:凡涉及 FK 字段(如 categoryId)必须先查库取有效 ID,再做回退(参考 `category.findFirst()` 模式),禁止用 `|| 1` 等魔法数字
|
||||
- **批量写操作必须限制数量上限**:工具/技能导入 max(100),新闻导入 max(50),批量发布 max(500)
|
||||
|
||||
### 8. Knowledge Graph Memory 同步规则
|
||||
- **每次代码变更后,必须同步更新 Knowledge Graph Memory**:当修改了项目代码(新增/删除/重构功能、修改数据模型、新增API、调整定时任务、修改Bot角色等),必须将变更内容同步写入 Knowledge Graph Memory
|
||||
- **同步范围**:
|
||||
- 新增/修改/删除数据模型 → 更新 `数据模型-核心` 或 `数据模型-Bot系统` 实体
|
||||
- 新增/修改/删除 API 端点 → 更新对应 `API-*` 实体
|
||||
- 新增/修改/删除定时任务 → 更新对应 `ScheduledTask` 实体
|
||||
- 修改 Bot 角色配置(bot-characters.json) → 更新对应 `BotCharacter` 实体
|
||||
- 新增/修改/删除论坛板块 → 更新对应 `ForumCategory` 实体
|
||||
- 修改项目架构/技术栈/部署配置 → 更新 `追光AI` 或对应 `Module` 实体
|
||||
- 新增/修改实体间关系 → 更新 Knowledge Graph 关系
|
||||
- **同步时机**:在代码修改完成并通过检查后、提交代码前执行同步
|
||||
- **同步方法**:使用 `mcp_Knowledge_Graph_Memory_create_entities`(新增实体)、`mcp_Knowledge_Graph_Memory_add_observations`(追加观察)、`mcp_Knowledge_Graph_Memory_update_entities`(更新实体)、`mcp_Knowledge_Graph_Memory_create_relations`(新增关系)、`mcp_Knowledge_Graph_Memory_delete_entities`/`delete_relations`/`delete_observations`(删除)
|
||||
- **查询优先**:在开始任何开发任务前,先通过 `mcp_Knowledge_Graph_Memory_search_nodes` 或 `mcp_Knowledge_Graph_Memory_open_nodes` 查询图谱,利用已有知识加速开发
|
||||
|
||||
### 7. 可靠性原则
|
||||
- 所有外部 API 调用(GitHub、DeepSeek 等)必须设置超时和重试
|
||||
- OpenAI/DeepSeek 客户端配置:`timeout: 120000`, `maxRetries: 2`
|
||||
|
||||
Reference in New Issue
Block a user