Skip to main content

OpenClaw 自动备份系统实战:保护你的 AI 记忆和配置

·1990 words·4 mins

背景
#

在部署 OpenClaw 和个人博客的过程中,我意识到一个关键问题:数据安全性

OpenClaw 的记忆系统记录了:

  • 用户偏好和配置
  • 项目进度和决策
  • 重要操作记录
  • 博客运营信息

这些数据如果丢失,重新配置的成本极高。同时,博客的文章内容、主题定制、SSL 证书等也需要定期备份。

为此,我设计并实现了一套自动备份系统,每天凌晨自动备份关键数据,保留 30 天滚动窗口。


备份需求分析
#

需要备份的内容
#

类别 路径(示例) 重要性 备份频率
博客内容 /var/www/your-site/content/ ⭐⭐⭐⭐⭐ 每天
博客配置 hugo.toml / layouts/ ⭐⭐⭐⭐⭐ 每天
SSL 证书 /etc/letsencrypt/ ⭐⭐⭐⭐⭐ 每天
Nginx 配置 /etc/nginx/sites-enabled/ ⭐⭐⭐⭐ 每天
OpenClaw 记忆 MEMORY.md / memory/ ⭐⭐⭐⭐⭐ 每天
OpenClaw 配置 AGENTS.md / SOUL.md ⭐⭐⭐⭐⭐ 每天
构建输出 public/ ⭐⭐⭐ 每周

⚠️ 安全提示:文中路径为示例,请替换为你自己的实际路径。

备份策略
#

存储位置:/backup/ 目录
保留周期:30 天(自动清理)
压缩格式:tar.gz
执行时间:凌晨 3:00-3:30(低峰期)

博客备份脚本
#

创建文件 BLOG_DIR/backup.shBLOG_DIR 替换为你的博客根目录):

#!/bin/bash
# backup.sh - 博客备份脚本
# 每天凌晨 3:00 执行,备份到 /backup/your-site/

BACKUP_DIR="/backup/your-site"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="blog_backup_${DATE}"
KEEP_DAYS=30
BLOG_ROOT="/var/www/your-site"  # ⚠️ 替换为你的博客路径

# 创建备份目录
mkdir -p ${BACKUP_DIR}/${BACKUP_NAME}

# 备份博客核心内容
tar -czf ${BACKUP_DIR}/${BACKUP_NAME}/content.tar.gz \
  ${BLOG_ROOT}/content/ \
  ${BLOG_ROOT}/hugo.toml \
  ${BLOG_ROOT}/layouts/ \
  ${BLOG_ROOT}/assets/ \
  2>/dev/null

# 备份 SSL 证书
if [ -d "/etc/letsencrypt/live/your-domain/" ]; then
  tar -czf ${BACKUP_DIR}/${BACKUP_NAME}/ssl.tar.gz \
    /etc/letsencrypt/live/your-domain/ \
    2>/dev/null
fi

# 备份 Nginx 配置
if [ -f "/etc/nginx/sites-enabled/your-domain" ]; then
  cp /etc/nginx/sites-enabled/your-domain \
    ${BACKUP_DIR}/${BACKUP_NAME}/nginx.conf 2>/dev/null
fi

# 备份构建输出(每周一次,周日)
if [ $(date +%u) -eq 7 ]; then
  tar -czf ${BACKUP_DIR}/${BACKUP_NAME}/public.tar.gz \
    ${BLOG_ROOT}/public/ \
    2>/dev/null
fi

# 删除 30 天前的备份
find ${BACKUP_DIR} -name "blog_backup_*" -type d -mtime +${KEEP_DAYS} -exec rm -rf {} \; 2>/dev/null

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Blog backup completed: ${BACKUP_NAME}"

关键点说明:

  1. 路径变量化:使用 BLOG_ROOT 变量,便于修改
  2. 条件备份:SSL 和 Nginx 配置使用 if 判断,避免路径不存在时报错
  3. 周日额外备份public/ 目录较大,只在每周日备份
  4. 自动清理find -mtime +30 删除 30 天前的备份
  5. 错误抑制2>/dev/null 避免 cron 发送邮件

OpenClaw 备份脚本
#

创建文件 ~/.openclaw/scripts/backup-openclaw.sh

#!/bin/bash
# backup-openclaw.sh - OpenClaw 配置备份脚本
# 每天凌晨 3:30 执行,备份到 /backup/openclaw/

BACKUP_DIR="/backup/openclaw"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="openclaw_backup_${DATE}"
KEEP_DAYS=30
WORKSPACE="$HOME/.openclaw/workspace"  # ⚠️ 使用环境变量,适配不同用户

# 创建备份目录
mkdir -p ${BACKUP_DIR}/${BACKUP_NAME}

# 备份长期记忆和每日记忆(最重要)
tar -czf ${BACKUP_DIR}/${BACKUP_NAME}/memory.tar.gz \
  ${WORKSPACE}/MEMORY.md \
  ${WORKSPACE}/memory/ \
  2>/dev/null

# 备份配置文件
tar -czf ${BACKUP_DIR}/${BACKUP_NAME}/config.tar.gz \
  ${WORKSPACE}/AGENTS.md \
  ${WORKSPACE}/SOUL.md \
  ${WORKSPACE}/USER.md \
  ${WORKSPACE}/IDENTITY.md \
  ${WORKSPACE}/TOOLS.md \
  ${WORKSPACE}/HEARTBEAT.md \
  2>/dev/null

# 备份项目文件(如果有)
if [ -d "${WORKSPACE}/projects/" ]; then
  tar -czf ${BACKUP_DIR}/${BACKUP_NAME}/projects.tar.gz \
    ${WORKSPACE}/projects/ \
    2>/dev/null
fi

# 备份图片资源
if [ -d "${WORKSPACE}/images/" ]; then
  tar -czf ${BACKUP_DIR}/${BACKUP_NAME}/images.tar.gz \
    ${WORKSPACE}/images/ \
    2>/dev/null
fi

# 删除 30 天前的备份
find ${BACKUP_DIR} -name "openclaw_backup_*" -type d -mtime +${KEEP_DAYS} -exec rm -rf {} \; 2>/dev/null

echo "[$(date '+%Y-%m-%d %H:%M:%S')] OpenClaw backup completed: ${BACKUP_NAME}"

记忆文件优先级最高:

  • MEMORY.md:长期记忆,包含用户偏好、项目信息、重要决策
  • memory/:每日记忆,详细的操作记录和时间线
  • 这些文件丢失后,重新配置成本最高

配置定时任务
#

使用 crontab -e 添加定时任务:

# 博客备份 - 每天凌晨 3:00
0 3 * * * /var/www/your-site/backup.sh

# OpenClaw 备份 - 每天凌晨 3:30
30 3 * * * $HOME/.openclaw/scripts/backup-openclaw.sh

⚠️ 注意:将 /var/www/your-site/ 替换为你的实际博客路径

时间选择理由:

  • 凌晨 3 点是访问低峰期
  • 两个任务间隔 30 分钟,避免 IO 冲突
  • 即使第一个任务延迟,也不会影响第二个

测试备份
#

手动运行测试
#

# 测试博客备份
/var/www/your-site/backup.sh

# 测试 OpenClaw 备份
~/.openclaw/scripts/backup-openclaw.sh

验证备份文件
#

# 查看博客备份
ls -lh /backup/your-site/

# 查看 OpenClaw 备份
ls -lh /backup/openclaw/

# 检查备份内容
tar -tzf /backup/your-site/blog_backup_*/content.tar.gz | head -20

预期输出
#

[2026-03-14 10:30:00] Blog backup completed: blog_backup_20260314_103000
[2026-03-14 10:30:01] OpenClaw backup completed: openclaw_backup_20260314_103001

恢复流程
#

博客恢复
#

# 1. 找到最近的备份
ls -lt /backup/your-site/ | head -5

# 2. 解压内容
tar -xzf /backup/your-site/blog_backup_20260314_103000/content.tar.gz -C /

# 3. 恢复 SSL 证书
tar -xzf /backup/your-site/blog_backup_20260314_103000/ssl.tar.gz -C /

# 4. 恢复 Nginx 配置
cp /backup/your-site/blog_backup_20260314_103000/nginx.conf \
  /etc/nginx/sites-enabled/your-domain

# 5. 重新构建博客
cd /var/www/your-site && hugo --minify

# 6. 重启 Nginx
systemctl restart nginx

OpenClaw 恢复
#

# 1. 找到最近的备份
ls -lt /backup/openclaw/ | head -5

# 2. 解压记忆文件
tar -xzf /backup/openclaw/openclaw_backup_20260314_103001/memory.tar.gz \
  -C $HOME/.openclaw/workspace/

# 3. 解压配置文件
tar -xzf /backup/openclaw/openclaw_backup_20260314_103001/config.tar.gz \
  -C $HOME/.openclaw/workspace/

# 4. 重启 OpenClaw Gateway
openclaw gateway restart

备份监控
#

检查备份状态
#

# 查看最近的备份时间
ls -lt /backup/your-site/ | head -1
ls -lt /backup/openclaw/ | head -1

# 检查 cron 日志
grep backup /var/log/cron.log | tail -10

添加健康检查
#

HEARTBEAT.md 中添加定期检查:

# 每周检查备份状态
- [ ] 博客备份是否正常(/backup/your-site/)
- [ ] OpenClaw 备份是否正常(/backup/openclaw/)
- [ ] 备份文件大小是否合理
- [ ] 清理 30 天前的旧备份

进阶方案
#

远程备份
#

# 使用 rsync 同步到远程服务器
rsync -avz /backup/ user@remote-server:/backup/

# 或使用阿里云 OSS
ossutil cp -r /backup/ oss://your-bucket/backup/

加密备份
#

# 使用 gpg 加密
tar -czf - /path/to/backup | gpg -c > backup.tar.gz.gpg

Git 版本控制
#

对于博客内容,可以使用 Git 进行版本管理:

cd /var/www/your-site
git add content/
git commit -m "Backup: $(date +%Y%m%d)"
git push origin main

总结
#

核心要点
#

  1. 分层备份:博客和 OpenClaw 分开备份,便于管理
  2. 定时执行:凌晨低峰期自动运行,无需人工干预
  3. 滚动窗口:保留 30 天,平衡存储成本和恢复需求
  4. 恢复测试:定期验证备份文件可用性

成本估算
#

项目 存储占用 成本
博客备份 ~50MB/天 免费(本地)
OpenClaw 备份 ~10MB/天 免费(本地)
30 天总计 ~1.8GB 免费

下一步计划
#

  • 配置远程备份(阿里云 OSS)
  • 添加备份失败告警
  • 每周自动验证恢复流程
  • 增量备份优化

安全提醒 ⚠️
#

发布技术文章时注意脱敏:

  1. 路径脱敏:使用 your-siteyour-domain 等占位符
  2. 用户名脱敏:使用 $HOME$USER 变量
  3. IP 地址:不要暴露服务器公网 IP
  4. API Key:绝对不要出现在文章中
  5. 具体配置:端口、密码等敏感信息需模糊化

原则: 让读者能看懂方法论,但无法推断出你的具体环境。


备份是最后的防线。 在 AI 助手管理你的配置和记忆时,确保这些数据有可靠的备份机制,是运维工作的基本要求。