跳转至

OpenClaw + 群晖 WebDAV 双向同步配置

使用 rsync 实现本地工作空间与群晖 WebDAV 的双向同步


架构说明

┌─────────────────────────────┐
│  OpenClaw 工作空间          │
│  /root/.openclaw/workspace  │
│  (本地,OpenClaw 直接读写)    │
└─────────────┬───────────────┘
              │ rsync 双向同步
              │ (定时/手动触发)
┌─────────────▼───────────────┐
│  群晖 WebDAV 挂载点          │
│  /mnt/obsidian              │
│  (远程存储,备份 + 多设备访问) │
└─────────────────────────────┘

一、挂载 WebDAV

1. 安装 davfs2

sudo apt-get update
sudo apt-get install davfs2

2. 配置认证

# 编辑 secrets 文件
sudo vi /etc/davfs2/secrets

# 添加:
https://nas.bulibulistudio.com:5006/home/Obsidian/openclaw-workspace  Chaochingchien  Yanyexing19950915!

# 设置权限
sudo chmod 600 /etc/davfs2/secrets

3. 创建挂载点并挂载

# 创建挂载点
sudo mkdir -p /mnt/obsidian

# 挂载
sudo mount -t davfs https://nas.bulibulistudio.com:5006/home/Obsidian/openclaw-workspace /mnt/obsidian

# 验证
df -h | grep obsidian
ls -la /mnt/obsidian/

4. 开机自动挂载

# 编辑 fstab
echo "https://nas.bulibulistudio.com:5006/home/Obsidian/openclaw-workspace  /mnt/obsidian  davfs  _netdev,auto  0  0" | sudo tee -a /etc/fstab

二、双向同步脚本

创建同步脚本

cat > /root/scripts/sync-obsidian.sh << 'EOF'
#!/bin/bash

# OpenClaw 工作空间与群晖 WebDAV 双向同步脚本
# 用法:./sync-obsidian.sh [push|pull|sync]

LOCAL_DIR="/root/.openclaw/workspace"
REMOTE_DIR="/mnt/obsidian"
LOG_FILE="/var/log/obsidian-sync.log"
LOCK_FILE="/tmp/obsidian-sync.lock"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

# 检查 WebDAV 是否挂载
check_mount() {
    if ! mountpoint -q $REMOTE_DIR; then
        log "${RED}错误:WebDAV 未挂载,正在尝试挂载...${NC}"
        sudo mount -t davfs https://nas.bulibulistudio.com:5006/home/Obsidian/openclaw-workspace $REMOTE_DIR
        if [ $? -ne 0 ]; then
            log "${RED}错误:WebDAV 挂载失败${NC}"
            exit 1
        fi
        log "${GREEN}WebDAV 挂载成功${NC}"
    fi
}

# 防止重复运行
check_lock() {
    if [ -f $LOCK_FILE ]; then
        log "${YELLOW}警告:同步任务正在运行中${NC}"
        exit 1
    fi
    touch $LOCK_FILE
    trap "rm -f $LOCK_FILE" EXIT
}

# 推送:本地 → 远程
push_sync() {
    log "${YELLOW}开始推送:本地 → 远程${NC}"

    rsync -avz --delete \
        --exclude='.git/' \
        --exclude='*.tmp' \
        --exclude='.DS_Store' \
        --exclude='Thumbs.db' \
        $LOCAL_DIR/ $REMOTE_DIR/

    if [ $? -eq 0 ]; then
        log "${GREEN}推送完成 ✓${NC}"
    else
        log "${RED}推送失败 ✗${NC}"
        exit 1
    fi
}

# 拉取:远程 → 本地
pull_sync() {
    log "${YELLOW}开始拉取:远程 → 本地${NC}"

    rsync -avz --delete \
        --exclude='.git/' \
        --exclude='*.tmp' \
        --exclude='.DS_Store' \
        --exclude='Thumbs.db' \
        $REMOTE_DIR/ $LOCAL_DIR/

    if [ $? -eq 0 ]; then
        log "${GREEN}拉取完成 ✓${NC}"
    else
        log "${RED}拉取失败 ✗${NC}"
        exit 1
    fi
}

# 双向同步
bidirectional_sync() {
    log "${YELLOW}开始双向同步...${NC}"

    # 先推送本地修改
    push_sync

    # 再拉取远程修改
    pull_sync

    log "${GREEN}双向同步完成 ✓${NC}"
}

# 显示帮助
show_help() {
    echo "用法:$0 [push|pull|sync|status|help]"
    echo ""
    echo "  push    本地 → 远程"
    echo "  pull    远程 → 本地"
    echo "  sync    双向同步(默认)"
    echo "  status  显示同步状态"
    echo "  help    显示帮助"
}

# 显示状态
show_status() {
    echo "=== OpenClaw Obsidian 同步状态 ==="
    echo ""
    echo "本地目录:$LOCAL_DIR"
    echo "远程目录:$REMOTE_DIR"
    echo ""

    # 检查挂载
    if mountpoint -q $REMOTE_DIR; then
        echo -e "WebDAV 挂载:${GREEN}已挂载 ✓${NC}"
    else
        echo -e "WebDAV 挂载:${RED}未挂载 ✗${NC}"
    fi

    # 统计文件
    echo ""
    echo "本地文件数:$(find $LOCAL_DIR -type f 2>/dev/null | wc -l)"
    echo "远程文件数:$(find $REMOTE_DIR -type f 2>/dev/null | wc -l)"

    # 最近修改
    echo ""
    echo "本地最近修改:"
    ls -lt $LOCAL_DIR/*.md 2>/dev/null | head -3

    echo ""
    echo "远程最近修改:"
    ls -lt $REMOTE_DIR/*.md 2>/dev/null | head -3
}

# 主程序
main() {
    check_lock
    check_mount

    case "${1:-sync}" in
        push)
            push_sync
            ;;
        pull)
            pull_sync
            ;;
        sync)
            bidirectional_sync
            ;;
        status)
            show_status
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            echo "未知参数:$1"
            show_help
            exit 1
            ;;
    esac
}

main "$@"
EOF

# 设置权限
chmod +x /root/scripts/sync-obsidian.sh

三、使用同步脚本

基本用法

# 双向同步(默认)
/root/scripts/sync-obsidian.sh

# 仅推送到远程
/root/scripts/sync-obsidian.sh push

# 仅从远程拉取
/root/scripts/sync-obsidian.sh pull

# 查看状态
/root/scripts/sync-obsidian.sh status

# 查看帮助
/root/scripts/sync-obsidian.sh help

四、定时自动同步

配置 Cron 定时任务

# 编辑 crontab
crontab -e

# 添加以下行:

# 每 5 分钟同步一次(适合频繁使用)
*/5 * * * * /root/scripts/sync-obsidian.sh sync >> /var/log/obsidian-sync.log 2>&1

# 或者每小时同步一次(适合低频使用)
# 0 * * * * /root/scripts/sync-obsidian.sh sync >> /var/log/obsidian-sync.log 2>&1

# 每天凌晨 2 点完整备份
# 0 2 * * * /root/scripts/sync-obsidian.sh push >> /var/log/obsidian-sync.log 2>&1

五、手动触发同步

创建快捷命令

# 添加别名
echo "alias obsync='/root/scripts/sync-obsidian.sh'" >> ~/.bashrc
source ~/.bashrc

# 现在可以直接用
obsync          # 双向同步
obsync push     # 推送
obsync pull     # 拉取
obsync status   # 状态

六、Git 版本控制(可选)

如果想加版本控制

# 初始化 Git 仓库
cd /root/.openclaw/workspace
git init

# 创建 .gitignore
cat > .gitignore << 'EOF'
# 系统文件
.DS_Store
Thumbs.db
*.tmp
*.cache

# 日志
*.log
logs/

# OpenClaw 临时文件
.openclaw/
.git/
EOF

# 首次提交
git add -A
git commit -m "Initial commit - OpenClaw workspace"

# 创建 Git 同步脚本
cat > /root/scripts/git-backup.sh << 'EOF'
#!/bin/bash
cd /root/.openclaw/workspace
git add -A
git commit -m "Auto-backup: $(date '+%Y-%m-%d %H:%M')"
# 如果有远程仓库可以 push
# git push origin master
EOF

chmod +x /root/scripts/git-backup.sh

# 每天自动提交
crontab -e
# 添加:0 23 * * * /root/scripts/git-backup.sh

七、验证同步

测试流程

# 1. 在本地创建测试文件
echo "# Test Sync $(date)" > /root/.openclaw/workspace/test-sync.md

# 2. 执行同步
/root/scripts/sync-obsidian.sh sync

# 3. 验证远程文件
ls -la /mnt/obsidian/test-sync.md
cat /mnt/obsidian/test-sync.md

# 4. 在远程创建文件(通过 WebDAV 上传或群晖 File Station)
# 然后拉取验证
/root/scripts/sync-obsidian.sh pull
cat /root/.openclaw/workspace/test-from-remote.md

八、监控和日志

查看同步日志

# 实时查看日志
tail -f /var/log/obsidian-sync.log

# 查看最近 100 行
tail -100 /var/log/obsidian-sync.log

# 查看今天的日志
grep "$(date '+%Y-%m-%d')" /var/log/obsidian-sync.log

设置邮件通知(可选)

# 同步失败时发送邮件
cat > /root/scripts/sync-notify.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/obsidian-sync.log"
ERROR_LOG="/tmp/sync-error.tmp"

# 检查最近同步是否有错误
if grep -q "失败\|error\|Error" $LOG_FILE; then
    echo "OpenClaw Obsidian 同步失败" | mail -s "⚠️ 同步错误提醒" admin@example.com
fi
EOF

chmod +x /root/scripts/sync-notify.sh

# 每小时检查一次
crontab -e
# 添加:0 * * * * /root/scripts/sync-notify.sh

九、故障排查

常见问题

问题 解决方案
WebDAV 挂载失败 检查网络连接、用户名密码、防火墙
rsync 权限错误 sudo chown -R root:root /root/.openclaw/workspace
同步冲突 检查是否有文件同时被修改、启用文件版本控制
磁盘空间不足 df -h 检查空间、清理旧文件

诊断命令

# 检查 WebDAV 连接
curl -k -u Chaochingchien https://nas.bulibulistudio.com:5006/home/Obsidian/openclaw-workspace/

# 检查挂载
mount | grep obsidian
df -h | grep obsidian

# 检查 rsync
which rsync
rsync --version

# 检查磁盘空间
df -h /root/.openclaw/workspace
df -h /mnt/obsidian

# 检查文件权限
ls -la /root/.openclaw/workspace/
ls -la /mnt/obsidian/

十、最佳实践

同步策略

  1. 频繁使用:每 5 分钟同步一次
  2. 一般使用:每小时同步一次
  3. 备份为主:每天凌晨同步一次

冲突避免

  1. 避免同时在多个设备编辑同一文件
  2. 启用文件版本控制(Git 或 Syncthing 版本)
  3. 定期备份到第三方存储

性能优化

  1. 排除不必要的文件(.git, *.tmp, node_modules)
  2. 使用增量同步(rsync -avz)
  3. 局域网内使用有线连接

配置完成时间:2026-03-09
适用:OpenClaw + 群晖 WebDAV + 双向同步