feat(backup): AWOOOI 高頻備份 — 每 6 小時備份 awoooi_prod
awoooi_prod 為核心生產 DB,每日一次最大損失 24 小時不可接受: - backup-awoooi-frequent.sh:每 6 小時備份 awoooi_prod(08/14/20:00) - 02:00 由 backup-all.sh 完整備份(含 dev/k3s) - 合計 4次/天,最大數據損失 ≤ 6 小時 - GFS 保留:28h 高頻 + 30日 + 12週 + 24月 首次執行:✅ 680K,4s,snapshot db050dbc Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
76
scripts/backup/backup-awoooi-frequent.sh
Executable file
76
scripts/backup/backup-awoooi-frequent.sh
Executable file
@@ -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 "$@"
|
||||
Reference in New Issue
Block a user