# 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 根本原因 1. **CD workflow 未自動注入 K8s Secrets** - `kustomization.yaml` 註釋說「secrets 由 CI/CD 單獨處理」 - 但 CD 實際上沒有處理 - 導致 `OPENCLAW_TG_BOT_TOKEN` 保持為模板值 `"CHANGE_ME"` 2. **缺乏 E2E 驗證機制** - 部署後沒有驗證告警鏈路是否正常 - 問題可能數天後才被發現 3. **Memory 鐵律未完整執行** - 已有 `feedback_alertchain_e2e_validation.md` 記錄 - 但 CD workflow 沒有實際實施驗證 --- ## 2. 決策 ### 2.1 CD Secrets 自動注入 (強制) 每次部署 **必須** 同步 K8s Secrets: ```yaml - 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 存在: ```yaml - name: "Check Required Secrets" run: | if [ -z "${{ secrets.OPENCLAW_TG_BOT_TOKEN }}" ]; then echo "❌ 缺少 OPENCLAW_TG_BOT_TOKEN" exit 1 fi ``` ### 2.3 部署後 E2E 驗證 (強制) 部署完成後 **必須** 發送測試告警驗證: ```yaml - 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 時 **必須**: 1. 確保 `Sync K8s Secrets` 步驟存在 2. 確保 `Verify Telegram Alert Chain` 步驟存在 3. 確保所有 Telegram Secrets 在 Pre-flight 中檢查 --- ## 5. 相關文件 - [feedback_alertchain_e2e_validation.md](../../.claude/projects/-Users-ogt-awoooi/memory/feedback_alertchain_e2e_validation.md) - [feedback_telegram_token_disaster.md](../../.claude/projects/-Users-ogt-awoooi/memory/feedback_telegram_token_disaster.md) - [feedback_telegram_secrets_injection.md](../../.claude/projects/-Users-ogt-awoooi/memory/feedback_telegram_secrets_injection.md) --- **審查者**: 統帥 (待簽核) **生效日期**: 2026-03-29