在服务器 / NAS 上用命令行同步(obsync-cli)
一、这是什么,适合谁
obsync-cli 是「手机电脑同步」的命令行客户端——和手机 / 电脑上的插件用的是同一套端到端加密同步引擎,只是把它做成了一个在终端里跑的命令,安装后命令名是 obsync。
它适合这些场景:
- 一台 Linux / macOS 服务器上放着一个笔记库,想让它和你手机、电脑上的笔记保持一致;
- 用 cron 定时任务把服务器上生成的内容(脚本产物、日报、剪藏)同步进你的库;
- NAS / 群晖上常驻一个同步进程;
- CI / 自动化流程里读写同一个加密库。
你的笔记在离开这台机器之前就已经用你本地掌管的密钥加密,服务器上只存密文——和图形版插件完全一样的安全性。
这是一篇给会用命令行的用户的进阶教程。如果你只是想在手机和电脑之间同步,用图形界面插件就够了,见《介绍与安装使用入门》。
二、开始之前
你需要准备:
- Node.js ≥ 20(在这台机器上,
node -v能看到版本号)。 - 一个已经存在的同步库。命令行版只接入已有的库,不新建库——新建库请先用手机 / 电脑插件或网页版创建好,再用命令行接入。
- 接入这个库的凭据,二选一:
- 这个库的恢复密钥(在插件里导出的那串密钥,最适合服务器,无需人工确认);或
- 一台已登录并在线的设备,用来在配对时批准 / 生成配对码。
三、安装
方式一:用 npm 从下载地址直接安装(推荐)
npm install -g https://shoujidiannao.bijitongbu.site/downloads/obsync-cli-latest.tgz
装完验证一下:
obsync --version # 显示 obsync 0.1.0
obsync --help # 列出所有命令
方式二:下载单文件放进 PATH(不想用 npm 时)
curl -fL -o /usr/local/bin/obsync \
https://shoujidiannao.bijitongbu.site/downloads/obsync.cjs
chmod +x /usr/local/bin/obsync
obsync --version
这个单文件是自包含的,除了 Node.js 本身,不需要再装任何依赖。
四、第一次使用(四步)
第 1 步:登录
obsync login
它会打印一个 6 位验证码,你通过微信把这个码发给 「笔记同步助手」公众号即可完成登录——和插件里的登录是同一套流程,具体怎么发码见这里。登录成功后凭据会保存在 ~/.config/obsync/credentials.json。
💡 无人值守 / 自动化怎么办? 登录的唯一入口就是微信 6 位码——但微信只需要做一次。在任意一台能用微信的机器上(也可以就是这台服务器)跑一次
obsync login,登录成功后会拿到一个长期有效的登录令牌(token),存在~/.config/obsync/credentials.json里。把这个令牌拷到服务器,用obsync login --token <你的令牌>(或设环境变量OBSYNC_TOKEN)注入即可,之后这台机器就不用再碰微信了。也就是说:微信换一次令牌,后续自动化全靠这个令牌。
第 2 步:看看账号下有哪些库
obsync sync-list-remote
会列出你账号下所有可同步的库(id / 名称 / 机房 / 大小 / 创建时间),记下你要接入的那个库的名字。
第 3 步:把当前目录接入一个库
进入你要用作同步目录的文件夹,然后二选一接入:
A. 用恢复密钥接入(推荐,最适合服务器)
先在手机 / 电脑插件里导出这个库的恢复密钥,存成一个文本文件(比如 vault-key.txt),拷到服务器上,然后:
cd /srv/my-vault
obsync sync-setup --recovery-key-file vault-key.txt
B. 用配对码接入
在另一台已登录的设备上为这个库生成一个配对码,然后:
cd /srv/my-vault
obsync sync-setup --pairing-code 123456
这种方式会要求你在终端里核对一串安全码(形如 042-815 苹果 火车),必须和另一台设备屏幕上显示的完全一致才输入 y——这是防中间人的最后一道人工闸,别跳过。
接入成功后,会在这个目录下建一个
.obsync/状态目录(保存绑定信息和同步进度)。这个目录永远不会被上传,也不要把它复制到别的库里。
第 4 步:开始同步
同步一轮(下载 + 上传,跑到收敛后自动退出):
obsync sync
想让它一直守着、有变化就自动同步:
obsync sync --continuous
五、让它自动、持续地同步
服务器场景一般希望它无人值守地跑。两种做法:
方式一:常驻进程(--continuous)
obsync sync --continuous 会一直运行、监听文件变化并持续同步。用 systemd 让它开机自启、崩了自动拉起(用户级 service 示例):
# ~/.config/systemd/user/obsync.service
[Unit]
Description=obsync 持续同步 /srv/my-vault
After=network-online.target
[Service]
ExecStart=/usr/local/bin/obsync sync --continuous --path /srv/my-vault
Restart=on-failure
RestartSec=10
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now obsync.service
systemctl --user status obsync.service
方式二:定时任务(cron)
如果不需要实时、只要定期同步,用 cron 每隔几分钟跑一轮就行:
# 每 10 分钟同步一次 /srv/my-vault
*/10 * * * * /usr/local/bin/obsync sync --path /srv/my-vault >> ~/obsync.log 2>&1
⚠️ cron 里怎么判断成功:退出码
0= 已同步完成;退出码5= 这一轮没在预算内跑完(弱网 / 大库首次下载),这不是失败——下一次定时任务会从已保存的进度继续,不要把它当成报警。真正需要关注的是退出码6(确有文件永久无法同步,会给出清单)。
六、命令一览
| 命令 | 作用 |
|---|---|
obsync login | 微信 6 位码登录;--token 可直接注入登录态 |
obsync logout | 撤销服务端登录态 + 清本地凭据;--local-only 只清本地 |
obsync sync-list-remote | 列出账号下可同步的库 |
obsync sync-setup | 接入一个已有库:--recovery-key-file 或 --pairing-code |
obsync sync | 同步一轮到收敛;--continuous 常驻持续同步 |
obsync sync-config | 读写本库配置:get / set <键> <值> |
obsync sync-status | 只读查看同步状态 |
obsync sync-unlink | 本地解绑(删 .obsync/,不动任何笔记、不删服务端数据) |
所有命令都支持 --json(机器可读输出,方便脚本处理)、--path <目录>(指定库目录,默认当前目录)。
七、常用配置
obsync sync-config get # 打印当前全部配置
obsync sync-config set conflictAction merge # 冲突处理策略
obsync sync-config set excludedFolders '["templates",".trash"]' # 不同步的文件夹
obsync sync-config set perFileMax 52428800 # 单文件大小上限(字节)
obsync sync-config set deviceName my-nas # 本设备显示名
八、退出码(写脚本时可依赖)
| 退出码 | 含义 |
|---|---|
| 0 | 成功 / 已同步完成 |
| 2 | 参数用法错误 |
| 3 | 未登录 / 登录失效 → 重新 obsync login |
| 4 | 未接入 / 库不存在 / 密钥不匹配 |
| 5 | 未跑完(瞬时,可重试)——不是失败,下次会续上 |
| 6 | 确有文件永久无法同步(会列出清单) |
| 7 | 已有一个实例在同步这个库(同一库同一时刻只允许一个进程) |
| 8 | 触发了批量删除保护,需人工确认放行 |
九、数据安全
命令行版和图形版遵循同一条第一铁律:宁可不同步,绝不丢数据。
.obsync/状态目录被硬排除,永远不上传;obsync sync-unlink只删本地绑定状态,绝不触碰你的任何笔记文件、绝不删服务端数据;- 读到空文件 / 读失败时不会把它当成正常版本推上去覆盖别的设备;
- 断网、超时这类瞬时错误会自动退避重试,不会谎报「同步失败」。
🔑 请务必保管好你的恢复密钥。 笔记是端到端加密的,密钥只在你手里——密钥丢了,服务器也无法帮你解开任何数据。
十、常见问题
obsync sync返回退出码 5? 正常,表示这一轮没在时间预算内跑完(弱网或大库首次下载),再跑一次会从已保存的进度继续,不是错误。sync-status显示disconnected? 只是当前没有活动连接,跑一次obsync sync即可。- 提示未登录(退出码 3)? 登录态失效,重新
obsync login。 - 提示已有实例在跑(退出码 7)? 同一个库目录同一时刻只允许一个
obsync进程;检查是不是有--continuous常驻进程或另一个定时任务在跑同一个库。