为什么你需要给 OpenClaw 做云端灾备?
试想一下这个场景:你已经花了整整 100 个小时,深度调教了你的 OpenClaw。它现在非常懂你,写出了完美的提示词,攒了一套极度顺手的技能脚本。
但突然有一天,服务器硬盘报废了;或者你在深夜头脑不清醒时,手滑敲错了一行不可逆的删除命令。几个月积累的“数字资产”,会不会瞬间灰飞烟灭?

这种担忧非常现实。你在 OpenClaw 里的工作区,本质上就是你最宝贵的数字资产。为了睡个安稳觉,我们需要一套自动化的云端备份方案:
- 异地容灾:机器真坏了,拉起一台新机器,一键克隆代码库,立刻满血复活。
- 后悔药(版本回滚):随时对比这周和上周的配置差异,改废了也能一键撤销。
- 改动审计:什么时候加了新技能?什么时候动了底层设置?Git 历史里记得清清楚楚。
这份文档不仅教你备份,还要帮你避开一个无数人踩过的巨坑:千万不要在 Docker 容器里生成 SSH 密钥。容器一重启,密钥就没了,GitHub 验证又得从头来。
我们的解法更稳:把密钥留在宿主机(你的服务器本身),让容器只读借用;然后直接用宿主机把工作区推送到 GitHub。
前提假设(请核对你的环境)
本文假设你的目录长这样(标准的 OpenClaw 部署结构):
/opt/openclaw/
├─ Dockerfile
├─ docker-compose.yml
├─ sync_infini.sh(你的同步脚本)
├─ ssh/(我们将要用来放钥匙的地方)
└─ data/(OpenClaw 实际干活的目录)
一个关键提示:下面很多命令都带了一长串 su -s /bin/sh -c '...' opc。别被吓到,这其实只是为了让你在不切换当前账号的情况下,强制用 opc 这个普通用户的身份去执行命令。这样生成的文件才不会变成“root 专属”,从而避免后续 Git 报出一堆权限安全错误。
如果你的日常用户名不叫 opc,请把下面所有的 opc 替换成你实际的用户名。
第一步:确认身份和地盘
在 Linux 世界里,权限就是一切。Docker 里的 OpenClaw 默认用的是一个 UID(用户 ID)为 1000 的虚拟用户。为了让外面和里面能毫无障碍地读写文件,我们需要确认服务器外面的用户 UID 也是 1000。
查一下 UID 1000 的真实身份
Bash
getent passwd 1000
确认输出的是你预期的用户(比如 opc)。
宣誓主权
确保整个 /opt/openclaw 目录都归这个用户管:
Bash
chown -R opc:opc /opt/openclaw
第二步:打造专用的 GitHub 钥匙
记住核心原则:这把钥匙我们只在宿主机生成,并且只给宿主机的 opc 用来备份代码。
建一个防盗门(存放目录)
Bash
mkdir -p /opt/openclaw/ssh
chown -R opc:opc /opt/openclaw/ssh
chmod 700 /opt/openclaw/ssh
打一把新钥匙
密码留空(-N ""),这样以后自动化脚本推送时才不会卡住问你要密码:
Bash
su -s /bin/sh -c 'ssh-keygen -t ed25519 -C "openclaw-github" -f /opt/openclaw/ssh/id_ed25519 -N ""' opc
chmod 600 /opt/openclaw/ssh/id_ed25519
chmod 644 /opt/openclaw/ssh/id_ed25519.pub
把公钥交给 GitHub
在服务器上打印出公钥的内容:
Bash
cat /opt/openclaw/ssh/id_ed25519.pub
复制这串字符。打开 GitHub 网页:Settings → SSH and GPG keys → New SSH key,把它粘贴进去保存。
第三步:给这把钥匙写个导航说明
你可能遇到过这种情况:第一次用 SSH 连一台新机器时,终端会弹出一句 Are you sure you want to continue connecting (yes/no)?。
如果是人敲键盘,打个 yes 就行。但以后我们要让机器自动备份,它可不会打字,整个流程就会死卡在这里。
提前记录 GitHub 的指纹(免除交互)
Bash
mkdir -p /home/opc/.ssh
chown opc:opc /home/opc/.ssh
chmod 700 /home/opc/.ssh
su -s /bin/sh -c 'ssh-keyscan github.com >> /home/opc/.ssh/known_hosts' opc
chown opc:opc /home/opc/.ssh/known_hosts
chmod 644 /home/opc/.ssh/known_hosts
写配置文件指定钥匙
明确告诉系统,连 GitHub 时就用刚才打的那把钥匙:
Bash
cat > /home/opc/.ssh/config <<'EOF'
Host github.com
HostName github.com
User git
IdentityFile /opt/openclaw/ssh/id_ed25519
IdentitiesOnly yes
EOF
chown opc:opc /home/opc/.ssh/config
chmod 600 /home/opc/.ssh/config
测试一下路通不通
Bash
su -s /bin/sh -c 'ssh -T [email protected]' opc
如果你看到了类似认证成功的提示(提示不提供 shell access 是正常的),就可以放心往下走了。
第四步:排雷,清理内嵌的 Git 仓库
这是很多人很容易忽视的一步。
如果你曾经在 data/workspace 这个核心目录里手痒敲过 git init,它里面就会藏着一个 .git 文件夹。
当我们现在想在最外层 /opt/openclaw 建立一个大仓库把所有东西包起来时,外面的 Git 看到里面还有一个 Git,就会把它当成一个“引用(gitlink)”。结果就是,你的代码推到 GitHub 上后,那个文件夹会变成一个带箭头的灰色图标,根本点不开,里面的文件也没备份上去。
所以,我们要先做个大扫除:
Bash
rm -rf /opt/openclaw/data/workspace/.git
rm -f /opt/openclaw/data/workspace/.gitmodules 2>/dev/null || true
如果你之前没在里面搞过 Git,这步不会有任何报错,安全通过。
第五步:建立大仓库并立下规矩
初始化外层仓库
进入最外层目录,建立监控一切的主仓库:
Bash
su -s /bin/sh -c 'cd /opt/openclaw && git init' opc
su -s /bin/sh -c 'cd /opt/openclaw && git branch -M main' opc
设置你的作者身份
这只对当前仓库生效,不会弄乱你服务器上的其他项目:
Bash
su -s /bin/sh -c 'cd /opt/openclaw && git config user.name "你的用户名"' opc
su -s /bin/sh -c 'cd /opt/openclaw && git config user.email "你的邮箱"' opc
最关键的一步:写 .gitignore 过滤名单
我们的目标很明确:
- 要备份:各种启动配置文件(
Dockerfile等)、openclaw.json、以及你的核心工作区workspace/。 - 绝对不能备份:SSH 私钥(传上去就全网裸奔了)、各种日志、缓存、凭据文件。
- 分头行动的不管:比如
workspace/orgmode如果你已经用了 WebDAV 同步,就不要让 Git 再掺和了。
把下面这套精心调配的规则直接覆盖进去:
Bash
cat > /opt/openclaw/.gitignore <<'EOF'
# =========================
# /opt/openclaw 灾备策略
# =========================
# ---------- 1) 绝对不要进 Git 的敏感内容 ----------
ssh/
**/.ssh/
**/id_rsa
**/id_ed25519
**/known_hosts
**/*.key
**/*.pem
.env
.env.*
# ---------- 2) data/ 默认全忽略,只开绿灯放行需要的 ----------
data/**
# 绿灯放行:主配置
!data/openclaw.json
# 绿灯放行:workspace 工作区
!data/workspace/
!data/workspace/**
# 红灯拦截:明确排除 orgmode(它走 WebDAV 同步)
data/workspace/orgmode/
data/workspace/orgmode/**
# 红灯拦截:运行态凭据目录,永远不进 Git
data/credentials/
data/credentials/**
# ---------- 3) 噪声和垃圾 ----------
*.log
log/
logs/
tmp/
temp/
*~
*.tmp
__pycache__/
*.pyc
node_modules/
*.sqlite
*.sqlite3
Dockerfile.bak.*
EOF
chown opc:opc /opt/openclaw/.gitignore
第六步:完成第一次历史性备份
把文件装入箱子
只添加我们允许备份的内容:
Bash
su -s /bin/sh -c 'cd /opt/openclaw && git add .gitignore Dockerfile docker-compose.yml sync_infini.sh data/openclaw.json data/workspace' opc
安检(极其重要)
提交前最后确认一眼,没有把不该传的带进去。下面两行命令如果输出都是 OK,就说明绝对安全:
Bash
su -s /bin/sh -c 'cd /opt/openclaw && (git ls-files | grep -E "^data/workspace/orgmode/" && echo BAD || echo OK)' opc
su -s /bin/sh -c 'cd /opt/openclaw && (git ls-files | grep -E "^data/credentials/" && echo BAD || echo OK)' opc
打上封条并推送到云端
提交本次备份:
Bash
su -s /bin/sh -c 'cd /opt/openclaw && git commit -m "backup: openclaw infra + config + workspace"' opc
绑定你的私有仓库(记得把地址换成你自己的):
Bash
su -s /bin/sh -c 'cd /opt/openclaw && git remote add origin [email protected]:你的用户名/你的仓库.git' opc
推送到远端的主分支:
Bash
su -s /bin/sh -c 'cd /opt/openclaw && git push -u origin main --force' opc
这里加了 --force 是以防你远端仓库之前建的时候带了默认的 README,我们直接以这次的本地代码为绝对准则。
第七步:打造自动备份机器人(定时任务)
你肯定不想每天手工跑一遍备份命令。既然是数字资产,全自动才靠谱。
问题来了:OpenClaw 运行时会不停地改写 workspace。如果我们让它“一有改动就提交”,那你的 Git 历史会被刷出成百上千个毫无意义的碎片提交。
更体面的策略是:按固定时间频率(比如每2小时)检查一次,有变化才打包推上去,提交信息直接写上当前时间戳。
这样哪怕服务器彻底冒烟了,你最多也就损失过去2小时内的调教记录。
写一个智能同步脚本
把这段逻辑存到 /opt/openclaw/git_sync.sh 里:
Bash
cat > /opt/openclaw/git_sync.sh <<'EOF'
#!/bin/sh
set -eu
REPO_DIR="/opt/openclaw"
LOG_DIR="/home/opc/.cache"
LOG_FILE="${LOG_DIR}/openclaw_git_sync.log"
mkdir -p "$LOG_DIR"
cd "$REPO_DIR"
git add -A
# 检查一下有没有真正的改动
if git diff --cached --quiet; then
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) no changes" >> "$LOG_FILE"
exit 0
fi
# 有改动,打上时间戳并推送
TS="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
git commit -m "backup: ${TS}"
git push || { echo "${TS} push failed" >> "$LOG_FILE"; exit 0; }
echo "${TS} pushed" >> "$LOG_FILE"
EOF
chown opc:opc /opt/openclaw/git_sync.sh
chmod 755 /opt/openclaw/git_sync.sh
交给系统管家(Cron)
我们让 Linux 的定时任务工具 Cron 每 2 小时帮你跑一次这个脚本:
Bash
su -s /bin/sh -c '(crontab -l 2>/dev/null; echo "0 */2 * * * /opt/openclaw/git_sync.sh") | crontab -' opc
如果你调教得非常频繁,想每 1 小时备一次,就把上面的 0 */2 * * * 改成 0 * * * *。
结语:拿回属于你的控制感
折腾到这里,你已经构建起了一道坚固的防线。
你真正追求的,从来不是“祈祷这台破服务器千万别出故障”,而是“哪怕它现在就炸了,我喝杯咖啡的功夫也能把它原样拉起来”。
将易逝的密钥固化在宿主机,将珍贵的工作区托付给版本控制,再加上不知疲倦的定时任务——现在,你可以放开手脚,大胆地去折腾你的 AI 了。