🔴 事故根因: K8s Secrets 未注入,Telegram 告警長時間失效 - kustomization.yaml 說「由 CI/CD 處理」但 CD 從未執行 🛡️ 三層防護機制: - Layer 1: Pre-flight 檢查 GitHub Secrets 存在 - Layer 2: Deploy 時 kubectl patch secret 自動注入 - Layer 3: Post-Deploy E2E 測試告警驗證 📄 文件更新: - ADR-035: docs/adr/ADR-035-telegram-alert-chain-enforcement.md - DevOps Skill v1.9: 新增 Secrets 注入鐵律 - CLAUDE.md: 新增告警鏈路章節 - LOGBOOK: 事故記錄 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
7.0 KiB
7.0 KiB
ADR-035: Telegram 告警鏈路強制驗證
狀態: 已批准 建立日期: 2026-03-29 (台北時間) 建立者: Claude Code (首席架構師) 觸發事故: 2026-03-29 Telegram 告警失效 (K8s Secrets 未注入)
1. 問題背景
1.1 事故時間線
| 日期 | 事件 | 影響 |
|---|---|---|
| 2026-03-23 | Telegram Token 災難 (logOut) | Token 永久失效 |
| 2026-03-26 | Alertmanager 路徑錯誤 | 2 天無告警 |
| 2026-03-29 | K8s Secrets 未注入 | 長時間無告警 |
1.2 根本原因
-
CD workflow 未自動注入 K8s Secrets
kustomization.yaml註釋說「secrets 由 CI/CD 單獨處理」- 但 CD 實際上沒有處理
- 導致
OPENCLAW_TG_BOT_TOKEN保持為模板值"CHANGE_ME"
-
缺乏 E2E 驗證機制
- 部署後沒有驗證告警鏈路是否正常
- 問題可能數天後才被發現
-
Memory 鐵律未完整執行
- 已有
feedback_alertchain_e2e_validation.md記錄 - 但 CD workflow 沒有實際實施驗證
- 已有
2. 決策
2.1 CD Secrets 自動注入 (強制)
每次部署 必須 同步 K8s Secrets:
- name: "Sync K8s Secrets (ADR-035)"
run: |
kubectl patch secret awoooi-secrets -n awoooi-prod --type='merge' -p="{
\"stringData\": {
\"OPENCLAW_TG_BOT_TOKEN\": \"${{ secrets.OPENCLAW_TG_BOT_TOKEN }}\",
\"OPENCLAW_TG_CHAT_ID\": \"${{ secrets.OPENCLAW_TG_CHAT_ID }}\"
}
}"
2.2 Pre-flight Secrets 檢查 (強制)
部署前 必須 驗證 Telegram Secrets 存在:
- name: "Check Required Secrets"
run: |
if [ -z "${{ secrets.OPENCLAW_TG_BOT_TOKEN }}" ]; then
echo "❌ 缺少 OPENCLAW_TG_BOT_TOKEN"
exit 1
fi
2.3 部署後 E2E 驗證 (強制)
部署完成後 必須 發送測試告警驗證:
- name: "Verify Telegram Alert Chain (ADR-035)"
run: |
# 發送測試告警
# 驗證 API 回應 success: true
# 失敗則直接發送告警到 Telegram
3. 實施檢查清單
3.1 CD Workflow 修改
| 項目 | 狀態 | 檔案 |
|---|---|---|
| Pre-flight Secrets 檢查 | ✅ | .github/workflows/cd.yaml |
| K8s Secrets 自動注入 | ✅ | .github/workflows/cd.yaml |
| 部署後 E2E 驗證 | ✅ | .github/workflows/cd.yaml |
3.2 GitHub Secrets 必要項目
| Secret 名稱 | 用途 | 必須 |
|---|---|---|
OPENCLAW_TG_BOT_TOKEN |
Telegram Bot Token | 🔴 是 |
OPENCLAW_TG_CHAT_ID |
Telegram Chat ID | 🔴 是 |
DATABASE_URL |
PostgreSQL 連線 | 🔴 是 |
REDIS_URL |
Redis 連線 | 🔴 是 |
SENTRY_DSN |
Sentry 錯誤追蹤 | 🟡 建議 |
3.3 Memory/文檔更新
| 項目 | 狀態 | 檔案 |
|---|---|---|
| ADR-035 | ✅ | docs/adr/ADR-035-*.md |
| Feedback Memory | ✅ | feedback_telegram_secrets_injection.md |
| CLAUDE.md 規則 | ✅ | CLAUDE.md |
| Skills 更新 | ✅ | .agents/skills/04-awoooi-devops-commander.md |
4. 防止再次發生
4.1 自動化防護層
┌─────────────────────────────────────────────────────────────────┐
│ 告警鏈路防護機制 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Layer 1: Pre-flight │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ GitHub Secrets 存在性檢查 │ │
│ │ - OPENCLAW_TG_BOT_TOKEN 必須存在 │ │
│ │ - 缺少則 CI 失敗 (exit 1) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Layer 2: Deploy │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ K8s Secrets 自動注入 │ │
│ │ - 每次部署都 patch secret │ │
│ │ - 確保 Token 永遠是最新的 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Layer 3: Post-Deploy │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ E2E 驗證 (實際發送測試告警) │ │
│ │ - 發送測試告警到 API │ │
│ │ - 驗證回應 success: true │ │
│ │ - 失敗則繞過 API 直接告警 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
4.2 Claude Code 強制規則
修改 CLAUDE.md 或 CD workflow 時 必須:
- 確保
Sync K8s Secrets步驟存在 - 確保
Verify Telegram Alert Chain步驟存在 - 確保所有 Telegram Secrets 在 Pre-flight 中檢查
5. 相關文件
- feedback_alertchain_e2e_validation.md
- feedback_telegram_token_disaster.md
- feedback_telegram_secrets_injection.md
審查者: 統帥 (待簽核) 生效日期: 2026-03-29