# Ops Assistant 独立项目 v1 方案 ## 目标 把高频运维动作做成**固定命令 + 固定流水线**,AI 只负责解释,不参与关键执行决策。 --- ## v1 范围(先做) 优先只落地 **CPA 管理中枢**: 1. 固定命令入口(Telegram/QQ/飞书统一) 2. Runbook(YAML)确定性执行器 3. 审计日志(步骤级) 4. 高风险能力默认关闭(Feature Flag) 后续再扩展:Cloudflare DNS、邮箱转发。 --- ## 目录结构(新增) ```text ops-assistant/ ├── internal/ │ ├── core/ │ │ ├── command/ # 命令解析 │ │ ├── registry/ # 命令注册与路由 │ │ ├── runbook/ # runbook 结构、执行器、锁、target 解析 │ │ └── ops/ # ops 服务编排、重试 │ └── module/ │ └── cpa/ # CPA 模块命令与高风险闸门 ├── runbooks/ │ ├── cpa_status.yaml │ ├── cpa_usage_backup.yaml │ └── cpa_usage_restore.yaml └── docs/ └── ops-assistant-v1.md ``` --- ## 命令清单(v1) - `/cpa status` - `/cpa usage backup` - `/cpa usage restore ` - `/cpa codex clean` - `/cpa codex test` - `/cpa codex isolate` ### 约束 - 仅允许上述命令(严格白名单) - 每个命令映射到唯一 runbook - 不支持自由 shell 指令输入 --- ## Runbook DSL(v1) 仅支持这些动作: - `ssh.exec`:远程执行固定命令 - `http.get` / `http.post`:调用固定接口 - `file.upload`:上传压缩包到 staging - `file.extract`:解压到 staging - `assert.json`:断言字段值 - `sleep`:延迟 每个步骤必须有: - `id` - `action` - `on_fail`(`stop` | `continue`) 所有变量只能来自: - `inputs.*`(命令参数) - `env.*`(服务端配置) - `steps..output.*`(前置步骤输出) --- ## 审计与可追溯 建议新增两张表: ### 1) `ops_jobs` - `id` - `command` - `runbook` - `operator_id` - `status`(pending/running/success/failed) - `started_at` - `ended_at` ### 2) `ops_job_steps` - `id` - `job_id` - `step_id` - `action` - `status` - `rc` - `stdout_tail` - `stderr_tail` - `started_at` - `ended_at` > 所有 Bot 命令回执都返回 `job_id`,便于追踪。 --- ## 风险控制 - 默认 `dry-run=true`(先演练) - 高风险步骤(restore/import)必须: - 双确认(命令 + confirm token) - feature flag 开启才允许执行 - 审计日志不写明文 secrets - 全部 secrets 走现有 `channel` 加密机制存储 --- ## 与现有系统的集成点(独立项目并存) 1. **Bot 层**:在 Telegram/QQ/飞书消息处理中增加 `/cpa` 命令分流 2. **Web 层**:新增 `/ops` 页面查看任务状态与步骤日志 3. **模型层**:新增 `ops_jobs` / `ops_job_steps` 4. **配置层**:增加 `ops.targets`(如 hwsg/wjynl) --- ## 阶段性进度汇报原则(必须遵守) **模板(四要素)** 1) 阶段名(设计/实现/自测/上线等) 2) 已执行动作(具体到做了什么) 3) 可验证证据(日志、产物路径、返回码、截图等) 4) 下一步与前置条件(还差什么、需谁确认) **硬规则** - 无证据不使用“完成/已执行/进行中”等措辞 - 遇到卡点必须立即说明:卡点 + 原因 + 需要的唯一输入 - 先清单后执行的任务,未确认不得执行 --- ## 事故复盘(2026-03-13,CF DNS Runbook) 详见:`docs/cf-dns-runbook-incident-20260313.md` 要点摘要: - 认证方式误判(API Token 被当作 API Key)。 - heredoc/转义在 ssh.exec 中导致脚本未执行。 - 最终采用 base64 + python3 -c exec 稳定执行。 - 强化“阶段性汇报必须带证据”的纪律。 --- ## 验收标准(v1) 1. `/cpa status` 能返回结构化结果(非自由文本) 2. `/cpa usage backup` 能输出:备份路径 + sha256 + usage 快照 3. `/cpa usage restore ` 支持双校验(立即 + 延迟) 4. 任一步骤失败时可追溯到具体 step 日志 5. 未授权命令必须被拒绝并记录审计 --- ## 当前已落地(2026-03-10) 1. 已打通命令入口:Telegram / QQ / 飞书 2. 已支持命令: - `/cpa status` - `/cpa usage backup` - `/cpa usage restore ` 3. 已提供查询接口: - `GET /api/v1/ops/jobs` - `GET /api/v1/ops/jobs/:id`(含 steps) 4. `assert.json` 已支持真实 JSON 路径断言 5. 已增加安全闸门: - `allow_ops_restore` feature flag(默认 false) - restore 需要 `--confirm YES_RESTORE` - 支持 `--dry-run` 6. 已支持 `ops_targets` 目标主机表(优先解析 target 名称) ## 当前 Core 强化(2026-03-10 第二阶段) 1. 同 target 串行锁(避免并发覆盖) 2. 作业元信息增强:`target/risk_level/request_id/confirm_hash` 3. 统一错误码前缀(如 `ERR_FEATURE_DISABLED` / `ERR_CONFIRM_REQUIRED` / `ERR_STEP_FAILED`) 4. step 超时控制(默认 45s) 5. 任务取消接口:`POST /api/v1/ops/jobs/:id/cancel` ## 下一步落地建议 1. 为取消操作增加权限细分(`ops.cancel`) 2. 增加 job 重试接口(仅失败任务可重试) 3. 增加步骤级超时配置(runbook 可覆盖) 4. 增加 Cloudflare / Mail 模块(在 Core 验收完成后)