# 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 临时回滚 ```bash # 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 收集证据 ```bash # 后端日志 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 分析 ```markdown # 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`: ```markdown # 事故报告: {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: ```bash 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 |