OpenClaw Agent 工作區檔案(SOUL.md、MEMORY.md、IDENTITY.md、AGENTS.md、TOOLS.md)的加密備份與還原工具。使用 tar + openssl(AES-256-CBC)加密及 soul-upload.com API。每次備份會自動產生新的隨機密碼(請勿重複使用密碼)。適用於使用者需要:(1) 備份或上傳代理工作區檔案、(2) 還原或下載先前的備份、(3) 從遠端儲存刪除備份,或 (4) 管理加密的代理持久化資料。
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- 代理核心身份與目標MEMORY.md- 代理記憶與上下文IDENTITY.md- 代理身份定義AGENTS.md- 代理設定TOOLS.md- 工具設定
工作流程 1:上傳備份
觸發情境
當使用者要求備份工作區檔案時執行:
執行步驟
-
收集檔案清單
- 若使用者指定了檔案,則使用使用者指定的檔案
- 否則使用預設清單:
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 工具建立/更新
-
顯示成功訊息
- 通知使用者備份完成
- 顯示備份 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 是否正確安裝 |
對話範例
使用者:備份我的 SOUL.md 和 MEMORY.md
Claude:我將使用自動產生的加密來備份這些檔案。
[執行備份腳本]
備份完成!
- 備份 ID:3f8a2b1c-...
- 大小:45.2 KB
- 密碼:自動產生(32 字元)
- 復原資訊已儲存至 .openclaw-backup-recovery.txt
重要:請妥善保管 .openclaw-backup-recovery.txt!
其中包含還原此備份所需的密碼。
工作流程 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: ...」 | 檔案可能已損毀,請嘗試重新下載 |
對話範例
使用者:還原我最後的備份
Claude:我在 .openclaw-backup-recovery.txt 中找到最近的備份
- 備份 ID:3f8a2b1c-...
- 建立時間:2024-01-15 10:30:00 UTC
正在下載並解密備份...
還原完成!已解壓縮下列檔案:
- SOUL.md
- MEMORY.md
- IDENTITY.md
檔案已儲存至目前目錄,請確認內容是否正確。
工作流程 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" - 擷取 stdout(JSON 回應)和 stderr(進度資訊)
- 使用者確認後,執行指令:
-
處理回應
- 成功時,腳本輸出 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: ...」 | 建議檢查網路連線,詢問是否要重試 |
| 使用者取消 | 使用者拒絕確認 | 操作已取消,備份未被刪除 |
對話範例
使用者:刪除我的備份
Claude:我在 .openclaw-backup-recovery.txt 中找到下列備份:
1. 備份 ID:3f8a2b1c-...(2024-01-15 10:30:00)
2. 備份 ID:7b2c9d4e-...(2024-01-14 08:20:00)
請問要刪除哪一個備份?(1 或 2)
使用者:1
Claude:警告:這將永久刪除備份 3f8a2b1c-...
此操作無法復原。請確認刪除?(yes/no)
使用者:yes
Claude:備份已刪除。
- 備份 ID:3f8a2b1c-...
若要再次備份,請建立新的備份,系統會自動產生新密碼。
安全注意事項
密碼政策(新增)
- 自動產生密碼:每次備份會獲得一個獨一無二的 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
# 或
pip3 install requests
復原檔案遺失
問題:無法還原備份 - 復原檔案遺失
解決方法:
- 復原檔案至關重要 - 包含唯一的密碼副本
- 沒有復原檔案,備份無法還原
- 建議將復原檔案備份到另一個安全位置
- 若遺失,備份將永久無法存取
網路逾時
問題:上傳/下載時逾時
解決方法:
- 檢查網路連線
- 縮小備份檔案大小(移除不必要的檔案)
- 腳本預設逾時為 5 分鐘,通常足夠
檔案已存在
問題:還原時覆寫現有檔案
解決方法:
- 還原前先備份現有檔案
- 指定不同的輸出目錄
- 手動將現有檔案移至其他位置
使用範例
範例 1:備份所有預設檔案
使用者:備份我的工作區檔案
Claude:[使用預設檔案清單執行上傳工作流程]
[自動產生密碼並儲存至復原檔案]
範例 2:備份特定檔案
使用者:只備份 SOUL.md 和 MEMORY.md
Claude:[執行上傳工作流程,僅備份指定檔案]
[自動產生密碼並儲存至復原檔案]
範例 3:還原最新備份
使用者:還原我最後的備份
Claude:[從 .openclaw-backup-recovery.txt 讀取最新的備份 ID 與密碼]
[執行下載工作流程]
範例 4:還原特定備份
使用者:還原備份 3f8a2b1c-1234-5678-90ab-cdef12345678
Claude:[從復原檔案讀取此備份 ID 的密碼]
[執行下載工作流程]
範例 5:刪除舊備份
使用者:刪除我的舊備份
Claude:[從復原檔案顯示可用的備份清單]
[使用者選擇要刪除的備份]
[執行刪除工作流程]
[從復原檔案中移除該筆記錄]
最佳實務
- 定期備份:建議每週備份一次,或在重要變更後備份
- 復原檔案管理:妥善保管
.openclaw-backup-recovery.txt並另行備份 - 驗證還原:定期測試備份還原流程,確保備份可用
- 清理舊備份:定期刪除不需要的舊備份以節省儲存空間
- 多重副本:考慮將復原檔案存放在多個安全位置
腳本路徑
腳本檔案位於技能目錄的 scripts/backup.py。
執行 Bash 指令時,請確保使用正確的相對或絕對路徑。通常:
- 若目前在技能目錄中:
python3 scripts/backup.py ... - 若在其他目錄:使用絕對路徑或先
cd到技能目錄
參考文件
版本:2.0.0
作者:Claude Code
授權:MIT
密碼政策:每次備份自動產生唯一密碼(v2.0.0 新增)






