乐于分享
好东西不私藏

Openclaw终于让我的Obsidian不再是本地笔记,可以在线召唤了

Openclaw终于让我的Obsidian不再是本地笔记,可以在线召唤了

背景:自从把笔记软件从印象笔记切换到Obsidian以后,知识管理进入了一个新阶段,确实生产力提升了不少,但是我们这些老登们一直以来都是以薅免费著称,也就没付钱把他的同步功能开启,使用的一直是本地笔记模式,总得来说除了笔记不能联网外,其他的都很完美,以前也看过一些自己挂到NAS或者设置服务器之类的操作,一直没干,自从养上龙虾后,终于无师自通把OPENCLAW+obsidian结合了起来,真的是完美了。本文主要介绍同步的一些设置。

核心目标:实现日常办公电脑(Windows),就是我日常使用obsidian的那台电脑A,与 OpenClaw 所在服务器(Ubuntu WSL2),就是那台装了obsidian的电脑B,达成了 Obsidian 知识库的秒级、去中心化、高可用同步,有了这个功能后,一举三得:一是可以把openclaw生成的文档写入到B的库里,同时把这个库同步到A电脑,二是把我在A电脑上写的笔记,人肉写的文档同步到B电脑,让openclaw帮我自动化处理一些事情,三是我以后可以在飞书里直接发文字让他记录到obsidian了,相当于实现了三端操作。


核心架构基调 (First Principles)

抛弃中心化公有云盘与传统的定时轮询机制,采用 Syncthing (P2P 实时同步) + 原生 Linux 文件系统 (ext4) + 无头环境配置欺骗 的组合,打造极低延迟、数据绝对私有、且对自动化脚本友好的知识底座。


阶段一:底层基础设施拓扑重构 (WSL2 存储解耦)

这个工作是预备工作,如果你安装openclaw不是windows机器,也不是安装在C盘,可以忽略,我是为了防止防止未来知识库膨胀导致宿主机系统盘(C盘)崩溃,优先对服务器环境进行物理迁移。不使用基于文件级打包的 wsl --export(规避 socket 归档报错),采用块级别(Block-Level)的官方迁移指令。

部署 SOP:

  1. 1. 彻底关闭 WSL 服务(在 Windows PowerShell 中执行):
    wsl -l -v        # 查看分发版名称(如 Ubuntu)wsl --shutdown   # 彻底关机
  2. 2. 执行块级搬迁(迁移至 D 盘):
    wsl --manage Ubuntu --move D:\WSL\Ubuntu
    架构收益:在不破坏底层环境和文件状态的前提下,完美实现系统计算层与数据存储层的物理物理。

阶段二:P2P 数据管道的搭建与避坑 (Syncthing)

1. 双端节点安装 SOP

  • • Windows 端 (电脑 A):下载并安装 SyncTrayzor,解决后台驻留与监听优化。
  • • Linux 端 (服务器 B,WSL2):使用官方源安装并注册为后台服务:
    # 挂载官方签名与源sudo mkdir -p /etc/apt/keyringssudo curl -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpgecho "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list# 安装并拉起当前用户的系统级常驻服务sudo apt-get update && sudo apt-get install -y syncthingsystemctl --user enable syncthing.servicesystemctl --user start syncthing.service
    注:Linux 控制台可通过 http://localhost:8384 访问。

2. 双端加密握手 SOP

  1. 1. 在 A 端控制台(右上角操作 -> 显示 ID)复制 Device ID。
  2. 2. 在 B 端控制台(右下角添加远程设备)粘贴 ID 并保存。
  3. 3. A 端弹出请求连接提示,点击同意。通道建立。

3. 数据卷挂载与策略配置 SOP(极度关键)

  1. 1. A 端发起共享:添加文件夹,路径选择 Obsidian 库,在“共享”选项卡勾选 B 端。(🚨 避坑:绝对不要填写加密密码,否则 B 端会接收到无法读取的 .syncthing-enc 加密乱码块!
  2. 2. B 端接收并设置原生路径
    • • 弹出共享请求后点击添加。
    • • 🚨 避坑(性能瓶颈):路径必须填写 Linux 原生路径(如 /home/bermin/obsidian_vault),绝不能挂载到 Windows 盘(如 /mnt/d/obsidian)。跨越 9P 协议边界会导致 I/O 性能骤降且 inotify 监听失效。
  3. 3. 防冲突与容灾策略配置
    • • 版本控制 (容灾):在“版本控制”选项卡,开启“简易文件版本控制”,保留 30 天。
    • • 忽略模式 (防 UI 冲突):在“忽略模式”选项卡填入以下两行代码,隔离工作区状态,避免死锁:
      .obsidian/workspace.obsidian/workspace.json

阶段三:自动化应用层接入 (OpenClaw + obsidian-cli)

这个阶段实际上是配置Obsidian的工作,在安装openclaw初始化配置的时候我是安装了obsidian的,但是一直没有配置。

为了让 AI 拥有操作知识库的“双手”,接入官方标准工具 obsidian-cli

1. 环境准备与 PATH 修复

# 确保 linuxbrew 环境变量生效(如遇 command not found)echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bashrceval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"# 修复 Linux 终端中文文件名乱码显示(注入 UTF-8 环境)sudo apt-get install -y language-pack-zh-hanssudo locale-gen zh_CN.UTF-8sudo update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrcecho 'export LC_ALL=zh_CN.UTF-8' >> ~/.bashrc

2. 无头环境(Headless)注册欺骗 SOP

obsidian-cli 高度依赖桌面图形端生成的全局配置文件 obsidian.json 来定位本地库。由于 Ubuntu 服务器是从未启动过图形界面的无头环境,必须手动注入配置:

# 1. 创建 Obsidian 全局配置隐藏目录mkdir -p ~/.config/obsidian# 2. 注入 JSON 格式的“人造注册表” (请替换绝对路径)cat << 'EOF' > ~/.config/obsidian/obsidian.json{  "vaults": {    "headless-vault-1": {      "path": "/home/bermin/您的实际文件夹名",      "ts": 1710500000,      "open": true    }  }}EOF

3. 连通性验收

执行以下命令,如果不报错并返回正确结果,即宣告全链路打通:

obsidian-cli print-default --path-onlyobsidian-cli search-content "测试关键字"

结语

我在配置过程中也经历了好多坑,比如刚开始将同步软件里的分享里设置了一个加密密码,同步过去文档后发现全是命名很奇怪的文件夹,由于Obsidian文件很多,只有删除重新同步,很浪费时间;另外B端(openclaw所在电脑)同步软件设置同步文件夹的时候,写了个d:\obsidian(以为是建在windows的),结果发现这个文件夹实际是建在ubuntu里的,文件夹名变成了d    obsidian,强迫症发作,改文件夹名,删配置重新校验,结果不行,又删除文件夹,重新再同步。

此外SyncTrayzor这个软件已经停更了,用的内核syncthing版本比较老,同步都正常,但是windows里一直提示要升级,我也是强迫症发作,一直要升级,下了syncthing2.0.15版本的windows版,按照教程替换安装目录里的syncthing文件,但发现替换了仍然提示,最后查找资料才发现,在"C:\Users\BerminChu\AppData\Roaming\SyncTrayzor\syncthing.exe"目录里的syncthing文件也要替换,但是两个都替换了的结果,就是这个软件down了,原因很简单,SyncTrayzor这个壳是个老壳,syncthing最新版有些命令在这个壳里不支持,所以运行不了。所有坑都列出来了,有缘人看到就不要再跳了。