HuggingClaw / scripts /PERSISTENCE_README.md
tao-shen
deploy: HuggingClaw with original Dockerfile
e7ab5f1
# OpenClaw 持久化存储配置指南
## 概述
本配置实现了 OpenClaw 在 Hugging Face Space 中的**完整持久化存储**,确保容器重启后所有状态都能恢复。
### 核心特性
- **完整目录备份**: 持久化整个 `~/.openclaw` 目录
- **原子操作**: 使用 tar.gz 归档确保备份一致性
- **自动轮转**: 保留最近 5 个备份,自动清理旧备份
- **优雅关闭**: 容器停止时自动执行最终备份
---
## 持久化的目录和文件
### 1. 核心配置
```
~/.openclaw/
├── openclaw.json # 主配置文件(模型、插件、网关设置)
└── credentials/ # 所有渠道的登录凭证
├── whatsapp/
│ └── default/
│ └── auth_info_multi.json
└── telegram/
└── session.data
```
### 2. 工作空间
```
~/.openclaw/workspace/
├── AGENTS.md # 代理定义
├── SOUL.md # 灵魂(性格、说话风格)
├── TOOLS.md # 可用工具列表
├── MEMORY.md # 长期聚合记忆
├── memory/ # 每日记忆文件
│ ├── 2025-01-15.md
│ └── 2025-01-16.md
└── skills/ # 技能定义
├── my-skill/
│ └── SKILL.md
└── ...
```
### 3. 会话历史
```
~/.openclaw/agents/<agentId>/sessions/
├── <sessionId>.jsonl # 每个会话的完整对话历史
└── sessions.json # 会话索引
```
### 4. 记忆索引(SQLite)
```
~/.openclaw/memory/
└── <agentId>.sqlite # 语义搜索索引
```
### 5. QMD 后端(如果启用)
```
~/.openclaw/agents/<agentId>/qmd/
├── xdg-config/ # QMD 配置
├── xdg-cache/ # QMD 缓存
└── sessions/ # QMD 会话导出
```
---
## 排除的文件/目录
以下内容**不会**被持久化(临时文件、缓存、锁文件):
- `*.lock` - 锁文件
- `*.tmp` - 临时文件
- `*.socket` - Unix socket 文件
- `*.pid` - PID 文件
- `node_modules/` - Node 依赖
- `.cache/` - 缓存目录
- `logs/` - 日志目录
---
## 环境变量配置
在 Hugging Face Space 的 Settings > Variables 中设置:
| 变量名 | 必需 | 默认值 | 说明 |
|--------|------|--------|------|
| `HF_TOKEN` | ✅ | - | Hugging Face 访问令牌(需要写入权限) |
| `OPENCLAW_DATASET_REPO` | ✅ | - | 数据集仓库 ID,如 `username/openclaw-state` |
| `OPENCLAW_HOME` | ❌ | `~/.openclaw` | OpenClaw 主目录 |
| `SYNC_INTERVAL` | ❌ | `300` | 自动备份间隔(秒) |
| `ENABLE_AUX_SERVICES` | ❌ | `false` | 是否启用辅助服务(WA Guardian, QR Manager) |
### 快速配置步骤
1. **创建数据集仓库**
```
在 Hugging Face 上创建一个新的 Dataset 仓库,例如:username/openclaw-state
设置为 Private(私有)
```
2. **获取访问令牌**
```
访问:https://huggingface.co/settings/tokens
创建新 Token,勾选 "Write" 权限
```
3. **配置 Space 变量**
```
HF_TOKEN = hf_xxxxx...(你的 Token)
OPENCLAW_DATASET_REPO = username/openclaw-state(你的数据集 ID)
```
---
## 脚本说明
### openclaw_persist.py
核心持久化模块,提供备份和恢复功能。
```bash
# 备份当前状态
python3 openclaw_persist.py save
# 恢复状态
python3 openclaw_persist.py load
# 查看状态
python3 openclaw_persist.py status
```
### openclaw_sync.py
主同步管理器,被 entrypoint.sh 调用。
功能:
1. 启动时从数据集恢复状态
2. 启动 OpenClaw 网关
3. 后台定期备份
4. 优雅关闭时执行最终备份
---
## 备份文件命名
备份数据集中的文件命名格式:
```
backup-YYYYMMDD_HHMMSS.tar.gz
```
例如:`backup-20250116_143022.tar.gz`
系统会自动保留最近 5 个备份,删除更旧的。
---
## 故障排除
### 备份失败
1. 检查 `HF_TOKEN` 是否有写入权限
2. 检查 `OPENCLAW_DATASET_REPO` 是否正确
3. 查看日志中的错误信息
### 恢复失败
1. 数据集为空是正常的(首次运行)
2. 检查网络连接
3. 尝试手动恢复:`python3 openclaw_persist.py load`
### WhatsApp 凭证丢失
备份包含 WhatsApp 凭证,恢复后应该能自动连接。如果需要重新扫码:
1. 登录 Hugging Face Space
2. 在日志中查找二维码
3. 使用手机 WhatsApp 扫码登录
---
## 与原 sync_hf.py 的区别
| 特性 | sync_hf.py | openclaw_sync.py |
|------|------------|------------------|
| 同步方式 | 逐文件夹同步 | 完整目录 tar 归档 |
| 配置复杂度 | 高(需映射路径) | 低(自动处理) |
| 原子性 | 否 | 是 |
| 回滚能力 | 无 | 有(保留 5 个备份) |
| 文件完整性 | 部分 | 完整 |
---
## 手动备份/恢复命令
### 本地测试
```bash
# 设置环境变量
export HF_TOKEN="hf_..."
export OPENCLAW_DATASET_REPO="username/openclaw-state"
# 手动备份
cd /home/node/scripts
python3 openclaw_persist.py save
# 手动恢复
python3 openclaw_persist.py load
# 查看状态
python3 openclaw_persist.py status
```
---
## 技术实现细节
### 备份过程
1. 检查 `~/.openclaw` 目录
2. 创建 tar.gz 归档(应用排除规则)
3. 上传到 Hugging Face Dataset
4. 旋转备份(保留最近 5 个)
5. 更新本地状态文件
### 恢复过程
1. 从数据集获取最新备份
2. 下载到临时目录
3. 如有本地状态,先创建本地备份
4. 解压到 `~/.openclaw`
5. 验证文件完整性
### 排除规则
```python
EXCLUDE_PATTERNS = [
"*.lock", "*.tmp", "*.pyc", "*__pycache__*",
"*.socket", "*.pid", "node_modules", ".DS_Store", ".git",
]
SKIP_DIRS = {".cache", "logs", "temp", "tmp"}
```
---
## 更新日志
- **v8** (2025-01-16): 实现完整目录持久化,使用 tar 归档方式
- **v7** (之前): 使用 sync_hf.py 逐文件夹同步