关于 openclaw-backup
通过 Claude Code 加密备份和恢复 OpenClaw Agent 工作区文件的技能,适用于需要转存或恢复 Agent 配置与记忆文件的用户。它支持上传、下载和删除,并将恢复信息保存在本地文件中。
主要功能
- 01上传加密的工作区文件备份
- 02下载并解密备份
- 03删除远程备份
- 04为每个备份生成随机密码
- 05将恢复信息保存到本地文件
适用场景
- 01备份 OpenClaw 配置和记忆文件
- 02在工作区中恢复已保存的备份
- 03清理不再需要的远程备份
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ theagentservice/ skills --skill openclaw-backup安装后在 Claude Code 中输入/openclaw-backup确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.gitignoreREADME.mdscripts/backup.py详细介绍
OpenClaw 备份技能
使用 Claude Code 自动加密备份和恢复 OpenClaw Agent 工作区文件。
概览
此技能提供三项核心功能:
- 上传备份 - 加密工作区文件,并上传到 soul-upload.com,密码自动生成
- 下载备份 - 使用已保存的密码从 soul-upload.com 下载并解密备份
- 删除备份 - 从远程存储中删除备份
所有备份均使用 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”
执行步骤
-
收集文件列表
- 如果用户指定了文件,则使用用户指定的文件
- 否则,使用默认列表:
SOUL.md MEMORY.md IDENTITY.md AGENTS.md TOOLS.md - 使用 Read 工具确认文件存在
-
执行备份脚本(自动生成密码)
- 确定脚本路径(通常位于技能目录中的
scripts/backup.py) - 执行命令时不要添加 --password 参数(脚本会自动生成密码):
python3 scripts/backup.py upload \ --files "SOUL.md MEMORY.md IDENTITY.md" - 脚本会自动生成一个 32 个字符的随机密码
- 捕获 stdout(JSON 响应)和 stderr(进度信息,包括生成的密码)
- 确定脚本路径(通常位于技能目录中的
-
处理响应
- 成功时,脚本会输出 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 并提取关键信息,包括自动生成的密码
- 成功时,脚本会输出 JSON:
-
保存恢复信息
- 使用 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 --- - 追加到文件末尾(保留历史记录)
- 使用 Write 工具创建或更新
-
显示成功消息
- 告知用户备份已完成
- 显示 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] 恢复”
执行步骤
-
获取备份 ID 和密码
- 检查用户是否提供了备份 ID 或下载 URL
- 如果未提供,使用 Read 工具读取
.openclaw-backup-recovery.txt - 从文件中提取最新的备份 ID 和密码
- 如果文件不存在或为空,则无法继续(密码未知)
-
确定输出目录
- 默认:当前工作目录(
.) - 如果用户指定了目录,则使用用户指定的目录
- 提醒用户:现有文件可能会被覆盖
- 默认:当前工作目录(
-
执行恢复脚本
- 使用恢复文件中的密码执行命令:
python3 scripts/backup.py download \ --backup-id "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \ --password "password-from-recovery-file" \ --output-dir "." - 捕获 stdout(JSON 响应)和 stderr(进度信息)
- 使用恢复文件中的密码执行命令:
-
处理响应
- 成功时,脚本会输出 JSON:
{ "success": true, "extractedFiles": ["SOUL.md", "MEMORY.md", "IDENTITY.md"], "outputDir": "/path/to/output" } - 解析提取的文件列表
- 成功时,脚本会输出 JSON:
-
验证恢复结果
- 使用 Read 工具读取已恢复文件的前几行
- 显示文件预览,供用户确认内容是否正确
- 提醒用户检查完整内容
-
显示成功消息
- 列出已恢复的文件
- 显示输出目录
- 建议用户验证文件内容
错误处理
| 错误场景 | 检测方式 | 用户指引 |
|---|---|---|
| 备份 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 中的备份”
执行步骤
-
获取备份 ID
- 检查用户是否提供了备份 ID
- 如果未提供,使用 Read 工具读取
.openclaw-backup-recovery.txt - 显示可用的备份列表,供用户选择
- 如果文件不存在或为空,请用户提供备份 ID
-
请求确认
- 警告:此操作不可逆,备份将被永久删除
- 显示要删除的备份 ID 和创建时间
- 请用户确认删除
-
执行删除脚本
- 用户确认后,执行命令:
python3 scripts/backup.py delete \ --backup-id "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - 捕获标准输出(JSON 响应)和标准错误(进度信息)
- 用户确认后,执行命令:
-
处理响应
- 成功时,脚本会输出 JSON:
{ "success": true, "backupId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
- 成功时,脚本会输出 JSON:
-
更新恢复信息文件
- 使用 Read 工具读取
.openclaw-backup-recovery.txt - 移除已删除的备份记录(包括其密码)
- 使用 Write 工具保存更新后的文件
- 如果文件为空,可以删除该文件
- 使用 Read 工具读取
-
显示成功消息
- 确认备份已删除
- 显示已删除的备份 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:
| 端点 | 方法 | 功能 | 响应 |
|---|---|---|---|
/backup | POST | 上传备份 | {backupId, downloadUrl, sizeBytes, sha256} |
/backup/:backupId | GET | 下载备份 | 302 重定向到 R2 存储 URL |
/backup/:backupId | DELETE | 删除备份 | {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]
最佳实践
- 定期备份:建议每周备份一次,或在进行重要更改后备份
- 恢复文件管理:妥善保管
.openclaw-backup-recovery.txt,并单独备份 - 验证还原:定期测试备份还原流程,确保备份可用
- 清理旧备份:定期删除不需要的旧备份,以节省存储空间
- 保留多个副本:考虑将恢复文件保存在多个安全位置
脚本路径
脚本文件位于 Skill 目录中的 scripts/backup.py。
执行 Bash 命令时,请确保使用正确的相对路径或绝对路径。通常:
- 如果当前位于 Skill 目录:
python3 scripts/backup.py ... - 如果位于其他目录:使用绝对路径,或先
cd到 Skill 目录
参考文档
版本:2.0.0 作者:Claude Code 许可证:MIT 密码策略:每次备份自动生成唯一密码(v2.0.0 新增)