Files
wecom_it_smart_desk/docs/SOPs/SOP-004-应急响应.md
T
Simon 64d6812ec3 fix: P0遗留修复 + ADR/SOP文档
- requirements.txt: 添加 passlib[bcrypt] 依赖
- deploy-server/nginx.conf: /ws/ 路径添加 access_log off
- docs/ADRs/: 新增 4 个 ADR 决策记录
- docs/SOPs/: 新增 4 个 SOP 操作规程
2026-06-15 00:03:11 +08:00

4.5 KiB

SOP-004: 应急响应标准作业流程

适用: P0 漏洞 / 数据丢失 / 服务中断 / 安全事件 响应时间: 5 分钟响应 + 30 分钟止血 + 24 小时根因 关联: 风险跟踪表 / CONTRIBUTING §紧急修复


1. 事件分级

等级 场景 响应时间
🔴 P0 紧急 P0 鉴权漏洞 + 数据泄露 + 服务全停 5 min
🟠 P1 高 P1 功能故障 + 单服务降级 30 min
🟡 P2 中 P2 性能 / UI 问题 4 h
🟢 P3 低 体验优化 1 周

2. P0 应急流程(5 min 响应)

2.1 立即止血

  1. 服务降级:
    • 关闭外网访问:sudo iptables -A INPUT -p tcp --dport 8418 -j DROP
    • 或:套件中心停 Gitea
    • 或:Nginx deny all;
  2. 停可疑服务:
    • 停后端:docker compose stop backend
    • 停 WebSocket:docker compose stop nginx(整体停)
  3. 保留现场:
    • 不删任何文件
    • 复制 log 到 /tmp/incident-{timestamp}/
    • 截图

2.2 通知

  1. 微信 / 电话通知项目负责人 宋献
  2. 邮件群发:wecom-it-desk-incident@servyou-it.com
  3. 建应急群

2.3 临时回滚

# 1. 找上一个稳定版本
git tag -l  # 看 release tag
git log --oneline -20  # 看 commit 历史

# 2. 回滚到上一个 commit
git revert HEAD  # 生成新 commit 撤销
# 或
git reset --hard HEAD~1  # 强回滚(慎用)

# 3. 强推(临时,需 admin 权限)
git push -f origin main

3. 根因分析(24h 内)

3.1 收集证据

# 后端日志
docker logs backend --tail 1000 > /tmp/incident/backend.log

# nginx 错误日志
sudo cat /var/log/nginx/error.log > /tmp/incident/nginx-error.log

# Gitea 日志
sudo synopkg log Gitea > /tmp/incident/gitea.log

3.2 5 Why 分析

# 5 Why 分析

**事件**: 坐席登录无鉴权
**Why 1**: agents.py login() 函数没用 Depends(get_current_*)
**Why 2**: workbuddy 加新端点时没跑 pre-commit-check
**Why 3**: pre-commit-check 不在 git commit hook 里
**Why 4**: 没用 pre-commit 框架(只是脚本)
**Why 5**: 流程规范没强制(评审可跳)

**根因**: 流程规范未自动化
**对策**: 加 pre-commit + Gitea Actions 强制

3.3 写事故报告

docs/事故报告/incident-{date}-{topic}.md:

# 事故报告: {topic}

**日期**: {date}
**等级**: 🔴 P0
**响应人**: {name}
**持续**: X 分钟

## 1. 时序
| 时刻 | 事件 |
|---|---|

## 2. 影响范围
- 用户: X 人受影响
- 数据: 是否泄露
- 服务: 停 X 分钟

## 3. 5 Why 根因
...

## 4. 修复 commit
- {commit-hash}
- {commit-message}

## 5. 防止再发
- [ ] 加 pre-commit hook
- [ ] 加 Gitea Actions 强制
- [ ] 更新风险跟踪表
- [ ] 评审 SOP 更新

4. P1 应急流程(30 min 响应)

4.1 评估

  • 是否影响生产用户?
  • 是否有降级方案?

4.2 止血

  • 单服务降级(关问题服务,其它继续)
  • 临时禁用相关端点(nginx location /api/v1/xxx { return 503; })

4.3 修复

  • hotfix 分支(从 main 拉)
  • PR + 评审 + 合并 + 部署

5. 数据丢失应急

5.1 Gitea 数据丢失

  1. 别再操作 Gitea(避免覆盖)
  2. scripts/backup-gitea.sh --restore latest
  3. 验证:仓 commit 数 / token 列表
  4. 不行:试更早备份

5.2 生产数据库丢失

  1. 立即停所有服务(避免写入)
  2. 看 PostgreSQL 数据目录:/var/lib/postgresql/data
  3. 走 PITR(Point In Time Recovery)
  4. 启用只读模式 + 通知用户

6. 安全事件

6.1 Token 泄露

  1. 立即撤销 token:
    curl -X DELETE -H "Authorization: token $ADMIN_TOKEN" \
      "http://100.85.152.112:8418/api/v1/users/{username}/tokens"
    
  2. 清 wincred 缓存
  3. 创新 token + 配新凭据
  4. 改所有引用旧 token 的脚本/配置
  5. 评审日志:谁访问过 / 推过什么

6.2 入侵检测

  1. auth.log / nginx-access.log / backend.log
  2. 找异常 IP / 时间 / 路径
  3. 封 IP:sudo iptables -A INPUT -s {ip} -j DROP
  4. 改所有密码 / 凭据
  5. 走事件调查流程

7. 通讯模板

7.1 启动应急

【应急启动】{事件简述}
等级: 🔴 P0
影响: {用户/数据/服务}
已开始止血:{动作}
请相关人:{人名} 立即响应
群: {微信群名}

7.2 解决通知

【已解决】{事件简述}
持续: X 分钟
修复: {commit-hash}
根因: {5 Why 结论}
防止再发: {动作}
报告: docs/事故报告/{file}.md

8. 联系

角色 联系人
项目负责人 宋献(企业微信 / 手机)
运维 IT 支持组
NAS / Gitea 群晖技术支持
Tailscale tailscale.com/support