#!/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 "$@"