
背景 #
在部署 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.sh(BLOG_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}"关键点说明:
- 路径变量化:使用
BLOG_ROOT变量,便于修改 - 条件备份:SSL 和 Nginx 配置使用
if判断,避免路径不存在时报错 - 周日额外备份:
public/目录较大,只在每周日备份 - 自动清理:
find -mtime +30删除 30 天前的备份 - 错误抑制:
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 nginxOpenClaw 恢复 #
# 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.gpgGit 版本控制 #
对于博客内容,可以使用 Git 进行版本管理:
cd /var/www/your-site
git add content/
git commit -m "Backup: $(date +%Y%m%d)"
git push origin main总结 #
核心要点 #
- 分层备份:博客和 OpenClaw 分开备份,便于管理
- 定时执行:凌晨低峰期自动运行,无需人工干预
- 滚动窗口:保留 30 天,平衡存储成本和恢复需求
- 恢复测试:定期验证备份文件可用性
成本估算 #
| 项目 | 存储占用 | 成本 |
|---|---|---|
| 博客备份 | ~50MB/天 | 免费(本地) |
| OpenClaw 备份 | ~10MB/天 | 免费(本地) |
| 30 天总计 | ~1.8GB | 免费 |
下一步计划 #
- 配置远程备份(阿里云 OSS)
- 添加备份失败告警
- 每周自动验证恢复流程
- 增量备份优化
安全提醒 ⚠️ #
发布技术文章时注意脱敏:
- 路径脱敏:使用
your-site、your-domain等占位符 - 用户名脱敏:使用
$HOME或$USER变量 - IP 地址:不要暴露服务器公网 IP
- API Key:绝对不要出现在文章中
- 具体配置:端口、密码等敏感信息需模糊化
原则: 让读者能看懂方法论,但无法推断出你的具体环境。
备份是最后的防线。 在 AI 助手管理你的配置和记忆时,确保这些数据有可靠的备份机制,是运维工作的基本要求。