每日备份 2026-06-10 12:57:13
This commit is contained in:
1 parent
fda2ccb8c2
commit
3d2e638c6a
244 files changed
+58890
-3
No files matched your search
Executable
+196
@@ -0,0 +1,196 @@
|
||||
#!/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 "$@"
|
||||
Reference in new issue
Block a user