Files
awoooi/docs/adr/ADR-035-telegram-alert-chain-enforcement.md
OG T 6a38c0c968 fix(cd): ADR-035 Telegram Secrets 自動注入三層防護
🔴 事故根因: 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>
2026-03-28 21:47:49 +08:00

168 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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