Files
my-project/config/openclaw/scripts/disaster-backup.sh
T

197 lines
6.6 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# 极简灾难恢复备份系统
# ============================================================================
# 设计目标:保证能有限度恢复系统,非数据同步
# 设计原则:最低频率 + 最少数据 + 最小负担
# ============================================================================
BACKUP_DIR="/root/.openclaw/backups"
LOG_FILE="${BACKUP_DIR}/backup.log"
mkdir -p "${BACKUP_DIR}"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
echo "$1"
}
# ============================================================================
# 极简备份:只备份重建系统的最小集合
# ============================================================================
minimal_backup() {
log "=== 极简灾难备份开始 ==="
echo "╔════════════════════════════════════════════════════╗"
echo "║ 极简灾难恢复备份系统 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
echo "设计目标:有限度恢复系统,非数据同步"
echo ""
local date=$(date '+%Y%m%d')
local backup_path="${BACKUP_DIR}/${date}"
mkdir -p "$backup_path"
# P0: 重建系统的绝对最小集合
echo "1️⃣ 核心配置 (P0)..."
# openclaw.json - 系统配置
cp -p /root/.openclaw/openclaw.json "${backup_path}/" 2>/dev/null
echo " ✅ openclaw.json"
# identity/ - 人格配置
cp -rp /root/.openclaw/identity/ "${backup_path}/" 2>/dev/null
echo " ✅ identity/"
# AGENTS.md - 人格注入
cp -p /root/.openclaw/workspace/AGENTS.md "${backup_path}/" 2>/dev/null
echo " ✅ AGENTS.md"
# P1: 可重建但有价值的数据(每周日备份)
echo ""
echo "2️⃣ 可选数据 (P1 - 仅周日)..."
if [ "$(date '+%u')" -eq 7 ]; then
# memory.sqlite - 记忆(5MB,可重建但有价值)
cp -p /root/.openclaw/memory/main.sqlite "${backup_path}/" 2>/dev/null
echo " ✅ memory.sqlite (周日)"
# sleep-learning/ - 学习记录(可重建,但保留有好处)
cp -rp /root/.openclaw/workspace/sleep-learning/ "${backup_path}/" 2>/dev/null
echo " ✅ sleep-learning (周日)"
else
echo " ⏭️ 跳过 (非周日)"
fi
# P2: 完全不备份
# - 会话文件:Gateway 可自动重建
# - 日志文件:可重建
echo ""
echo "3️⃣ 明确不备份 (P2)"
echo " ⏭️ 会话文件 - Gateway 自动重建"
echo " ⏭️ 日志文件 - 可重建"
echo " ⏭️ 临时文件 - 无需备份"
# 清理:只保留最近2周 + 每月1个
cleanup
log "=== 备份完成 ==="
echo ""
echo "✅ 极简备份完成"
echo ""
echo "📦 本次备份: $(du -sh "${backup_path}" | cut -f1)"
}
# ============================================================================
# 清理旧备份(极简策略)
# ============================================================================
cleanup() {
echo ""
echo "🧹 清理旧备份..."
# 保留最近14天
find "${BACKUP_DIR}" -maxdepth 1 -type d -name "20*" -mtime +14 -exec rm -rf {} \; 2>/dev/null
# 保留每月1个
ls -d "${BACKUP_DIR}"/20* 2>/dev/null | while read d; do
local day=$(basename "$d" | cut -c7) # 获取星期几
if [ "$day" = "0" ]; then
# 周日,保留
:
elif [ ! -d "$(dirname "$d")/$(basename "$d" | cut -c1-6)01" ]; then
# 月初且本月还没有备份
:
else
# 平日且不是本月第一个周日,删除
rm -rf "$d" 2>/dev/null
fi
done
echo " ✅ 清理完成 (保留14天 + 每月1个)"
}
# ============================================================================
# 快速恢复(极简)
# ============================================================================
quick_restore() {
local backup_path=$(ls -dt "${BACKUP_DIR}"/20* 2>/dev/null | head -1)
if [ -z "$backup_path" ]; then
echo "❌ 无备份可恢复"
return 1
fi
echo "⚠️ 快速恢复模式"
echo " 备份源: ${backup_path}"
echo ""
echo "将恢复:"
echo " 1. openclaw.json → 系统配置"
echo " 2. identity/* → 人格配置"
echo " 3. AGENTS.md → 人格注入"
if [ -f "${backup_path}/memory.sqlite" ]; then
echo " 4. memory.sqlite → 记忆"
fi
if [ -d "${backup_path}/sleep-learning" ]; then
echo " 5. sleep-learning/ → 学习记录"
fi
echo ""
echo "用法:"
echo " $0 restore config # 仅配置"
echo " $0 restore all # 全部"
}
# ============================================================================
# 状态查询
# ============================================================================
status() {
echo ""
echo "📊 灾难备份状态..."
local backup_count=$(ls -d "${BACKUP_DIR}"/20* 2>/dev/null | wc -l)
local latest=$(ls -dt "${BACKUP_DIR}"/20* 2>/dev/null | head -1)
if [ -n "$latest" ]; then
local size=$(du -sh "$latest" 2>/dev/null | cut -f1)
echo " ✅ 最新备份: ${latest##*/} (${size})"
echo " ✅ 备份数量: ${backup_count} 个"
echo " ✅ 备份总大小: $(du -sh "${BACKUP_DIR}" | cut -f1)"
else
echo " ⚠️ 无备份"
fi
echo ""
echo "📋 设计原则:"
echo " • 目标: 有限度恢复系统"
echo " • 频率: 每周1次"
echo " • 数据: 最少集合"
echo " • 保留: 14天 + 每月1个"
}
# ============================================================================
main() {
case "$1" in
backup)
minimal_backup
status
;;
status)
status
;;
restore)
quick_restore
;;
*)
echo "用法: $0 {backup|status|restore}"
echo ""
echo "极简灾难恢复备份系统"
echo ""
echo " backup - 执行备份 (每周日)"
echo " status - 查看状态"
echo " restore - 紧急恢复"
echo ""
echo "设计目标: 有限度恢复,非数据同步"
esac
}
main "$@"