fix(infra): 根治 Harbor Exited(128) Race Condition + harbor-watchdog 常駐自愈

問題根因:
  awoooi-startup-110.sh 在 Harbor 啟動時,第一次 compose up -d 會同時
  啟動所有容器。harbor-core/db/portal 嘗試連 syslog:1514(harbor-log 未就緒),
  失敗後 exit(128),restart:always 重試直到 backoff 放棄。
  即使後來 harbor-log healthy,其他容器已不再重試。

修復 1 — startup-110.sh Harbor 時序(4 Phase 策略):
  Phase 1: 清除所有 Exited Harbor 容器(打破 backoff 死鎖)
  Phase 2: 只啟動 harbor-log
  Phase 3: 等 harbor-log healthy(最多 90s)
  Phase 4: 啟動全組件

修復 2 — harbor-watchdog.service(常駐自愈):
  Type=simple 常駐進程,每 60s 輪詢 http://127.0.0.1:5000/v2/
  不健康 → 等 5s 再確認 → 執行 Phase 1-4 完整修復
  修復重開機時序問題無法覆蓋的「運行中崩潰」場景

Bug Fix:curl -f 會把 HTTP 401 視為失敗(exit 22),
  Harbor /v2/ 正常回傳 401(需認證),改用 curl -s 不加 -f

REBOOT-RECOVERY-SOP.md → v5.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-05 12:13:21 +08:00
parent 53e1ae7ad7
commit 66b12bf9eb
5 changed files with 213 additions and 38 deletions

View File

@@ -1,9 +1,9 @@
# AWOOOI 重開機恢復 SOP
> **版本**: v4.0
> **版本**: v5.0
> **最後更新**: 2026-04-05 下午 (台北時間)
> **更新者**: Claude Code (首席架構師)
> **觸發事件**: Prometheus 規則統一部署 + Sentry 啟動自動化 + Sentry 損壞修復 SOP + 全系統自愈閉環
> **觸發事件**: Harbor Exited(128) Race Condition 根治 + harbor-watchdog 常駐自愈
---
@@ -122,15 +122,36 @@ Git push → Gitea(110:3001)
### 已部署 (2026-04-05)
| 主機 | 腳本 | 部署位置 | systemd service | 狀態 |
|------|------|---------|----------------|------|
| **188** | `awoooi-startup.sh` | `/usr/local/bin/` | `awoooi-startup.service` | ✅ enabled |
| **110** | `awoooi-startup-110.sh` | `/usr/local/bin/` | `awoooi-startup-110.service` | ✅ enabled |
| **120** | K3s 原生 | 系統內建 | `k3s.service` | ✅ enabled |
| **121** | K3s 原生 | 系統內建 | `k3s-agent.service` | ✅ enabled |
| 主機 | 腳本 | 部署位置 | systemd service | 狀態 | 類型 |
|------|------|---------|----------------|------|------|
| **188** | `awoooi-startup.sh` | `/usr/local/bin/` | `awoooi-startup.service` | ✅ enabled | 重開機 oneshot |
| **110** | `awoooi-startup-110.sh` | `/usr/local/bin/` | `awoooi-startup-110.service` | ✅ enabled | 重開機 oneshot |
| **110** | `harbor-watchdog.sh` | `/usr/local/bin/` | `harbor-watchdog.service` | ✅ active | **常駐 watchdog** |
| **120** | K3s 原生 | 系統內建 | `k3s.service` | ✅ enabled | 系統服務 |
| **121** | K3s 原生 | 系統內建 | `k3s-agent.service` | ✅ enabled | 系統服務 |
**本地原始碼**: `scripts/reboot-recovery/`
### harbor-watchdog2026-04-05 新增)
**問題背景**: Harbor 的 Exited (128) Race Condition
- `restart: always` 在 harbor-log 未就緒時不斷重試,最終進入 backoff 放棄
- 即使 harbor-log 後來 healthy其他容器不會自動重試
- 只靠 startup 腳本無法處理**運行中崩潰**的情況
**設計**:
- `Type=simple` 常駐進程(不是 oneshotsystemd 永久監控
- 每 60 秒輪詢 `http://127.0.0.1:5000/v2/`401 = healthy
- 偵測到不健康 → 等 5 秒再確認(避免誤報)→ 執行完整時序修復
- 修復邏輯:清除 Exited 容器 → 只啟動 harbor-log → 等 healthy → 啟動全部
**查看狀態**:
```bash
journalctl -u harbor-watchdog.service -f # 即時 log
systemctl status harbor-watchdog.service # 服務狀態
cat /var/log/harbor-watchdog.log # 持久化 log
```
### 各腳本覆蓋清單
**188 (7 步驟)**:
@@ -142,14 +163,15 @@ Git push → Gitea(110:3001)
- Nginx 啟動
- SignOz + MinIO + aiops-network + OpenClaw
**110 (7 步驟)**:
**110 (7 步驟 + harbor-watchdog 常駐)**:
- Docker BoltDB 損壞偵測與修復
- 孤兒容器清除 (Exited 128)
- Harbor (harbor-log healthy 後啟動全組件)
- Harborharbor-log first 策略Phase 1 清除 → Phase 2 只啟 harbor-log → Phase 3 等 healthy → Phase 4 啟全部)
- Gitea + Langfuse + Monitoring (含 Alertmanager 健康驗證)
- SignOz
- **Gitea Act Runner** (自動清除過期 .runner 配置)
- **Sentry** (/opt/sentry含 PostgreSQL WAL + Redis RDB 損壞自動修復)
- **harbor-watchdog.service** (常駐,每 60s 自動修復)
---
@@ -593,3 +615,4 @@ echo "=== 結果: ${PASS} 通過, ${FAIL} 失敗 ==="
| v2.0 | 2026-04-05 上午 | 188 啟動腳本 + 110 啟動腳本 + Harbor race condition 修復 |
| v3.0 | 2026-04-05 下午 | 完整架構重盤 + Gitea Runner 自動化 + 告警鏈路根因修復 + NetworkPolicy 修正 |
| v4.0 | 2026-04-05 下午 | Prometheus 規則統一部署 (28條) + Sentry startup (Step 7) + Sentry損壞修復SOP + 規則未部署診斷樹 + E2E腳本加入Sentry/Prometheus驗證 |
| v5.0 | 2026-04-05 下午 | Harbor Exited(128) Race Condition 根治startup-110.sh 改用 harbor-log first 策略 + 新增 harbor-watchdog.service 常駐自愈curl -f bug 修正)|