Files
awoooi/docs/runbooks/HOST-188-HYGIENE-MAINTENANCE-RUNBOOK.md

197 lines
10 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.
# 188 Host Hygiene 維護窗口 Runbook
> 版本2026-07-11.v3
> 適用範圍:`192.168.0.188` host PostgreSQL `14/main`、`awoooi-startup.service`、certbot / ACME renewal hygiene。
> 狀態:`HOST_188_HYGIENE_GREEN`
---
## 1. 目的
188 目前的產品服務、public routes 與 host hygiene 均已收斂為 green。這份 runbook 將「服務恢復」、「host hygiene」、「DR escrow」與「Wazuh registry」分開避免把 route `200`、container healthy、`pg_isready`、exporter green 或 `reset-failed` 誤判成其他層級也完成。
本文件記錄 2026-06-26 已完成的 188 host hygiene 修復與後續操作邊界。它不是 DR escrow 完成證明,也不是 Wazuh / SOC runtime action 授權。未取得 owner、rollback owner、maintenance window、backup / restore evidence 與 post-check plan 前,仍不得執行資料層 break-glass、restore、未批准 renew、或其他主機寫入。
---
## 2. 最新只讀證據
2026-07-11 14:55 Asia/Taipei live evidence 取代舊 2026-06-26 baseline
| 層級 | 證據 | 判定 |
|------|------|------|
| Host systemd | `systemctl is-system-running``running`failed units `0 loaded units listed` | host hygiene green |
| 產品容器 | MOMO、VibeWork、2026FIFA、ClawBot、MinIO、exporters、MOMO DB 等容器 healthy / up | 產品服務 green |
| PostgreSQL runtime | `k3s-postgres-recovery` container 為 `Running=true``NetworkMode=host`、restart policy `unless-stopped``pg_isready -h localhost -p 5432` accepting connections | production DB runtime green |
| Host PostgreSQL unit | `/etc/postgresql/14/main/start.conf=manual``postgresql@14-main.service` 為 disabled / inactiverecovery container 同一 data/config mount 仍 accepting connections | 避免 host/container 雙啟動競爭 |
| Startup unit | source/live SHA 為 `d9b099382fbc618280241d398a2a3d2c89f004804ab793c177a25a43505ebe8d`unit SHA 為 `995705578f4ba50f02100f7f60f432fa86d3f37e13aaa6f1d93c1d8685a8cafb`metadata repair、kine write、ClawBot rebuild、188 SignOz 均預設 opt-in | fail-closed 修復完成 |
| Nginx / ACME route | `sentry.wooo.work``gitea.wooo.work``langfuse.wooo.work``signoz.wooo.work` HTTP-01 self-test token 均由 `/var/www/html` 正確回應 | challenge route green |
| certbot timers | duplicate apt `certbot.timer` 已停用snap `snap.certbot.renew.timer` enabled / active / waiting`certbot.service``snap.certbot.renew.service` `Result=success / inactive` | renewal runner hygiene green |
| public cert | `sentry.wooo.work` certificate `notAfter=2026-09-24 13:44:28 UTC`snap renew timer enabled / waiting | certificate readback green |
controlled reconcile receipt`/usr/local/sbin/awoooi-host188-hygiene reconcile``PRODUCT_SERVICE_RESTARTS=0`rollback 為 `/var/lib/awoooi-host188-hygiene/backups/host188-hygiene-20260711T145537+0800-334605-before-reconcile`。獨立 checklist 回 `PASS=17 WARN=1 BLOCKED=0``HOST_HYGIENE_BLOCKED=0`warning 只說明 `pg_lsclusters` 看不到 container-owned PID model不是 DB 不可用。
---
## 3. GO / NO-GO
| Gate | GO 條件 | NO-GO 條件 |
|------|---------|------------|
| 服務層 | MOMO / VibeWork / 2026FIFA / SignOz / public routes 可用 | 產品 route 或 DB 容器同時故障時,先走 incident triage |
| PostgreSQL | DB owner 確認 host `14/main` 是否仍為 authoritative source | 無法確認用途就不得 reset / disable / restore |
| Backup | 有可追溯 backup ref、restore target isolation、rollback owner | 沒有 backup / restore evidence 就不得 `pg_resetwal` 或 restore |
| certbot | DNS / ACME / public gateway owner response acceptedrate-limit 冷卻期明確 | ACME route 未確認、仍被 rate-limit、或缺 rollback owner |
| 維護窗口 | owner、窗口、post-check、operator notification 完整 | 只有「服務看起來綠」或「想清 failed units」 |
---
## 4. PostgreSQL `14/main` 決策樹
1. **先判定用途**
- 是否仍被任何 production service 使用。
- 是否只是舊的 host cluster產品 DB 已由 containerized PostgreSQL 接管。
- 是否仍承載 K3s Kine、MOMO、monitoring、legacy app 或 operator tooling。
2. **若確認 host cluster 已廢棄**
- 準備 owner disposition廢棄原因、affected scope、最後 backup / dump ref、保留期限。
- 維護窗口內才可停用 unit 或調整 startup script 的 host PG dependency。
- 停用後仍需 post-checkpublic routes、MOMO health、SignOz、exporters、backup-status、cold-start。
3. **若確認 host cluster 仍需要保留**
- 先建立隔離 restore target不直接覆蓋 production data directory。
- 先比對 backup / WAL / data directory metadata。
- 只有 DB owner 明確接受資料風險與 rollback plan 後,才可進入 break-glass 修復。
4. **禁止預設路徑**
- 不得直接 `pg_resetwal`
- 不得直接 `rm -rf /var/lib/postgresql/14/main`
- 不得直接 `systemctl reset-failed` 假綠。
- 不得把 container `momo-db` healthy 當成 host `14/main` healthy。
---
## 5. certbot / ACME 決策樹
1. **先停止誤判**
- `certbot.service` failed 目前代表 renewal 未成功,不代表現有憑證立即失效。
- `sentry.wooo.work` cert 仍有效到 `2026-07-09 16:03:40 UTC`
2. **先做 owner evidence**
- domain / SAN / shared certificate coverage ref。
- ACME challenge route owner。
- renewal owner。
- rollback owner。
- validation plan。
3. **維護窗口內才可做**
- `nginx -t`
- ACME challenge route smoke。
- certbot dry-run 或 renew。
- Nginx reload。
4. **禁止事項**
- rate-limit 期間反覆 renew。
- 未確認 challenge route 就 renew。
- 同時保留 apt certbot timer 與 snap certbot timer 的重複失敗狀態。
- 貼出 private key、ACME account key、DNS credential、未脫敏 certbot log。
---
## 6. 維護窗口最小步驟
此段只定義順序;不代表目前已批准執行。
### Phase 0一鍵只讀 preflight
在 repo 工作站先執行只讀 checklist它不會 restart、reload、renew、reset-failed、restore、`pg_resetwal` 或寫入遠端狀態。
```bash
SSH_BATCH_MODE=yes bash scripts/reboot-recovery/188-host-hygiene-maintenance-checklist.sh --no-color
```
目前預期結果是:
```text
SERVICE_GREEN=1
HOST_HYGIENE_BLOCKED=0
RUNTIME_ACTION_AUTHORIZED=0
Result: HOST_188_HYGIENE_GREEN.
```
### Phase A維護前只讀快照
```bash
systemctl --failed --no-pager
pg_lsclusters
systemctl status postgresql@14-main.service --no-pager
systemctl status certbot.service snap.certbot.renew.service --no-pager
docker ps --format '{{.Names}}\t{{.Status}}\t{{.Ports}}'
/backup/scripts/backup-status.sh --no-notify
/home/wooo/scripts/full-stack-cold-start-check.sh --monitor-read-only --no-color --watch --interval 1 --max-attempts 1
```
### Phase Bowner 決策
| 決策 | 必填 evidence |
|------|---------------|
| host PostgreSQL 廢棄 | owner disposition、affected services、last backup ref、retention owner |
| host PostgreSQL restore | source backup ref、isolated restore target、checksum / row-count plan、rollback owner |
| certbot route 修復 | certificate coverage ref、ACME owner、challenge route plan、post-renew validation |
### Phase C受控修復
先安裝固定動作 executor再分開執行 check / reconcile
```bash
scripts/reboot-recovery/bootstrap-host188-hygiene-executor.sh --check
scripts/reboot-recovery/bootstrap-host188-hygiene-executor.sh --apply
ssh ollama@192.168.0.188 'sudo -n /usr/local/sbin/awoooi-host188-hygiene check'
ssh ollama@192.168.0.188 'sudo -n /usr/local/sbin/awoooi-host188-hygiene reconcile'
```
executor 只能安裝 canonical startup source/unit、將 PG start mode 設為 manual、daemon-reload 與 reset stale failed state不能 start/restart/stop 產品、Docker、Nginx 或 PostgreSQL。回滾只允許 `sudo -n /usr/local/sbin/awoooi-host188-hygiene rollback-latest`
### Phase Dpost-check
```bash
systemctl --failed --no-pager
pg_lsclusters
curl -fsS https://mo.wooo.work/health
curl -fsS https://stock.wooo.work/api/v1/system/freshness
curl -fsS https://awoooi.wooo.work/api/v1/health
/backup/scripts/backup-status.sh --no-notify --no-refresh
/home/wooo/scripts/full-stack-cold-start-check.sh --monitor-read-only --no-color --watch --interval 1 --max-attempts 1
```
成功標準:
- 產品 routes 仍綠。
- backup core 仍 `core_blockers=0`
- cold-start 維持 `WARN=0 BLOCKED=0`
- 若 owner 決定 host PG 廢棄systemd failed unit 必須以 owner disposition 收斂,不可只是 reset-failed。
- 若 owner 決定 host PG 修復,必須有 restore / data integrity evidence。
- 若 certbot 修復,必須有 cert notAfter、ACME route、Nginx config test 與 reload evidence。
---
## 7. 目前完成度
| Lane | 完成度 | 說明 |
|------|-------:|------|
| 服務恢復 | `100%` | routes、containers、cold-start、backup core 已 green |
| 188 host hygiene repair | `100%` | startup fail-closed、PostgreSQL runtime-ready 判斷、systemd failed units、ACME route 與 certbot timer hygiene 已收斂 |
| PostgreSQL runtime source-of-truth | `100%` | production DB runtime 以 `k3s-postgres-recovery` host-network container + `pg_isready` 判斷,不用 host `pg_lsclusters` 假紅 |
| certbot / ACME route hygiene | `100%` | snap renew timer activecertificate 有效到 2026-09-24續依正常 timer 監控 |
| DR escrow | `100%` | 2026-07-11 checklist 回 `escrow_missing=0`,但仍與 host hygiene 分開記錄 |
| Wazuh registry | `NOT_EVALUATED_THIS_RUN` | 本輪 188 checklist 未取得 fresh manager registry acceptance不得沿用舊值作目前結論 |
---
## 8. 不得宣稱
- 不得用 188 host green 單獨宣稱全平台 DR completeDR 必須讀同一輪 backup/escrow scorecard。
- 不得宣稱 Wazuh registry recovered本輪沒有 fresh manager registry acceptance readback。
- 不得因 certificate 目前有效就停用 snap renew timer / expiry 告警。
- 不得把 `reset-failed` 單獨當成修復完成;本次完成是因 startup source、Nginx ACME route、timer split 與 postcheck 同時收斂。
- 不得宣稱這份文件批准任何新的 runtime action。