mcpField
O
openclaw-backup

openclaw-backup

github.com/theagentservice云与 DevOps03.1k 次安装37 周前更新
代码仓库

关于 openclaw-backup

通过 Claude Code 加密备份和恢复 OpenClaw Agent 工作区文件的技能,适用于需要转存或恢复 Agent 配置与记忆文件的用户。它支持上传、下载和删除,并将恢复信息保存在本地文件中。

主要功能

  1. 01上传加密的工作区文件备份
  2. 02下载并解密备份
  3. 03删除远程备份
  4. 04为每个备份生成随机密码
  5. 05将恢复信息保存到本地文件

适用场景

  1. 01备份 OpenClaw 配置和记忆文件
  2. 02在工作区中恢复已保存的备份
  3. 03清理不再需要的远程备份

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/theagentservice/skills --skill openclaw-backup

安装后在 Claude Code 中输入/openclaw-backup确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitignore
README.md
scripts/
backup.py

详细介绍

OpenClaw 备份技能

使用 Claude Code 自动加密备份和恢复 OpenClaw Agent 工作区文件。

概览

此技能提供三项核心功能:

  1. 上传备份 - 加密工作区文件,并上传到 soul-upload.com,密码自动生成
  2. 下载备份 - 使用已保存的密码从 soul-upload.com 下载并解密备份
  3. 删除备份 - 从远程存储中删除备份

所有备份均使用 AES-256-CBC 加密(通过 openssl),并自动生成随机密码。每份备份都有唯一密码,该密码会保存在恢复文件中。

系统要求

执行备份操作前,请确保已安装以下工具:

  • Python 3.7+(脚本运行环境)
  • requests 库(pip install requests)
  • tar(文件归档)
  • openssl(加密/解密)
  • curl(HTTP 请求,系统内置)

默认备份文件

如果用户未指定文件,默认备份以下 OpenClaw 工作区文件:

  • SOUL.md - Agent 的核心身份与目标
  • MEMORY.md - Agent 的记忆与上下文
  • IDENTITY.md - Agent 的身份定义
  • AGENTS.md - Agent 配置
  • TOOLS.md - 工具配置

工作流 1:上传备份

触发场景

用户请求备份工作区文件时执行:

  • “备份我的工作区文件”
  • “将 SOUL.md 上传到 soul-upload”
  • “为我的 Agent 文件创建加密备份”
  • “备份 SOUL.md 和 MEMORY.md”
执行步骤
  1. 收集文件列表

    • 如果用户指定了文件,则使用用户指定的文件
    • 否则,使用默认列表:SOUL.md MEMORY.md IDENTITY.md AGENTS.md TOOLS.md
    • 使用 Read 工具确认文件存在
  2. 执行备份脚本(自动生成密码)

    • 确定脚本路径(通常位于技能目录中的 scripts/backup.py)
    • 执行命令时不要添加 --password 参数(脚本会自动生成密码):
      python3 scripts/backup.py upload \
        --files "SOUL.md MEMORY.md IDENTITY.md"
      
    • 脚本会自动生成一个 32 个字符的随机密码
    • 捕获 stdout(JSON 响应)和 stderr(进度信息,包括生成的密码)
  3. 处理响应

    • 成功时,脚本会输出 JSON:
      {
        "backupId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "downloadUrl": "https://soul-upload.com/backup/...",
        "sizeBytes": 12345,
        "sha256": "abc123...",
        "password": "auto-generated-32-char-random-password"
      }
      
    • 解析 JSON 并提取关键信息,包括自动生成的密码
  4. 保存恢复信息

    • 使用 Write 工具创建或更新 .openclaw-backup-recovery.txt
    • 重要: 将自动生成的密码写入恢复文件
    • 格式:
      Backup ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      Password: auto-generated-32-char-random-password
      Download URL: https://soul-upload.com/backup/...
      Created: 2024-01-15 10:30:00 UTC
      Size: 12.05 KB
      SHA256: abc123...
      Files: SOUL.md, MEMORY.md, IDENTITY.md
      ---
      
    • 追加到文件末尾(保留历史记录)
  5. 显示成功消息

    • 告知用户备份已完成
    • 显示 Backup ID 和文件大小
    • 重要: 告知用户密码是自动生成的,且已保存到 .openclaw-backup-recovery.txt
    • 提醒用户:恢复文件至关重要;没有它就无法恢复备份
错误处理
错误场景检测方式用户指引
未找到文件脚本返回错误:“Files not found: ...”列出缺失的文件,并询问用户是否要继续备份其他文件
文件过大脚本返回错误:“Backup size ... exceeds limit ...”显示实际大小,建议移除大文件或拆分备份
网络错误脚本返回错误:“Network error: ...”建议检查网络连接,并询问是否要重试
413 请求实体过大脚本返回错误:“File too large (413 Payload Too Large)”说明已超出 20MB 限制,建议减小备份大小
加密失败脚本返回错误:“openssl encryption failed: ...”检查 openssl 是否正确安装
对话示例
User: Back up my SOUL.md and MEMORY.md
Claude: I'll backup these files with auto-generated encryption.
       [Executes backup script]
       Backup complete!
       - Backup ID: 3f8a2b1c-...
       - Size: 45.2 KB
       - Password: Auto-generated (32 chars)
       - Recovery info saved to .openclaw-backup-recovery.txt

       IMPORTANT: Keep .openclaw-backup-recovery.txt safe!
       It contains the password needed to restore this backup.

工作流 2:下载备份

触发场景

用户请求恢复备份时执行:

  • “恢复我的备份”
  • “下载我最近的备份”
  • “恢复备份 [backup-id]”
  • “从 [download-url] 恢复”
执行步骤
  1. 获取备份 ID 和密码

    • 检查用户是否提供了备份 ID 或下载 URL
    • 如果未提供,使用 Read 工具读取 .openclaw-backup-recovery.txt
    • 从文件中提取最新的备份 ID 和密码
    • 如果文件不存在或为空,则无法继续(密码未知)
  2. 确定输出目录

    • 默认:当前工作目录(.)
    • 如果用户指定了目录,则使用用户指定的目录
    • 提醒用户:现有文件可能会被覆盖
  3. 执行恢复脚本

    • 使用恢复文件中的密码执行命令:
      python3 scripts/backup.py download \
        --backup-id "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
        --password "password-from-recovery-file" \
        --output-dir "."
      
    • 捕获 stdout(JSON 响应)和 stderr(进度信息)
  4. 处理响应

    • 成功时,脚本会输出 JSON:
      {
        "success": true,
        "extractedFiles": ["SOUL.md", "MEMORY.md", "IDENTITY.md"],
        "outputDir": "/path/to/output"
      }
      
    • 解析提取的文件列表
  5. 验证恢复结果

    • 使用 Read 工具读取已恢复文件的前几行
    • 显示文件预览,供用户确认内容是否正确
    • 提醒用户检查完整内容
  6. 显示成功消息

    • 列出已恢复的文件
    • 显示输出目录
    • 建议用户验证文件内容
错误处理
错误场景检测方式用户指引
备份 ID 不存在脚本返回错误:“Backup not found: ...”检查备份 ID 是否正确;备份可能已被删除
恢复文件缺失未找到 .openclaw-backup-recovery.txt无法恢复——没有恢复文件就不知道密码
密码错误脚本返回错误:“Decryption failed - wrong password ...”恢复文件可能已损坏,或来自其他备份
网络错误脚本返回错误:“Network error: ...”建议检查网络连接,并询问是否要重试
解压失败脚本返回错误:“tar extraction failed: ...”文件可能已损坏,请尝试重新下载
对话示例
User: Restore my last backup
Claude: I found the most recent backup in .openclaw-backup-recovery.txt
       - Backup ID: 3f8a2b1c-...
       - Created: 2024-01-15 10:30:00 UTC
       Downloading and decrypting backup...
       Restoration complete! Extracted the following files:
       - SOUL.md
       - MEMORY.md
       - IDENTITY.md
       Files saved to current directory, please verify content is correct.

工作流 3:删除备份

触发场景

用户请求删除远程备份时执行:

  • “删除我的备份”
  • “移除备份 [backup-id]”
  • “删除 soul-upload 中的备份”
执行步骤
  1. 获取备份 ID

    • 检查用户是否提供了备份 ID
    • 如果未提供,使用 Read 工具读取 .openclaw-backup-recovery.txt
    • 显示可用的备份列表,供用户选择
    • 如果文件不存在或为空,请用户提供备份 ID
  2. 请求确认

    • 警告:此操作不可逆,备份将被永久删除
    • 显示要删除的备份 ID 和创建时间
    • 请用户确认删除
  3. 执行删除脚本

    • 用户确认后,执行命令:
      python3 scripts/backup.py delete \
        --backup-id "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      
    • 捕获标准输出(JSON 响应)和标准错误(进度信息)
  4. 处理响应

    • 成功时,脚本会输出 JSON:
      {
        "success": true,
        "backupId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
      
  5. 更新恢复信息文件

    • 使用 Read 工具读取 .openclaw-backup-recovery.txt
    • 移除已删除的备份记录(包括其密码)
    • 使用 Write 工具保存更新后的文件
    • 如果文件为空,可以删除该文件
  6. 显示成功消息

    • 确认备份已删除
    • 显示已删除的备份 ID
    • 提醒用户:如果再次需要备份,必须使用新密码创建新的备份
错误处理
错误场景检测方式用户指引
备份 ID 不存在脚本返回错误:"Backup not found: ..."备份可能已被删除,或 ID 不正确
网络错误脚本返回错误:"Network error: ..."建议检查网络连接,并询问是否重试
用户取消用户拒绝确认操作已取消,备份未删除
对话示例
User: Delete my backup
Claude: I found the following backups in .openclaw-backup-recovery.txt:
       1. Backup ID: 3f8a2b1c-... (2024-01-15 10:30:00)
       2. Backup ID: 7b2c9d4e-... (2024-01-14 08:20:00)
       Which backup would you like to delete? (1 or 2)
User: 1
Claude: Warning: This will permanently delete backup 3f8a2b1c-...
       This action cannot be undone. Confirm deletion? (yes/no)
User: yes
Claude: Backup deleted.
       - Backup ID: 3f8a2b1c-...
       To backup again, create a new backup with a new auto-generated password.

安全说明

密码策略(新增)
  • 自动生成的密码:每个备份都会获得一个唯一的 32 位随机密码
  • 切勿重复使用密码:根据 soul-upload.com 的政策,不要在多个备份之间重复使用密码
  • 密码存储:密码存储在 .openclaw-backup-recovery.txt 中(解密所必需)
  • 用户责任:用户必须妥善保管恢复文件;没有该文件就无法恢复备份
恢复文件安全
  • 文件位置:.openclaw-backup-recovery.txt(工作区根目录)
  • 内容:备份 ID、密码(重要)、下载 URL、时间戳、SHA256
  • 重要:恢复文件是存储密码的唯一位置
  • 建议:
    • 如果内容敏感,请将其添加到 .gitignore
    • 或者将其提交到版本控制中,供团队访问
    • 考虑将恢复文件本身备份到单独的安全位置
加密算法
  • 算法:AES-256-CBC(对称加密)
  • 加盐:openssl 会自动添加盐值,以增强安全性
  • 兼容性:与 soul-upload.com 官方文档一致
临时文件清理
  • 脚本使用 try-finally,确保清理临时文件
  • 避免在磁盘上留下未加密的敏感数据

文件大小限制

  • 备份大小上限:20 MB(压缩和加密后)
  • 检查时机:上传前自动检查
  • 超限处理:显示实际大小,并建议用户:
    • 移除大文件(如日志、缓存)
    • 拆分备份(分批备份不同文件)

API 参考

soul-upload.com 备份 API:

端点方法功能响应
/backupPOST上传备份{backupId, downloadUrl, sizeBytes, sha256}
/backup/:backupIdGET下载备份302 重定向到 R2 存储 URL
/backup/:backupIdDELETE删除备份{success: true, backupId}

常见状态码:

  • 200 - 成功
  • 404 - 未找到备份
  • 413 - 文件过大(超过 20MB)
  • 415 - 不支持的文件类型
  • 500 - 服务器错误

故障排除

缺少依赖项

问题:脚本报错“Missing required tools: tar, openssl”

解决方案:

  • macOS:brew install openssl(内置 tar)
  • Ubuntu/Debian:sudo apt-get install tar openssl
  • 验证安装:tar --version 和 openssl version
缺少 Python requests 库

问题:脚本报错“Error: 'requests' library not found”

解决方案:

pip install requests
# or
pip3 install requests
恢复文件丢失

问题:无法还原备份——恢复文件缺失

解决方案:

  • 恢复文件至关重要——其中包含密码的唯一副本
  • 没有恢复文件,就无法还原备份
  • 建议将恢复文件备份到单独的安全位置
  • 如果丢失,备份将永久无法访问
网络超时

问题:上传/下载期间超时

解决方案:

  • 检查网络连接
  • 减小备份文件大小(移除不必要的文件)
  • 脚本默认超时时间为 5 分钟,通常足够
文件已存在

问题:还原时覆盖现有文件

解决方案:

  • 还原前备份现有文件
  • 指定不同的输出目录
  • 手动将现有文件移到其他位置

使用示例

示例 1:备份所有默认文件
User: Back up my workspace files
Claude: [Execute upload workflow using default file list]
       [Auto-generate password and save to recovery file]
示例 2:备份指定文件
User: Back up only SOUL.md and MEMORY.md
Claude: [Execute upload workflow, backup only specified files]
       [Auto-generate password and save to recovery file]
示例 3:还原最新备份
User: Restore my last backup
Claude: [Read latest Backup ID and password from .openclaw-backup-recovery.txt]
       [Execute download workflow]
示例 4:还原指定备份
User: Restore backup 3f8a2b1c-1234-5678-90ab-cdef12345678
Claude: [Read password for this Backup ID from recovery file]
       [Execute download workflow]
示例 5:删除旧备份
User: Delete my old backups
Claude: [Show available backup list from recovery file]
       [User selects backup to delete]
       [Execute delete workflow]
       [Remove entry from recovery file]

最佳实践

  1. 定期备份:建议每周备份一次,或在进行重要更改后备份
  2. 恢复文件管理:妥善保管 .openclaw-backup-recovery.txt,并单独备份
  3. 验证还原:定期测试备份还原流程,确保备份可用
  4. 清理旧备份:定期删除不需要的旧备份,以节省存储空间
  5. 保留多个副本:考虑将恢复文件保存在多个安全位置

脚本路径

脚本文件位于 Skill 目录中的 scripts/backup.py。

执行 Bash 命令时,请确保使用正确的相对路径或绝对路径。通常:

  • 如果当前位于 Skill 目录:python3 scripts/backup.py ...
  • 如果位于其他目录:使用绝对路径,或先 cd 到 Skill 目录

参考文档


版本:2.0.0 作者:Claude Code 许可证:MIT 密码策略:每次备份自动生成唯一密码(v2.0.0 新增)

评论

支持 Markdown