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>
77 lines
2.7 KiB
Bash
Executable File
77 lines
2.7 KiB
Bash
Executable File
#!/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 "$@"
|