OpenClaw 极简迁移:从 1.7G 压缩到 42M 的实战记录
今天把 OpenClaw 从一台服务器迁出去。摸了一下部署情况,发现原始数据 1.7G,但其实真正要备份的只有 42M。把整个过程记一下,以后再迁可以直接套用。
一、为什么是 1.7G,不是几十兆?
跑 du -sh /root/.openclaw/ 看到 1.7G,但拆开看大头都是可重建的:
agents/main/sessions/:1018M,纯历史会话日志,新服务器不需要workspace-canmou/fundquant/venv:313M,Python 虚拟环境,pip install就能重建agents/{其他}/sessions/:约 150M,同上- 真正需要带的:配置 + 工作区 + 记忆 = 42M
教训:迁移之前先看 du -ah | sort -rh | head -20,别傻乎乎 tar czf 整个目录,那叫全量备份不叫迁移。
二、核心原则:能重建的全不背
| 类别 | 处理 |
|---|---|
| OpenClaw 主程序 + node_modules | 新服务器 npm install -g openclaw |
| Python venv | 新服务器 python -m venv + pip install |
| sessions 日志 | 直接扔,记忆在 sqlite 里 |
| 配置 / 工作区 / 记忆 | ✅ 这才是真要带的 |
三、真正要备份的 4 样东西
1. openclaw.json(12K)
飞书/GitHub/七牛等所有 key + 9 个 agent 路由配置。这是命根子。
2. memory/ 目录(696K)
最初我以为记忆是 memory/YYYY-MM-DD.md 这种 md 文件,实际看了下 OpenClaw 源码才发现是 9 个 sqlite 数据库(每个 agent 一个)。
sqlite3 memory/main.sqlite "SELECT * FROM files LIMIT 5"
-- MEMORY.md, memory/2026-03-06.md, ...
里面有 chunks(442 个记忆块)、chunks_fts(全文索引)、embedding_cache(向量缓存)。整库带走,新服务器解包就能用,搜索/记忆功能立即恢复。
3. workspace/ 主工作区(29M)
49 个 skills + 21 个 projects + 46 个 scripts + 8 个核心 md(MEMORY/SOUL/AGENTS/TOOLS/USER/IDENTITY/HEARTBEAT/PROGRESS)。
排除规则要写对,否则会把 node_modules、.git、venv、__pycache__ 这些 GB 级垃圾也带进来:
tar czf workspace.tar.gz \
--exclude='node_modules' \
--exclude='.git' \
--exclude='__pycache__' \
--exclude='venv' \
--exclude='media' \
--exclude='.next' \
workspace/
4. 9 个子工作区(共 ~12M)
workspace-{canmou,ceo,creator,jiaoyi,jinhua,kylin,shequ,yunving,yunying},每个 agent 一个。
四、端到端操作步骤
假设:老服务器 A(big.imoons.cn)→ 新服务器 B,A 和 B 之间网络不一定通。
老服务器 A(4 步)
# 1. 备份
bash /root/.openclaw/workspace/scripts/migrate-openclaw.sh
# 输出:/tmp/openclaw-migrate-20260605-XXXXXX/,含 13 个文件,总 42M
# 2. 打包
tar czf /tmp/openclaw-migrate.tar.gz -C /tmp openclaw-migrate-20260605-XXXXXX/
# 3. 上传七牛(永久 token)
python3 -c "
from qiniu import Auth, put_file_v2
q = Auth('AK', 'SK')
token = q.upload_token('taojinai', 'openclaw-migrate-20260605.tar.gz', 3600*24*365*10)
put_file_v2(token, 'openclaw-migrate-20260605.tar.gz', '/tmp/openclaw-migrate.tar.gz')
"
# 4. 验证 CDN
curl -I https://cdn.imoons.cn/openclaw-migrate-20260605.tar.gz
新服务器 B(3 步)
# 1. 下载 + 校验(42M,1-2 分钟)
wget -O /tmp/openclaw-migrate.tar.gz https://cdn.imoons.cn/openclaw-migrate-20260605.tar.gz
echo "2c4ad6cd709fd12f8676803c8fd5d9e15578c3ba1f4d99e156981abffc7274a7 /tmp/openclaw-migrate.tar.gz" | sha256sum -c
# 2. 准备 init 脚本(任选一种)
scp root@老IP:/root/.openclaw/workspace/scripts/init-new-server.sh /tmp/
chmod +x /tmp/init-new-server.sh
# 3. 一键初始化
bash /tmp/init-new-server.sh
# 自动跑完 7 步:下载→校验→装Node→装OpenClaw→解压→还原→启动
总耗时:老服务器 5 分钟 + 上传 3 分钟 + 新服务器 5 分钟 = 约 15 分钟全跑完。
五、写成 3 个脚本
备份脚本 migrate-openclaw.sh
8 步流水化:
[1/4] 备份 openclaw.json
[2/4] 备份 workspace/
[3/4] 备份 9 个子工作区
[4/4] 备份 memory/ 目录
最终产出 13 个文件,总 42M。
还原脚本 migrate-openclaw-restore.sh
[1/7] 还原 openclaw.json
[2/7] 还原 workspace/
[3/7] 还原 9 个子工作区
[4/7] 还原 memory/
[5/7] 还原自定义 skills
[6/7] 还原 agents 配置
[7/7] 还原 cron
新服务器一键脚本 init-new-server.sh
这个最香。新服务器一行命令搞定全流程:
bash init-new-server.sh
脚本会自动:
1. 从七牛 CDN 下载备份包
2. SHA256 校验
3. 装 Node 22 + Python3
4. npm install -g openclaw
5. 解压 + 还原数据
6. 启动 gateway + 输出验证报告
六、传七牛:先 7 天后改永久
第一次上传 token 写的是 3600*24*7(7 天有效期),传完才反应过来不对——这玩意要长期给新服务器用。改 3600*24*365*10(10 年)重新传了一次。
教训:上传之前想清楚”这文件生命周期多长”。临时调试用的 token 7 天没问题,生产包要传永久。
最终链接:
https://cdn.imoons.cn/openclaw-migrate-20260605.tar.gz
| 项 | 值 |
|---|---|
| 大小 | 42M |
| SHA256 | 2c4ad6cd709fd12f8676803c8fd5d9e15578c3ba1f4d99e156981abffc7274a7 |
| 有效期 | 永久(10 年 token) |
| 适用 | 新服务器一键还原 OpenClaw 全量部署 |
七、踩坑记录
1. 第一次 sha256 输出空 hash:tar 之后再 sha256 时管道被卡了,导致 hash 是空文件的 hash。重新打一次再 sha256 才对。
2. memory 备份看起来”全空”:tar 列出来一堆 *.sqlite-shm / *.sqlite-wal 临时文件,md 文件数 = 0。别慌,实际记忆在 sqlite 里,不是 md。
3. 第一次脚本里写了 media/ 文件夹 63M:后来改成默认不备,需要时 ENABLE_MEDIA=1 启用。少带 60M 没关系,多带 60M 没必要。
4. scp 不知道能不能用(新老服务器之间网络不一定通),所以上传到七牛中转最稳。永远假设服务器之间网络是坏的,用 CDN 中转。
八、最终数据
原始大小:1.7G
备份大小:42M(压缩率 97.5%)
传输时间:~3 分钟(七牛上传)
还原时间:< 5 分钟(脚本一键)
省 97.5% 体积,省 100% 重建时间。
经验
- 迁移前先
du -ah | sort -rh摸底:8 成是大文件可重建,1 成是真要带的 - 能重建的全不背:node_modules / venv / sessions / 缓存
- 配置文件 + 工作区 + 记忆 = 黄金三件套:所有 OpenClaw 迁移都是这个套路
- 新服务器脚本是核心交付物:写好 init 脚本,整个迁移就完成 90%
- CDN 中转优于直连:scp 不一定通,CDN 永远通
- SHA256 一定要验:传错版本调一天