免费开源的 Obsidian 同步插件,我肝出来了
导读:
1. 插件实际效果演示 2. 开发记录 3. 实际部署全流程教学
大家好,我是了山海。
事情是这样的:
老板两台电脑,公司一台家里一台。白天工位写的笔记,晚上回家想接着改——没了。反过来也一样,周末在家整的东西,周一回公司还得想办法传。
然后他就来找我了。
「你有空写个 Obsidian 插件呗,调研一下怎么实现远程同步,最好是免费的。」
我嘴上说的是「好,我看看。」心里想的是:你认真的?
市面上一堆方案你非要我自己造一个?
话梅糖嚼完了。话已经说出去了。造就完事了!!
给大伙看一下实际效果,可以去github 搜索一下rison114514/Cloud_Obsidian 实际体验效果:
市面上不是没有方案,但每个都差一口气
先调研。不是说老板的需求不合理——是真的没找到一个刚好合适的。
官方 Obsidian Sync 体验最好,月费 8 美元,折人民币快 60。老板付得起,但他觉得一个同步功能这个价不值。加上服务器在国外,国内连偶尔抽风,他碰到过两次写完笔记第二天公司打不开。
坚果云出了个 Nutstore Sync 插件,免费 5G 空间,一键登录国内网络还稳。试用了一下,其实挺好。但我们的笔记图片多,canvas 文件不小,那个免费流量是论月算的,测了一下我自己的用量,差不多一星期就擦边了。
结论就是:每个方案都刚好卡在需求上,缺那么一两个点。没有「部署完就不用管了」的。
那就自己写吧
Go 服务端跑 VPS,Obsidian 插件装两台电脑。服务端 gorilla/mux 做路由,JWT 认证,SQLite 存用户,每个 vault 底层是一个 Git 仓库——这样每次改动都有 commit,真搞坏了能翻回去。插件端 TypeScript,走 Obsidian Plugin API。
自动同步
本地文件一动,FileWatcher 监听到了,500ms 防抖合并,进队列。每 60 秒批量 push 到服务器。没做实时 push——觉得没必要,每次敲字都发请求也太吵了。
另一台电脑怎么知道的?服务端 accept 后 WebSocket 广播 file_changed,在线设备立刻自动 pull。不是轮询,push 驱动。延迟秒级。
状态栏给了一串指示灯:🟢 已同步、⚫ 离线、🔼 推送中、🟡 拉取中、🔴 错误。瞟一眼就知道状态。也保留了手动 Push All 和 Pull All,换设备或初次用的时候跑一次。
你问我为什么上一张截图没这个按钮?都说了是一边做一边写的,之前截图的时候按钮还没加,很正常吧。
远程文件树 + 右键忽略
左侧 Ribbon 点云朵图标,右侧边栏展开,显示服务器上完整文件树。目录可以折叠,文件用 emoji 分类型。
最实用的功能是右键忽略。Obsidian 自带的左侧文件浏览器,右键文件夹,选「不再远程同步此文件夹」。这个目录下的文件停止 push/pull,服务端自动删除对应文件——你换台设备也拉不到这些内容。
想恢复再右键:
🔄 恢复远程同步此文件夹。
老板有个 draft 草稿目录,里面全是写了一半的东西。不想同步,但也不想删。右键一下就行。
踩了两个坑
目录行的折叠功能在 ItemView 里死活不生效。我调了三四版都不行,开始怀疑是不是自己写错了。最后翻文档才发现 Obsidian 的 workspace 会拦截 ItemView 内 div 上的原生 addEventListener("click"),必须用 Component.registerDomEvent() 绑定。还有 createSpan().setText() 在 Obsidian 的 HTMLSpanElement 上静默失败,得用原生 element.textContent 更新。搞这两个坑加起来搞了半天。
还顺便写了个 Typora Keymap 插件,把快捷键映射成 Typora 风格,Ctrl+1 标题、Ctrl+U 下划线那些。顺手做的。反正写都写了。
怎么部署
项目开源了:
git clone https://github.com/rison114514/Cloud_Obsidian.gitcd Cloud_Obsidianbash deploy-remote.sh ubuntu@你的服务器IP脚本自动装 Go、编译、生成 JWT Secret、启动服务、加开机自启。前提是你有台 VPS,防火墙放行 9090 端口。
注册账号:
curl -X POST http://你的服务器IP:9090/api/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"你的用户名","password":"你的密码"}'安装插件:去 Release 页面下载 main.js、manifest.json、styles.css,复制到 vault 的 .obsidian/plugins/cloud-obsidian-sync/。
然后在 Obsidian 里启用。
登录填服务器地址、用户名、密码,状态栏变 🟢 就开始自动同步了。
最后
有 VPS、依赖 Obsidian 比较深、觉得市面上方案总差一口气——这套东西可能对你有用。没 VPS、不想碰命令行,坚果云免费方案够用了。不要为了自建而自建。
老板用了两周,唯一一句评价是「怎么不早做」。嘴里的第二颗话梅糖已经没味了。工具回到该在的位置——不被感知地运转。
以上,既然看到这里了。谢谢你看我的文章。
夜雨聆风