🧪 Skills

Openclaw Backup

定期备份和加密保护 OpenClaw 数据,支持手动执行、定时调度及备份文件云端同步和校验。

v1.0.0
❤️ 0
⬇️ 32
👁 1
Share

Description


name: openclaw-backup slug: halaoluan-openclaw-backup version: 1.0.0 description: 定期备份 OpenClaw 数据(支持手动/自动/加密备份)。Use when user asks to backup OpenClaw, create backup, save state, protect data, or schedule automatic backups. Triggers: "备份", "backup", "保存数据", "定时备份", "加密备份", "backup to cloud".

OpenClaw 备份 Skill

自动备份 OpenClaw 核心数据,支持加密、定时、云同步。


使用场景

触发词 操作
"备份 OpenClaw" 立即创建备份
"定时备份" 配置 cron 自动备份
"加密备份" 创建密码保护的备份
"备份到云盘" 备份后同步到云端
"查看备份" 列出所有备份文件

核心脚本

1. 基础备份(无加密)

位置:scripts/backup.sh

#!/bin/bash
set -euo pipefail

# 参数
BACKUP_ROOT="${OPENCLAW_BACKUP_DIR:-$HOME/Desktop/OpenClaw_Backups}"
DATE_STR="$(date +"%Y-%m-%d_%H-%M-%S")"
TMP_DIR="/tmp/openclaw_backup_$DATE_STR"
ARCHIVE_NAME="openclaw_backup_$DATE_STR.tar.gz"

# 数据目录
STATE_DIR_NEW="$HOME/.openclaw"
STATE_DIR_OLD="$HOME/.clawdbot"

mkdir -p "$BACKUP_ROOT"
mkdir -p "$TMP_DIR"

echo "🐈‍⬛ OpenClaw 备份开始..."
echo "备份目标: $BACKUP_ROOT"

FOUND_ANY=0

# 备份 ~/.openclaw
if [ -d "$STATE_DIR_NEW" ]; then
    echo "✓ 发现: $STATE_DIR_NEW"
    cp -a "$STATE_DIR_NEW" "$TMP_DIR/"
    FOUND_ANY=1
fi

# 备份 ~/.clawdbot(旧版兼容)
if [ -d "$STATE_DIR_OLD" ]; then
    echo "✓ 发现: $STATE_DIR_OLD"
    cp -a "$STATE_DIR_OLD" "$TMP_DIR/"
    FOUND_ANY=1
fi

if [ "$FOUND_ANY" -eq 0 ]; then
    echo "❌ 未找到 OpenClaw 数据目录"
    rm -rf "$TMP_DIR"
    exit 1
fi

# 停止网关(可选)
if command -v openclaw >/dev/null 2>&1; then
    echo "⏸  停止 OpenClaw 网关..."
    openclaw gateway stop 2>/dev/null || true
    sleep 2
fi

# 打包
echo "📦 打包中..."
tar -czf "$BACKUP_ROOT/$ARCHIVE_NAME" -C "$TMP_DIR" .

# 生成校验文件
echo "🔐 生成 SHA256 校验..."
shasum -a 256 "$BACKUP_ROOT/$ARCHIVE_NAME" > "$BACKUP_ROOT/$ARCHIVE_NAME.sha256"

# 清理
rm -rf "$TMP_DIR"

# 重启网关
if command -v openclaw >/dev/null 2>&1; then
    echo "▶️  重启 OpenClaw 网关..."
    openclaw gateway start 2>/dev/null || true
fi

echo ""
echo "✅ 备份完成!"
echo "📁 位置: $BACKUP_ROOT/$ARCHIVE_NAME"
echo "🔐 校验: $BACKUP_ROOT/$ARCHIVE_NAME.sha256"
echo ""
echo "建议操作:"
echo "1. 复制到移动硬盘"
echo "2. 上传到云盘(建议加密)"
echo "3. 定期验证备份完整性"

2. 加密备份(推荐)

位置:scripts/backup_encrypted.sh

#!/bin/bash
set -euo pipefail

# 参数
BACKUP_ROOT="${OPENCLAW_BACKUP_DIR:-$HOME/Desktop/OpenClaw_Backups}"
DATE_STR="$(date +"%Y-%m-%d_%H-%M-%S")"
TMP_DIR="/tmp/openclaw_backup_$DATE_STR"
ARCHIVE_NAME="openclaw_backup_$DATE_STR.tar.gz"
ENCRYPTED_NAME="openclaw_backup_$DATE_STR.tar.gz.enc"

STATE_DIR_NEW="$HOME/.openclaw"
STATE_DIR_OLD="$HOME/.clawdbot"

mkdir -p "$BACKUP_ROOT"
mkdir -p "$TMP_DIR"

echo "🐈‍⬛ OpenClaw 加密备份开始..."

# 检查密码
if [ -z "${OPENCLAW_BACKUP_PASSWORD:-}" ]; then
    echo "请输入备份密码(至少8位):"
    read -s BACKUP_PASSWORD
    echo ""
    echo "请再次输入密码:"
    read -s BACKUP_PASSWORD_CONFIRM
    echo ""
    
    if [ "$BACKUP_PASSWORD" != "$BACKUP_PASSWORD_CONFIRM" ]; then
        echo "❌ 密码不匹配"
        exit 1
    fi
    
    if [ ${#BACKUP_PASSWORD} -lt 8 ]; then
        echo "❌ 密码至少8位"
        exit 1
    fi
else
    BACKUP_PASSWORD="$OPENCLAW_BACKUP_PASSWORD"
fi

FOUND_ANY=0

if [ -d "$STATE_DIR_NEW" ]; then
    echo "✓ 发现: $STATE_DIR_NEW"
    cp -a "$STATE_DIR_NEW" "$TMP_DIR/"
    FOUND_ANY=1
fi

if [ -d "$STATE_DIR_OLD" ]; then
    echo "✓ 发现: $STATE_DIR_OLD"
    cp -a "$STATE_DIR_OLD" "$TMP_DIR/"
    FOUND_ANY=1
fi

if [ "$FOUND_ANY" -eq 0 ]; then
    echo "❌ 未找到数据目录"
    rm -rf "$TMP_DIR"
    exit 1
fi

# 停止网关
if command -v openclaw >/dev/null 2>&1; then
    echo "⏸  停止网关..."
    openclaw gateway stop 2>/dev/null || true
    sleep 2
fi

# 打包
echo "📦 打包中..."
tar -czf "/tmp/$ARCHIVE_NAME" -C "$TMP_DIR" .

# 加密(使用 openssl aes-256-cbc)
echo "🔐 加密中..."
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
    -in "/tmp/$ARCHIVE_NAME" \
    -out "$BACKUP_ROOT/$ENCRYPTED_NAME" \
    -pass pass:"$BACKUP_PASSWORD"

# 生成校验
shasum -a 256 "$BACKUP_ROOT/$ENCRYPTED_NAME" > "$BACKUP_ROOT/$ENCRYPTED_NAME.sha256"

# 清理
rm -f "/tmp/$ARCHIVE_NAME"
rm -rf "$TMP_DIR"

# 重启网关
if command -v openclaw >/dev/null 2>&1; then
    echo "▶️  重启网关..."
    openclaw gateway start 2>/dev/null || true
fi

echo ""
echo "✅ 加密备份完成!"
echo "📁 位置: $BACKUP_ROOT/$ENCRYPTED_NAME"
echo "🔐 校验: $BACKUP_ROOT/$ENCRYPTED_NAME.sha256"
echo ""
echo "⚠️  请妥善保管密码!丢失密码将无法恢复数据。"
echo ""
echo "解密方法:"
echo "openssl enc -aes-256-cbc -d -pbkdf2 -iter 100000 \\"
echo "  -in $ENCRYPTED_NAME \\"
echo "  -out openclaw_backup.tar.gz \\"
echo "  -pass pass:YOUR_PASSWORD"

3. 定时备份配置

位置:scripts/setup_cron.sh

#!/bin/bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKUP_SCRIPT="${OPENCLAW_BACKUP_SCRIPT:-$SCRIPT_DIR/backup_encrypted.sh}"

echo "🐈‍⬛ 配置 OpenClaw 定时备份"
echo ""
echo "选择备份频率:"
echo "1. 每天 23:00"
echo "2. 每周日 21:00"
echo "3. 每月1日 20:00"
echo "4. 自定义"
echo ""
read -p "请选择 [1-4]: " CHOICE

case $CHOICE in
    1)
        CRON_EXPR="0 23 * * *"
        DESC="每天 23:00"
        ;;
    2)
        CRON_EXPR="0 21 * * 0"
        DESC="每周日 21:00"
        ;;
    3)
        CRON_EXPR="0 20 1 * *"
        DESC="每月1日 20:00"
        ;;
    4)
        echo "请输入 cron 表达式(如 '0 2 * * *' 代表每天凌晨2点):"
        read -p "> " CRON_EXPR
        DESC="自定义: $CRON_EXPR"
        ;;
    *)
        echo "❌ 无效选择"
        exit 1
        ;;
esac

# 检查是否已有任务
if crontab -l 2>/dev/null | grep -q "openclaw.*backup"; then
    echo ""
    echo "⚠️  发现已有 OpenClaw 备份任务,是否覆盖?[y/N]"
    read -p "> " CONFIRM
    if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
        echo "取消操作"
        exit 0
    fi
    
    # 移除旧任务
    crontab -l 2>/dev/null | grep -v "openclaw.*backup" | crontab -
fi

# 添加新任务
(crontab -l 2>/dev/null; echo "$CRON_EXPR $BACKUP_SCRIPT >> /tmp/openclaw_backup.log 2>&1") | crontab -

echo ""
echo "✅ 定时备份已配置"
echo "📅 频率: $DESC"
echo "📜 脚本: $BACKUP_SCRIPT"
echo ""
echo "查看所有定时任务: crontab -l"
echo "查看备份日志: tail -f /tmp/openclaw_backup.log"

4. 列出备份

位置:scripts/list_backups.sh

#!/bin/bash
set -euo pipefail

BACKUP_ROOT="${OPENCLAW_BACKUP_DIR:-$HOME/Desktop/OpenClaw_Backups}"

echo "🐈‍⬛ OpenClaw 备份列表"
echo "位置: $BACKUP_ROOT"
echo ""

if [ ! -d "$BACKUP_ROOT" ]; then
    echo "❌ 备份目录不存在"
    exit 1
fi

cd "$BACKUP_ROOT"

# 统计
TOTAL_FILES=$(ls -1 openclaw_backup_*.tar.gz* 2>/dev/null | grep -v ".sha256" | wc -l | tr -d ' ')
TOTAL_SIZE=$(du -sh . | cut -f1)

echo "📦 共 $TOTAL_FILES 个备份文件,总计 $TOTAL_SIZE"
echo ""

# 列出文件
ls -lht openclaw_backup_*.tar.gz* 2>/dev/null | grep -v ".sha256" | while read -r line; do
    SIZE=$(echo "$line" | awk '{print $5}')
    DATE=$(echo "$line" | awk '{print $6, $7, $8}')
    FILE=$(echo "$line" | awk '{print $9}')
    
    # 检查是否加密
    if [[ "$FILE" == *.enc ]]; then
        ENCRYPTED="🔐 加密"
    else
        ENCRYPTED="📂 未加密"
    fi
    
    # 检查校验文件
    if [ -f "$FILE.sha256" ]; then
        CHECKSUM="✓"
    else
        CHECKSUM="✗"
    fi
    
    echo "[$ENCRYPTED] $FILE"
    echo "  大小: $SIZE | 日期: $DATE | 校验: $CHECKSUM"
    echo ""
done

echo "验证备份完整性:"
echo "  shasum -c openclaw_backup_XXXX.tar.gz.sha256"

使用方法

方式1:直接调用脚本

# 普通备份
bash ~/.openclaw/skills/openclaw-backup/scripts/backup.sh

# 加密备份(推荐)
bash ~/.openclaw/skills/openclaw-backup/scripts/backup_encrypted.sh

# 配置定时备份
bash ~/.openclaw/skills/openclaw-backup/scripts/setup_cron.sh

# 查看备份列表
bash ~/.openclaw/skills/openclaw-backup/scripts/list_backups.sh

方式2:通过 OpenClaw 调用

当用户说:

  • "备份 OpenClaw" → 执行加密备份
  • "定时备份" → 执行 setup_cron.sh
  • "查看备份" → 执行 list_backups.sh

环境变量

可选配置:

# 备份目录(默认桌面)
export OPENCLAW_BACKUP_DIR="$HOME/Backups/OpenClaw"

# 加密密码(不推荐明文存储)
export OPENCLAW_BACKUP_PASSWORD="your_password"

# 备份脚本路径(用于 cron)
export OPENCLAW_BACKUP_SCRIPT="$HOME/.openclaw/skills/openclaw-backup/scripts/backup_encrypted.sh"

最佳实践

1. 3-2-1 备份原则

  • 保留 3 份副本
  • 存在 2 种介质(本地 + 移动硬盘/云盘)
  • 其中 1 份在异地

2. 加密备份

备份文件包含敏感数据:

  • API Key
  • Telegram Bot Token
  • 用户记忆
  • 对话历史

强烈建议使用加密备份(backup_encrypted.sh

3. 定期验证

每月验证一次备份完整性:

cd ~/Desktop/OpenClaw_Backups
shasum -c openclaw_backup_2026-03-13_20-00-00.tar.gz.sha256

4. 备份触发时机

建议在以下操作后手动备份:

  • ✅ 修改配置文件
  • ✅ 新增 Skill
  • ✅ 更新记忆文件(MEMORY.md)
  • ✅ 绑定新渠道
  • ✅ 修改 API Key
  • ✅ 完成重要对话

云端同步(可选)

iCloud Drive

# 修改备份目录
export OPENCLAW_BACKUP_DIR="$HOME/Library/Mobile Documents/com~apple~CloudDocs/OpenClaw_Backups"

Google Drive / Dropbox

安装对应客户端后:

export OPENCLAW_BACKUP_DIR="$HOME/Google Drive/OpenClaw_Backups"
# 或
export OPENCLAW_BACKUP_DIR="$HOME/Dropbox/OpenClaw_Backups"

故障排查

问题1:cron 任务未执行

检查

# 查看 cron 任务
crontab -l

# 查看日志
tail -f /tmp/openclaw_backup.log

解决:确保脚本有执行权限

chmod +x ~/.openclaw/skills/openclaw-backup/scripts/*.sh

问题2:加密失败

症状openssl: command not found

解决:macOS 自带 openssl,如果缺失:

brew install openssl

问题3:备份文件过大

症状:备份文件几百MB/GB

原因:可能包含日志文件、临时文件

解决:编辑 backup.sh,添加排除规则:

# 在 cp -a 之前添加
echo "清理临时文件..."
find "$STATE_DIR_NEW" -name "*.log" -delete 2>/dev/null || true
find "$STATE_DIR_NEW" -name "node_modules" -type d -exec rm -rf {} + 2>/dev/null || true

参考

Reviews (0)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs