VPS Backup Skill
Automated daily backup for OpenClaw VPS deployments using restic — encrypted, incremental, deduplicating snapshots with retention management and optional offsite push.
What Gets Backed Up
| Path | Contents | Why |
|---|
| INLINECODE0 | Workspace, memory, sessions, configs | Core agent state |
| INLINECODE1 |
Agents, skills, OpenCode models | Agentic coding setup |
|
~/.ssh | SSH keys | Access to all services |
|
~/.npm-global | Global npm packages | Tools installed |
|
~/workspace/projects | All project source code | Your work |
| Session transcripts | Exported via
export_sessions.py | Human-readable chat history |
Excluded (reconstructable): node_modules/, __pycache__/, *.pyc, *.log, tmp/, *.sqlite, INLINECODE12
Setup
1. Install restic
CODEBLOCK0
2. Install rclone (for offsite push — optional)
CODEBLOCK1
3. Configure the script
Edit the top config section of scripts/vps-backup.sh:
CODEBLOCK2
4. Set encryption password
CODEBLOCK3
5. (Optional) Configure rclone for offsite push
CODEBLOCK4
6. Schedule daily run
CODEBLOCK5
Or schedule via OpenClaw cron:
CODEBLOCK6
Daily Usage
CODEBLOCK7
Restore
CODEBLOCK8
Offsite Push
Set the RCLONE_DEST environment variable before running:
CODEBLOCK9
The script automatically detects rclone and RCLONE_DEST and syncs after each backup.
Retention Policy
4 |
| Monthly | 6 |
Old snapshots are pruned automatically after each run.
Health Check
The script checks for at least one snapshot in the last 26 hours. If missing, it logs a HEALTH FAILED error.
Add a monitoring check to your alerting:
CODEBLOCK10
Files
- -
scripts/vps-backup.sh — the backup script - INLINECODE19 — session transcript exporter (optional but recommended)
- INLINECODE20 — environment variable reference
VPS 备份技能
使用 restic 为 OpenClaw VPS 部署提供每日自动备份——加密、增量、去重快照,支持保留策略管理和可选的异地推送。
备份内容
| 路径 | 内容 | 原因 |
|---|
| ~/.openclaw | 工作区、记忆、会话、配置 | 核心代理状态 |
| ~/.config/opencode |
代理、技能、OpenCode 模型 | 代理编码设置 |
| ~/.ssh | SSH 密钥 | 访问所有服务 |
| ~/.npm-global | 全局 npm 包 | 已安装工具 |
| ~/workspace/projects | 所有项目源代码 | 你的工作 |
| 会话记录 | 通过 export_sessions.py 导出 | 可读的聊天历史 |
排除项(可重建):node_modules/、pycache/、.pyc、.log、tmp/、*.sqlite、.cache/
设置
1. 安装 restic
bash
Linux(其他系统:https://restic.net/install/)
curl -LO https://github.com/restic/restic/releases/latest/download/restic
linuxamd64.tar.gz
tar xzf restic
linuxamd64.tar.gz
sudo mv restic /usr/local/bin/
restic version
2. 安装 rclone(用于异地推送——可选)
bash
curl -LO https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
sudo cp rclone-linux-amd64/rclone /usr/local/bin/
rclone version
3. 配置脚本
编辑 scripts/vps-backup.sh 顶部的配置部分:
bash
BACKUP_ROOT=/home/dev/backup/vps-daily # 本地备份根目录
BACKUP_PATHS=( # 要备份的内容
/home/dev/.openclaw
/home/dev/.config/opencode
/home/dev/.ssh
/home/dev/.npm-global/lib/node_modules
/workspace/projects
)
SESSIONEXPORT=/home/dev/.openclaw/workspace/scripts/exportsessions.py
4. 设置加密密码
bash
生成强密码
openssl rand -base64 32 > ~/.backup-password
chmod 600 ~/.backup-password
5. (可选)配置 rclone 用于异地推送
bash
rclone config
按照提示添加你的云存储(Backblaze B2、Google Drive 等)
6. 安排每日运行
bash
添加到 crontab(每天 UTC 时间凌晨 3 点运行)
0 3
* export BACKUP_PASSWORD=$(cat ~/.backup-password) && export PATH=$HOME/bin:$PATH && bash /path/to/vps-backup.sh >> /var/log/vps-backup.log 2>&1
或通过 OpenClaw cron 安排:
every: 24h | sessionTarget: isolated | model: glm-5
message: 运行:export BACKUP_PASSWORD=$(cat ~/.backup-password) && export PATH=\$HOME/bin:$PATH\ && bash /home/dev/scripts/vps-backup.sh
日常使用
bash
手动运行备份
export BACKUP_PASSWORD=$(cat ~/.backup-password)
export PATH=$HOME/bin:$PATH
bash /home/dev/scripts/vps-backup.sh
检查快照数量
export RESTIC_PASSWORD=$(cat ~/.backup-password)
export PATH=$HOME/bin:$PATH
restic snapshots --repo /home/dev/backup/vps-daily/restic-repo
验证备份完整性
restic check --repo /home/dev/backup/vps-daily/restic-repo
列出仓库大小
du -sh /home/dev/backup/vps-daily/
恢复
bash
恢复特定路径的最新快照
export RESTIC_PASSWORD=$(cat ~/.backup-password)
export PATH=$HOME/bin:$PATH
restic restore latest \
--repo /home/dev/backup/vps-daily/restic-repo \
--target /tmp/restore \
--path /home/dev/.openclaw
列出特定日期的快照
restic snapshots --repo /home/dev/backup/vps-daily/restic-repo \
--tag date-2026-03-31
按 ID 恢复特定快照
restic restore abc123 \
--repo /home/dev/backup/vps-daily/restic-repo \
--target /tmp/restore
异地推送
在运行前设置 RCLONE_DEST 环境变量:
bash
Backblaze B2 示例:
export RCLONE_DEST=b2:my-bucket/vps-backups
export BACKUP_PASSWORD=$(cat ~/.backup-password)
export PATH=$HOME/bin:$PATH
bash /home/dev/scripts/vps-backup.sh
输出包含:异地推送完成 ✓
Google Drive:
export RCLONE_DEST=gcache:openclaw-backups
脚本会自动检测 rclone 和 RCLONE_DEST,并在每次备份后同步。
保留策略
4 |
| 每月 | 6 |
每次运行后会自动清理旧快照。
健康检查
脚本会检查过去 26 小时内是否至少有一个快照。如果缺失,会记录 健康检查失败 错误。
在告警系统中添加监控检查:
bash
如果没有最近的备份则告警
RECENT=$(RESTIC_PASSWORD=$(cat ~/.backup-password) restic snapshots \
--repo /home/dev/backup/vps-daily/restic-repo \
--json 2>/dev/null | python3 -c
import sys,json,datetime
cutoff=datetime.datetime.now(datetime.timezone.utc)-datetime.timedelta(hours=26)
print(sum(1 for s in json.load(sys.stdin)
if datetime.datetime.fromisoformat(s[time].replace(Z,+00:00))>cutoff))
)
if [ $RECENT -eq 0 ]; then
echo 告警:26 小时内无备份!
fi
文件
- - scripts/vps-backup.sh — 备份脚本
- scripts/export_sessions.py — 会话记录导出器(可选但推荐)
- docs/config.md — 环境变量参考