# AWOOOI On-Call 值班手冊（On-Call Handbook）

> **文件類型**: 值班操作手冊  
> **版本**: v1.0  
> **建立日期**: 2026-04-14（台北時間）  
> **建立者**: Claude Sonnet 4.6（首席架構師）  
> **適用對象**: 統帥（首席）+ 未來 SRE 成員  
> **相依文件**: `HUMAN-IN-THE-LOOP.md`、`SLO-SLI-DEFINITION.md`、`ALERT-TAXONOMY-CATALOG.md`

---

## 0. 哲學：你是機長，AI 是副駕駛

> **AI 永遠可以被覆蓋，你永遠是最後決策者。**

AWOOOI AIOps 系統設計為：
- **日常 P2/P3 告警** → AI 自動處理，你只需監控 Telegram 通知
- **P0/P1 高風險告警** → AI 分析後送審，你做最終決定
- **系統失控時** → Kill Switch 一鍵凍結所有自動操作

**值班的目標不是盯著告警，而是確保飛輪轉得順。**

---

## 1. 值班前準備（Shift Start Checklist）

每天（建議 08:00 台北時間）執行：

```bash
# 1. 確認系統健康
curl -s http://192.168.0.188:8000/health | python3 -m json.tool

# 2. 確認 Alertmanager 正常
curl -s http://192.168.0.110:9093/api/v1/status

# 3. 確認昨日 SLO 數字
curl -s http://192.168.0.188:8000/api/v1/slo/dashboard

# 4. 確認 AI 模型可用
curl -s http://192.168.0.111:11434/api/tags | python3 -c "import json,sys; [print(m['name']) for m in json.load(sys.stdin)['models']]"

# 5. 看 Telegram #awoooi-alerts 頻道最近 12 小時的告警
```

**每日晨報**: AIOps 系統於 08:00 台北時間自動發送前 24 小時摘要至 Telegram

---

## 2. 告警分級處理矩陣

### 告警嚴重度 → 處理方式

| 嚴重度 | P0 (CRITICAL) | P1 (HIGH) | P2 (MEDIUM) | P3 (LOW) |
|--------|--------------|-----------|-------------|----------|
| **AI 處理** | 分析 + 送審 | 分析 + 送審 | 自動執行 | 自動執行 |
| **你的角色** | 必須審核 | 必須審核 | 監控結果 | 可忽略 |
| **SLA** | 15 分鐘內 | 30 分鐘內 | 無強制 | 無強制 |
| **若超時** | 自動升級通知 | 自動升級通知 | 自動重試 | 自動記錄 |

### Telegram 卡片類型 → 你需要做什麼

| 卡片類型 | 外觀特徵 | 你的動作 |
|---------|---------|---------|
| **TYPE-1** INFO | `💚 INFO` 開頭 | 無需動作，系統已自動記錄 |
| **TYPE-2** AUTO | `⚡ AUTO REPAIR` | 觀察後續 RESULT 卡片即可 |
| **TYPE-3** REVIEW | `🔴 NEEDS REVIEW` + 按鈕 | **必須點擊 APPROVE 或 REJECT** |
| **TYPE-4** WAIT | `⏸️ WAITING` | 人工評估後決定要不要手動修復 |
| **TYPE-8M** SLO | `📊 SLO ALERT` | 評估是否暫停自動修復 |

---

## 3. 高頻場景 SOP

### 3.1 Pod CrashLoopBackOff

**Telegram 卡片**: TYPE-2 或 TYPE-3（視 P 等級）

自動修復路徑（AI 已執行）:
```bash
kubectl rollout restart deployment/{name} -n {namespace}
```

若自動修復失敗，手動 SOP：
```bash
# 1. 查看 Pod 日誌
kubectl logs {pod-name} -n {namespace} --previous --tail=100

# 2. 確認 Pod 狀態
kubectl describe pod {pod-name} -n {namespace}

# 3. 手動重啟
kubectl rollout restart deployment/{name} -n {namespace}

# 4. 確認恢復
kubectl rollout status deployment/{name} -n {namespace}
```

---

### 3.2 MinIO 下線（或其他 188 主機上的 Docker 服務）

**Telegram 卡片**: TYPE-3（P1，需審核）

AI 建議的 SSH 修復：
```bash
ssh 192.168.0.188 'docker restart minio'
# 或
ssh 192.168.0.188 'docker ps | grep minio'  # 先確認狀態
```

手動 SOP：
```bash
# 1. 確認 188 主機可達
ping 192.168.0.188

# 2. SSH 進入主機
ssh 192.168.0.188

# 3. 確認容器狀態
docker ps -a | grep minio

# 4. 重啟容器
docker restart minio

# 5. 確認恢復
docker logs minio --tail=20
curl -s http://localhost:9000/minio/health/live
```

⚠️ **禁止**: `systemctl restart docker`（會殺死 Gitea 等所有容器）

---

### 3.3 PostgreSQL 下線

**Telegram 卡片**: TYPE-3（CRITICAL，必須審核）

AI 會建議 kubectl rollout restart，但必須先確認：

```bash
# 1. 確認是服務問題還是 Pod 問題
kubectl get pods -n awoooi-prod | grep postgres

# 2. 若 Pod 崩潰 → 重啟
kubectl rollout restart deployment/postgresql -n awoooi-prod

# 3. 若 PVC 問題 → 不可自動處理，聯絡統帥
kubectl describe pvc postgres-pvc -n awoooi-prod

# 4. 確認 DB 可用
kubectl exec -n awoooi-prod deployment/postgresql -- psql -U postgres -c 'SELECT 1;'
```

**資料風險提示**: PostgreSQL 問題涉及持久化資料，`kubectl delete pvc` 被系統永久阻擋

---

### 3.4 告警鏈路斷裂（NoAlertsReceived2Hours）

這是最嚴重的情況：**你看不到告警 = 系統失明**

```bash
# 1. 確認 Alertmanager
curl http://192.168.0.110:9093/api/v1/status
curl http://192.168.0.110:9093/api/v1/alerts

# 2. 確認 AWOOOI API
curl http://192.168.0.188:8000/webhooks/test

# 3. 確認 Watchdog 心跳
# Watchdog 每分鐘送一個告警，若 2 小時沒收到 → 觸發此規則

# 4. 手動測試告警鏈路
curl -X POST http://192.168.0.110:9093/api/v1/alerts \
  -H 'Content-Type: application/json' \
  -d '[{"labels":{"alertname":"ManualTest","severity":"info"},"annotations":{"summary":"Manual test"}}]'
```

---

### 3.5 HostHighCpuLoad

**Telegram 卡片**: TYPE-1（INFO，系統自動記錄）

通常不需動作。若持續 > 30 分鐘：

```bash
# 確認高耗 CPU 程序
ssh 192.168.0.{110/120/121/188} 'top -bn1 | head -20'

# 若是 Ollama 模型推理（正常，等它結束）
ssh 192.168.0.188 'ps aux | grep ollama'
```

---

### 3.6 SSL 憑證到期告警

**Telegram 卡片**: TYPE-1（INFO）

```bash
# 確認哪個憑證快到期
# 通常是 Let's Encrypt 憑證需要 renew

# 若在 K8s 中由 cert-manager 管理
kubectl get certificates -A
kubectl describe certificate {cert-name} -n {namespace}

# 手動 renew（若 cert-manager 沒自動處理）
kubectl delete secret {tls-secret-name} -n {namespace}  # 觸發重新申請
```

---

## 4. 審核決策指南（APPROVE / REJECT）

在 Telegram 收到 TYPE-3 審核卡時：

### 應 APPROVE 的情況

- AI 信心度 > 0.80，且 kubectl 指令是 `rollout restart` / `scale --replicas>0`
- 你已確認症狀與 AI 診斷吻合
- 修復操作是可回滾的（rollout restart 可 rollout undo）
- 這是已知的重複故障，上次 Playbook 記錄過

### 應 REJECT 的情況

- AI 信心度 < 0.65（系統通常會標記 LOW CONFIDENCE）
- kubectl 指令包含不熟悉的資源名稱（可能是 LLM 幻覺）
- 時機不對（業務高峰期，即使必要也要評估）
- 你懷疑這是誤報

### REJECT 後手動 SOP

```bash
# 1. 確認實際狀態
kubectl get pods -n {namespace}
kubectl logs {pod-name} -n {namespace} --tail=50

# 2. 若確認需要修復，手動執行
{manual command}

# 3. 在 Telegram 回覆告知已手動處理
```

---

## 5. Kill Switch — 緊急凍結

當你判斷 AI 系統行為異常（瘋狂重啟、錯誤修復），立即啟動：

```bash
# 方法 1：API Kill Switch（推薦）
curl -X POST http://192.168.0.188:8000/api/v1/kill-switch \
  -H 'Authorization: Bearer {ADMIN_TOKEN}' \
  -d '{"reason": "異常行為觀察到，手動凍結"}'

# 方法 2：直接修改 ConfigMap
kubectl set env deployment/awoooi-api AUTO_REPAIR_ENABLED=false -n awoooi-prod
kubectl rollout restart deployment/awoooi-api -n awoooi-prod
```

**Kill Switch 效果**: 所有 auto_repair 自動執行停止；TYPE-3 卡片不再自動批准；仍可手動操作

**重新啟動 Kill Switch**:
```bash
curl -X DELETE http://192.168.0.188:8000/api/v1/kill-switch \
  -H 'Authorization: Bearer {ADMIN_TOKEN}'
```

---

## 6. SLO 監控與應對

### SLO 儀表板

```bash
curl -s http://192.168.0.188:8000/api/v1/slo/dashboard | python3 -m json.tool
```

### SLO 閾值與應對

| SLO | 指標 | 目標 | 警戒線 | 緊急線 | 應對 |
|-----|------|------|--------|--------|------|
| SLO-1 | 自動修復成功率（7天）| ≥ 80% | < 80% | < 50% | HITL-8：評估暫停自動修復 |
| SLO-2 | 告警分析延遲 P95 | < 20s | > 20s | > 30s | 檢查 LLM / 切 Expert System |
| SLO-3 | 決策引擎可用性 | ≥ 95% | < 95% | < 80% | 確認 Ollama + Gemini 狀態 |
| SLO-4 | 未解決 P0/P1 逾時 | 0 件 | > 0 | > 2 | 立即介入 |

### SLO-1 下降處理

若 SLO-1 < 80%：
1. 分析最近失敗的修復：`SELECT * FROM approval_requests WHERE execution_success=false ORDER BY created_at DESC LIMIT 20;`
2. 確認是新類型告警（知識庫沒有）還是已知告警修復失敗
3. 若是系統性問題 → 暫停自動修復，人工介入
4. 更新 `docs/postmortems/` 記錄分析結果

---

## 7. 常用指令速查

### Kubernetes

```bash
# 查看所有 Pod 狀態
kubectl get pods -n awoooi-prod

# 查看 Pod 日誌（最近 100 行）
kubectl logs {pod-name} -n awoooi-prod --tail=100

# 查看 Pod 日誌（上一個 Pod，崩潰後）
kubectl logs {pod-name} -n awoooi-prod --previous --tail=100

# 重啟 Deployment
kubectl rollout restart deployment/{name} -n awoooi-prod

# 查看 Deployment 狀態
kubectl rollout status deployment/{name} -n awoooi-prod

# 查看節點狀態
kubectl get nodes -o wide

# 查看所有資源
kubectl get all -n awoooi-prod
```

### Docker（188 主機）

```bash
# SSH 進入 188
ssh 192.168.0.188

# 查看所有容器
docker ps -a

# 重啟特定容器
docker restart {container_name}

# 查看容器日誌
docker logs {container_name} --tail=100 -f

# 查看容器狀態
docker inspect {container_name} | python3 -m json.tool
```

### AIOps API

```bash
# 系統健康
curl http://192.168.0.188:8000/health

# 最近 Incident 列表
curl http://192.168.0.188:8000/api/v1/incidents?limit=20

# SLO 儀表板
curl http://192.168.0.188:8000/api/v1/slo/dashboard

# 知識庫搜尋
curl "http://192.168.0.188:8000/api/v1/knowledge?q=minio+restart"
```

---

## 8. 主機快速參考

| 主機 | IP | 主要服務 | SSH |
|------|-----|---------|-----|
| 主控節點 | 192.168.0.110 | K3s Master, Prometheus, Alertmanager | `ssh 192.168.0.110` |
| 工作節點-1 | 192.168.0.120 | K3s Worker | `ssh 192.168.0.120` |
| 工作節點-2 | 192.168.0.121 | K3s Worker, Kali | `ssh 192.168.0.121` |
| AI 主機 | 192.168.0.188 | Ollama, Harbor, Gitea, MinIO, AWOOOI | `ssh 192.168.0.188` |

詳細 Port 分配 → [reference_four_hosts.md](~/.claude/projects/-Users-ogt-awoooi/memory/reference_four_hosts.md)

---

## 9. 升級聯絡矩陣

> 目前系統為統帥單人值班；未來擴展 SRE 團隊時使用

| 情況 | 聯絡對象 | 方式 | 優先度 |
|------|---------|------|--------|
| P0 持續 > 15min | 統帥 | Telegram 直接訊息 | 立即 |
| SLO-1 < 50% | 統帥 | Telegram #awoooi-alerts | 15min 內 |
| Kill Switch 啟動 | 統帥 | Telegram 直接訊息 | 立即 |
| 疑似資安事件 | 統帥 | 電話 | 立即 |

---

## 10. 值班後交接（Shift End Checklist）

```
□ 所有 TYPE-3 卡片已處理（APPROVE/REJECT）
□ 未解決 Incident 已記錄在 LOGBOOK.md
□ SLO-1 在 80% 以上（若低於 80% 記錄原因）
□ 若觸發了 Kill Switch，已確認原因並重啟或記錄保持凍結的理由
□ 有意義的新故障 → 撰寫 Postmortem（使用 docs/templates/POSTMORTEM-TEMPLATE.md）
□ 更新 docs/LOGBOOK.md 今日條目
```

---

## 附錄 A：事件等級速查

| 等級 | Severity | 定義 | 典型案例 |
|------|---------|------|---------|
| P0 | CRITICAL | 服務完全中斷，用戶無法使用 | DB 下線、K8s 節點故障 |
| P1 | HIGH | 核心功能受損，影響大多數用戶 | MinIO 下線、OpenClaw 下線 |
| P2 | MEDIUM | 部分功能受影響，有降級措施 | Pod CrashLoop、SSL 到期 |
| P3 | LOW | 輕微問題，無直接用戶影響 | CPU 高負載、備份失敗 |

---

## 附錄 B：相關文件索引

| 文件 | 路徑 | 說明 |
|------|------|------|
| HITL 規格書 | `docs/operations/HUMAN-IN-THE-LOOP.md` | 人工介入完整規格 |
| SLO 定義 | `docs/slo/SLO-SLI-DEFINITION.md` | SLO/SLI 量化定義 |
| 告警目錄 | `docs/reference/ALERT-TAXONOMY-CATALOG.md` | 告警分類完整列表 |
| 事後分析模板 | `docs/templates/POSTMORTEM-TEMPLATE.md` | Postmortem 標準格式 |
| AI 模型卡片 | `docs/ai/AI-MODEL-CARDS.md` | 各 AI 模型治理規格 |
| 服務端點 | `docs/reference/SERVICE-ENDPOINTS.md` | 所有服務 URL/Port |
| K3s 優化手冊 | `docs/runbooks/K3S-OPTIMIZATION-RUNBOOK.md` | 節點調優 SOP |
| 飛輪鐵律 | `memory/feedback_auto_repair_flywheel_v2.md` | ADR-068 五根因鐵律 |

---

*本文件由 Claude Sonnet 4.6 於 2026-04-14 台北時間建立*
