Files
wecom_it_smart_desk/docs/04-运维文档/部署运维/Token多IP异常检测部署指南.md
T
Simon facc04aa65 chore: docs 结构整改 + compose 双目录对齐(合并重建提交)
本提交为 .git 对象库损坏后的重建提交,内容等价于原先三个本地提交
(5e2fd4c2 / 57a53c98 / 5d7e1873)的累积结果,未做任何额外改动。

一、docs 结构整改(整改 #14)
根因:重构时新结构为 untracked 文件,执行 git stash(未带 -u)未纳入,
随后 git reset 拉回 HEAD 旧 tracked 树,导致旧树复活、新旧两棵目录
树并存于 docs/,共 791 文件、双分类体系冲突。

修复动作:
- b2 同名异主题文件改名迁移保全 9 个
- C 类 39 个孤立文件按主题正确归类
- A/B1 类 222 个重复文件删除(新结构已有内容副本)
- 9 个旧独有空目录删除
- 270 处内部引用按 verified 映射改写
- 整改记录 #14 登记于 04-运维文档/部署运维

结果:docs 791 → 569 文件,顶层仅规范 8 类 + 治理文件,单树恢复。
残留:约 20 处指向从未存在文件的陈旧死链,归入独立文档卫生任务。

二、compose 双目录对齐(消除踩坑 A)
- docker-compose.yml:nginx 前端挂载全部由根目录 frontend-*/dist
  改为 src/frontend-*/dist(h5 / agent / admin / terminal)
- docker-compose.dev.yml:dev 服务 build context 与卷同步改 src/
- 效果:本地 docker compose up 不再把根目录 stale dist 挂回,
  与线上一致,分叉隐患消除(已 docker compose config 校验通过)

防复发铁律:
- 重构须提交;仓库修复须 git stash -u 或先 commit
- 新结构须 git add 并提交,避免再次 untracked 复活
- H5 改动只动 src/frontend-h5/,禁改根目录遗留 frontend-*/
2026-08-07 22:31:32 +08:00

247 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Token多IP异常检测 - 部署指南
> **任务ID**: 待分配
> **版本**: v1.0
> **关联文档**:
> - 技术设计-Token多IP异常检测.md
> - Token多IP异常检测测试用例.md
---
## 1. 部署概述
### 1.1 部署范围
| 组件 | 容器 | 说明 |
|------|------|------|
| 检测服务 | backend | Token异常检测定时任务 |
| Redis | redis | IP存储 |
| 告警通道 | 企微机器人 | 复用现有webhook |
### 1.2 部署方式
- **部署类型**: 增量部署(不涉及基础设施变更)
- **停机时间**: 无需停机(定时任务后台运行)
- **回滚**: 代码级别回滚
---
## 2. 部署前检查
### 2.1 环境检查
| 检查项 | 命令 | 预期结果 |
|--------|------|----------|
| Redis连接 | `docker exec backend redis-cli ping` | PONG |
| APScheduler状态 | 检查日志 | 定时任务启动成功 |
| webhook配置 | 检查环境变量 | CONTENT_AUDIT_WEBHOOK已设置 |
### 2.2 配置检查
确认以下环境变量已配置(如需自定义):
```bash
# 可选配置
TOKEN_ANOMALY_THRESHOLD=3 # 触发告警的IP数量阈值
TOKEN_ANOMALY_WINDOW=3600 # 时间窗口(秒)
TOKEN_ANOMALY_AUTO_DISABLE=false # 是否自动禁用Token
```
---
## 3. 部署步骤
### 3.1 步骤1:代码变更
**新增文件**
```
backend/app/tasks/token_anomaly_detection.py (新建)
```
**修改文件**
```
backend/app/services/token_service.py (增加record_token_ip方法)
backend/app/main.py (注册定时任务)
```
### 3.2 步骤2:配置变更
`.env` 或 docker-compose.yml 中添加(可选):
```bash
# 如需自定义阈值,在 .env 中添加
TOKEN_ANOMALY_THRESHOLD=3
TOKEN_ANOMALY_AUTO_DISABLE=false
```
### 3.3 步骤3:重启服务
```bash
# 重启backend容器(不中断其他服务)
docker compose restart backend
# 查看日志确认定时任务启动
docker logs backend --tail 50 | grep -i "token"
```
预期日志:
```
✅ Token多IP异常检测任务已启动(每60秒执行一次)
```
---
## 4. 部署后验证
### 4.1 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|----------|
| 定时任务运行 | 查看日志 | 每分钟执行一次 |
| IP记录 | 模拟API请求 | Redis中记录IP |
| 告警触发 | 构造3个IP的Token | 企微收到告警 |
### 4.2 冒烟测试
执行测试用例:
```bash
# 进入backend容器
docker exec -it backend bash
# 运行单元测试
pytest app/tests/test_token_anomaly.py -v
```
---
## 5. 监控与运维
### 5.1 日志位置
| 日志类型 | 路径 |
|----------|------|
| 应用日志 | `/app/logs/wecom-it-desk.log` |
| 定时任务日志 | 集成在应用日志中 |
### 5.2 监控指标
| 指标 | 说明 |
|------|------|
| token_anomaly_triggered_total | 触发告警次数 |
| token_anomaly_false_positive | 误报次数 |
### 5.3 运维命令
```bash
# 查看定时任务状态
docker exec backend python -c "from app.main import _scheduler; print(_scheduler.get_jobs())"
# 手动触发检测(调试)
docker exec backend python -c "
import asyncio
from app.tasks.token_anomaly_detection import detect_token_anomaly
asyncio.run(detect_token_anomaly())
"
```
---
## 6. 回滚方案
### 6.1 回滚步骤
```bash
# 1. 撤销代码变更
git checkout -- backend/app/services/token_service.py
git checkout -- backend/app/main.py
git rm backend/app/tasks/token_anomaly_detection.py
# 2. 重启服务
docker compose restart backend
```
### 6.2 数据清理
```bash
# 清理Redis中的检测数据(可选,1小时后自动过期)
docker exec backend redis-cli KEYS "token_ips:*" | xargs redis-cli DEL
```
---
## 7. 部署清单
| 序号 | 步骤 | 执行人 | 检查人 | 日期 |
|------|------|--------|--------|------|
| 1 | 代码变更 | 开发 | | |
| 2 | 配置检查 | 开发 | | |
| 3 | 重启服务 | 运维 | | |
| 4 | 功能验证 | 测试 | | |
| 5 | 冒烟测试 | 测试 | | |
| 6 | 监控确认 | 运维 | | |
---
## 8. 附录
### 8.1 相关文件
| 文件路径 | 说明 |
|----------|------|
| `backend/app/tasks/token_anomaly_detection.py` | 检测任务 |
| `backend/app/services/token_service.py` | Token服务 |
| `docs/04-运维文档/部署运维/技术设计-Token多IP异常检测.md` | 技术设计 |
### 8.2 环境变量参考
| 变量 | 必需 | 默认值 | 说明 |
|------|------|--------|------|
| CONTENT_AUDIT_WEBHOOK | 是 | - | 企微机器人webhook |
| TOKEN_ANOMALY_THRESHOLD | 否 | 3 | 告警阈值 |
| TOKEN_ANOMALY_AUTO_DISABLE | 否 | false | 自动禁用 |
---
## 9. 部署测试结果(2026-07-14
### 9.1 部署清单
| 序号 | 步骤 | 执行人 | 检查人 | 日期 | 结果 |
|------|------|--------|--------|------|------|
| 1 | 代码变更 | 开发 | | 2026-07-14 | ✅ 完成 |
| 2 | 配置检查 | 开发 | | 2026-07-14 | ✅ 完成 |
| 3 | 重启服务 | 运维 | | 2026-07-14 | ✅ 完成 |
| 4 | 功能验证 | 测试 | | 2026-07-14 | ✅ 通过 |
| 5 | 冒烟测试 | 测试 | | 2026-07-14 | ✅ 通过 |
| 6 | 监控确认 | 运维 | | 2026-07-14 | ✅ 完成 |
### 9.2 功能测试结果
| 用例ID | 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|--------|-----------|-----------|------|
| T001 | 创建测试数据 | Redis中记录3个IP | ✅ token_ip:ed733a26239b8f18 = 3个IP | ✅ 通过 |
| T002 | 触发检测 | 检测到异常并告警 | ✅ 检测到 token_hash=ed733a26239b8f18, ip_count=3 | ✅ 通过 |
| T003 | 企微告警 | 发送markdown告警 | ✅ Token异常告警已发送: 1条 | ✅ 通过 |
### 9.3 验证日志
```
检测到Token异常使用: token_hash=ed733a26239b8f18, ip_count=3, ips=['192.168.1.100', '192.168.1.102', '192.168.1.101']
HTTP Request: POST https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=09120612-9d19-4f93-bd00-bfbaef548dde "HTTP/1.1 2
Token异常告警已发送: 1 条
Token异常检测完成: 检测到 1 个异常
```
### 9.4 发现问题与修复
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 告警未发送 | 容器内.env文件路径错误 | 修改config.py的env_file为"/app/app/.env",并复制.env到挂载目录 |
| webhook未配置 | .env未同步到容器 | 复制.env到/app/app/.env |
---
> **编制人**: 威胁检测工程师
> **日期**: 2026-07-14
> **审核人**: 待定