diff --git a/docs/runbooks/BACKUP-STATUS.md b/docs/runbooks/BACKUP-STATUS.md index 34b05c51..40f6c1d6 100644 --- a/docs/runbooks/BACKUP-STATUS.md +++ b/docs/runbooks/BACKUP-STATUS.md @@ -1,44 +1,60 @@ # BACKUP-STATUS.md — 備份狀態總覽 -> 2026-04-05 Claude Code: 首席架構師完整盤點 + 全面自動化部署完成 +> 2026-04-05 Claude Code: 首席架構師完整盤點 + 全面自動化 + 高頻備份部署完成 > 備份中心:192.168.0.110 (`/backup/`) — Restic + GFS 祖父子策略 --- ## 備份全景圖(全部自動化) -| 資料類型 | 備份腳本 | 排程 | 保留策略 | 狀態 | -|---------|---------|------|---------|------| -| Gitea (DB + 倉庫) | `backup-gitea.sh` | 每日 02:00 | 30日/12週/24月 | ✅ | -| MOMO PostgreSQL | `backup-momo.sh` | 每日 02:00 | 30日/12週/24月 | ✅ | -| Harbor (Registry + DB) | `backup-harbor.sh` | 每日 02:00 | 30日/12週/24月 | ✅ | -| **AWOOOI PostgreSQL** | **`backup-awoooi.sh`** | **每日 02:00** | **30日/12週/24月** | **✅ 2026-04-05 新增** | -| K8s 資源 (全命名空間) | Velero + MinIO | 每日 02:00 | 7 份 | ✅ | +| 資料類型 | 備份腳本 | 排程 | 最大損失 | 保留策略 | 狀態 | +|---------|---------|------|---------|---------|------| +| Gitea (DB + 倉庫) | `backup-gitea.sh` | 每日 02:00 | 24h | 28h/30日/12週/24月 | ✅ | +| MOMO PostgreSQL | `backup-momo.sh` | 每日 02:00 | 24h | 28h/30日/12週/24月 | ✅ | +| Harbor (Registry + DB) | `backup-harbor.sh` | 每日 02:00 | 24h | 28h/30日/12週/24月 | ✅ | +| **AWOOOI PostgreSQL (完整)** | **`backup-awoooi.sh`** | **每日 02:00** | **6h** | **28h/30日/12週/24月** | **✅** | +| **AWOOOI PostgreSQL (高頻)** | **`backup-awoooi-frequent.sh`** | **每日 08/14/20:00** | **6h** | **28h/30日/12週/24月** | **✅** | +| K8s 資源 (全命名空間) | Velero + MinIO | 每日 02:00 | 24h | 7 份 | ✅ | -**備份總控**:`/backup/scripts/backup-all.sh` — 統一執行 4 個服務備份 +**AWOOOI 每日備份排程**:02:00(含 awoooi_dev + k3s)、08:00、14:00、20:00(僅 awoooi_prod)= **4次/天** --- -## GFS 保留策略(2026-04-05 延長) +## GFS 保留策略 -| 級別 | 保留數量 | 覆蓋時間 | -|------|---------|---------| -| 每日 | 30 份 | 最近 30 天 | -| 每週 | 12 份 | 最近 3 個月 (週級) | -| 每月 | 24 份 | 最近 2 年 (月級) | +| 級別 | 保留數量 | 覆蓋時間 | 說明 | +|------|---------|---------|------| +| 每小時 | 28 份 | 最近 7 天 (6h 快照) | AWOOOI 高頻 | +| 每日 | 30 份 | 最近 30 天 | 全服務 | +| 每週 | 12 份 | 最近 3 個月 | 全服務 | +| 每月 | 24 份 | 最近 2 年 | 全服務 | -> 原策略:7日/4週/6月 → 2026-04-05 延長為 30日/12週/24月 +> 原策略:7日/4週/6月 → 2026-04-05 延長為 28h/30日/12週/24月 + +--- + +## Crontab 完整排程(110) + +``` +0 2 * * * backup-all.sh ← Gitea + MOMO + Harbor + AWOOOI 完整備份 +0 8,14,20 * * * backup-awoooi-frequent.sh ← AWOOOI 高頻(每 6 小時) +0 6 * * * backup-status.sh ← 備份狀態報告 +``` --- ## 備份架構 ``` -192.168.0.110 (/backup/scripts/backup-all.sh) 每日 02:00 -├── [1/4] backup-gitea.sh → gitea dump → restic /backup/gitea -├── [2/4] backup-momo.sh → SSH 188 pg_dump → restic /backup/momo -├── [3/4] backup-harbor.sh → harbor dump → restic /backup/harbor -└── [4/4] backup-awoooi.sh → SSH 188 pg_dump (awoooi_prod/dev/k3s) → restic /backup/awoooi +192.168.0.110 (/backup/scripts/) +├── backup-all.sh (每日 02:00) +│ ├── [1/4] backup-gitea.sh → gitea dump → restic /backup/gitea +│ ├── [2/4] backup-momo.sh → SSH 188 pg_dump → restic /backup/momo +│ ├── [3/4] backup-harbor.sh → harbor dump → restic /backup/harbor +│ └── [4/4] backup-awoooi.sh → SSH 188 pg_dump (prod/dev/k3s) → restic /backup/awoooi +│ +└── backup-awoooi-frequent.sh (08/14/20:00) + └── SSH 188 pg_dump awoooi_prod → restic /backup/awoooi (同一倉庫) 192.168.0.188 (Velero) └── K8s 資源快照 → MinIO 192.168.0.188:9000 (bucket: velero) @@ -46,32 +62,21 @@ --- -## AWOOOI PostgreSQL 備份說明 - -**備份資料庫**: -- `awoooi_prod` — 核心 (KB 知識庫、事故記錄、AutoRepair 決策、Drift 報告) -- `awoooi_dev` — 開發 DB(若存在) -- `k3s_datastore` — K3s Kine 後端(若存在) - -**連線方式**: 從 110 SSH 到 188,使用 `PGPASSWORD` + `pg_dump` 直連 -**腳本位置**: `/backup/scripts/backup-awoooi.sh` (110) -**Git 備份**: `scripts/backup/backup-awoooi.sh` - -**首次執行結果**: ✅ awoooi_prod 680K,9 秒完成 - ---- - ## 驗證 SOP ```bash # 確認最新備份日誌 ssh wooo@192.168.0.110 "tail -30 /backup/logs/backup.log" -# 查看 AWOOOI 備份快照 -ssh wooo@192.168.0.110 "restic -r /backup/awoooi snapshots --password-file /backup/scripts/.restic-password | tail -5" +# AWOOOI 快照列表(含高頻) +ssh wooo@192.168.0.110 "restic -r /backup/awoooi snapshots \ + --password-file /backup/scripts/.restic-password | tail -10" -# 查看所有服務備份快照數 -ssh wooo@192.168.0.110 "for r in gitea momo harbor awoooi; do echo -n \"\$r: \"; restic -r /backup/\$r snapshots --password-file /backup/scripts/.restic-password 2>/dev/null | tail -1; done" +# 各服務快照數 +ssh wooo@192.168.0.110 "for r in gitea momo harbor awoooi; do \ + echo -n \"\$r: \"; \ + restic -r /backup/\$r snapshots --password-file /backup/scripts/.restic-password \ + 2>/dev/null | grep -c '^\w'; done" # Velero K8s kubectl get backup -n velero --sort-by=.metadata.creationTimestamp | tail -3 @@ -82,6 +87,7 @@ kubectl get backup -n velero --sort-by=.metadata.creationTimestamp | tail -3 ## 相關文件 - [REBOOT-RECOVERY-SOP.md](REBOOT-RECOVERY-SOP.md) - 重開機恢復 SOP(含 MinIO 啟動) -- `scripts/backup/backup-awoooi.sh` - AWOOOI DB 備份腳本(Git 版本) -- `scripts/backup/backup-all.sh` - 全服務備份總控 v2.0(Git 版本) +- `scripts/backup/backup-awoooi.sh` - AWOOOI 完整備份腳本 +- `scripts/backup/backup-awoooi-frequent.sh` - AWOOOI 高頻備份腳本 +- `scripts/backup/backup-all.sh` - 全服務備份總控 v2.0 - `/backup/scripts/` (on 110) - 實際部署腳本 diff --git a/scripts/backup/backup-awoooi-frequent.sh b/scripts/backup/backup-awoooi-frequent.sh new file mode 100755 index 00000000..19c369af --- /dev/null +++ b/scripts/backup/backup-awoooi-frequent.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# ============================================================================= +# WOOO AIOps - AWOOOI 高頻備份(每 6 小時) +# 2026-04-05 Claude Code: awoooi_prod 為核心生產 DB,每日一次不夠 +# 部署位置: /backup/scripts/backup-awoooi-frequent.sh (on 192.168.0.110) +# cron: 0 */6 * * * /backup/scripts/backup-awoooi-frequent.sh >> /backup/logs/cron.log 2>&1 +# 說明: 每 6 小時備份 awoooi_prod,最多損失 6 小時資料 +# 完整備份(含 Gitea/Harbor)仍由 backup-all.sh 每日 02:00 執行 +# ============================================================================= + +set -euo pipefail + +source "$(dirname "$0")/common.sh" + +SERVICE="awoooi-frequent" +AWOOOI_HOST="192.168.0.188" +AWOOOI_DB_USER="awoooi" +AWOOOI_DB_PASS="awoooi_prod_2026" +AWOOOI_DB_HOST="localhost" +AWOOOI_DB_PORT="5432" +LOCAL_REPO="${BACKUP_BASE}/awoooi" +DUMP_DIR="/tmp/awoooi-freq-backup-$$" + +# 高頻備份保留策略 +KEEP_HOURLY=28 # 保留 7 天的 6 小時快照(7*4=28) +KEEP_DAILY=30 +KEEP_WEEKLY=12 +KEEP_MONTHLY=24 + +main() { + local start_time=$(date +%s) + + log_info "========== AWOOOI 高頻備份 ($(date '+%H:%M')) ==========" + mkdir -p "${DUMP_DIR}" + + local timestamp=$(date "+%Y%m%d_%H%M%S") + + # 只備份 awoooi_prod(高頻核心) + if ssh ollama@${AWOOOI_HOST} "PGPASSWORD='${AWOOOI_DB_PASS}' pg_dump \ + -U ${AWOOOI_DB_USER} -h ${AWOOOI_DB_HOST} -p ${AWOOOI_DB_PORT} \ + awoooi_prod" > "${DUMP_DIR}/awoooi_prod_${timestamp}.sql" 2>&1; then + local size=$(du -h "${DUMP_DIR}/awoooi_prod_${timestamp}.sql" | cut -f1) + log_success "awoooi_prod dump 完成 (${size})" + else + log_error "awoooi_prod dump 失敗" + notify_clawbot "failed" "${SERVICE}" "AWOOOI 高頻備份失敗" + rm -rf "${DUMP_DIR}" + exit 1 + fi + + # Restic 備份(同一倉庫,頻率不同) + restic -r "${LOCAL_REPO}" backup "${DUMP_DIR}" \ + --password-file "${RESTIC_PASSWORD_FILE}" \ + --tag "service:awoooi" --tag "freq:6h" \ + --tag "timestamp:${timestamp}" 2>&1 + + local snapshot_id=$(restic -r "${LOCAL_REPO}" snapshots --latest 1 --json \ + --password-file "${RESTIC_PASSWORD_FILE}" 2>/dev/null | \ + grep -oP '"short_id":"\K[^"]+' | head -1) + log_success "快照: ${snapshot_id}" + + # GFS 清理(加入 hourly 保留) + restic -r "${LOCAL_REPO}" forget --prune \ + --password-file "${RESTIC_PASSWORD_FILE}" \ + --keep-hourly ${KEEP_HOURLY} \ + --keep-daily ${KEEP_DAILY} \ + --keep-weekly ${KEEP_WEEKLY} \ + --keep-monthly ${KEEP_MONTHLY} 2>&1 + + rm -rf "${DUMP_DIR}" + + local end_time=$(date +%s) + log_success "========== AWOOOI 高頻備份完成 ($((end_time-start_time))s) ==========" +} + +main "$@"