朱简

文档 / 进阶

自建同步服务器

同步服务器只做三件事:转发加密后的数据、替暂时离线的设备存几天、帮两台设备完成配对。它读不到内容。官方服务器跑的就是源码仓库里 server/ 这一份(程序名 zhujian-syncd),你自己也能跑一台。

先说清三件事:

  • ⚠ 自建服务器上的账户是另一套,和官方服务器上的不互通。 换服务器 = 在新服务器上重新创建账户、各台设备重新配对。已经在官方服务器上同步着的空间,要换过来得走下面「已经在用官方服务器,想换过来」那条路,不是改一下地址就行。
  • 没有官方 Docker 镜像,也没有编译好的服务端程序,只能从源码自己编。
  • 自建的服务器,升级、备份、机器安全都由你自己负责;官方服务器升级时不会通知到你。

最小跑法

要一台装了 Rust(用 rustup 装稳定版就行)的 Linux 机器。把源码仓库(zhujian.app 上指向的那个)克隆下来,在仓库根目录:

cd server && cargo build --release
mkdir -p ~/zhujian-data
touch ~/zhujian-data/banlist.txt
./target/release/zhujian-syncd --listen 127.0.0.1:8787 --data-dir ~/zhujian-data
  • 起来之后打一行 INFO zhujian-syncd 监听 ws://127.0.0.1:8787/ws。另开一个终端 curl http://127.0.0.1:8787/healthz,回 ok 就是活的。
  • banlist.txt 是封禁表,自己用一直空着就行,但文件必须在,少了它会拒启(「读封禁表 … 失败」)。
  • 一个数据目录只能跑一份:对同一个目录再起第二个,它会说「已被另一个 zhujian-syncd 进程占用」然后退出。
  • 参数写错时它会把完整用法打出来。

在 app 里用上它:

  • 第一台设备:「同步 → 创建账户(第一台设备)」,表单里的服务器地址默认是官方的,改成你的再点【创建】。
  • 其余设备:在老设备上点【添加设备】,屏幕上会给出服务器地址和配对码;手机扫二维码时地址已经带在码里,不用另填,手输的话两项都照抄。
  • 地址只认 ws:// 或 wss:// 开头,填到主机和端口为止(/ws 那段 app 会自己补)。
  • 服务器和 app 在同一台电脑上:填 ws://127.0.0.1:8787。
  • 在自己家的局域网里用:启动时改成 --listen 0.0.0.0:8787,各设备填 ws://这台机器的局域网地址:8787。⚠ ws:// 不加密连接本身:内容照样是端到端加密的,但同一个网络里的人能看到有哪些设备在和服务器同步、账户号和设备号、什么时候传了多少。在自己家里无所谓,别在公共网络上用 ws://。

从外网用:要加 TLS

服务器自己只讲明文,对外要放在一个带 TLS 的反向代理后面。用 Caddy 最省事,它会自动申请证书:

sync.example.com {
	reverse_proxy 127.0.0.1:8787
}
  • 把域名解析到这台机器、放行 80 与 443,重载 Caddy,app 里填 wss://sync.example.com。WebSocket 不需要额外配置,上面这三行就够了。
  • ⚠ 证书必须是公开 CA 签的(Caddy 默认用的 Let's Encrypt 就是)。app 只认内置的那份公共根证书列表,不读系统的证书库,所以自签证书连不上。
  • zhujian-syncd 继续只监听 127.0.0.1,别直接暴露到公网。要它常驻,交给 systemd 之类的进程托管,挂了自动重启即可(Restart=always)。

已经在用官方服务器,想换过来

  • ⚠ 「同步 → 高级… → 修改服务器」不是干这个的。它只换地址、账户原样不动,是给同一台服务器搬家用的。拿它指向一台不认识这个账户的服务器,状态会一直显示「服务器拒绝(账户被封禁,或本设备未注册/已吊销)」并反复重试;改回原来的地址就好了。
  • 要连数据一起搬:在电脑上「设置 → 备份与恢复」做一份备份,再用【从备份恢复】把它恢复出来。恢复出来的是一个不同步的新空间(见上面加密备份与备份码),在这个新空间里创建账户,服务器地址填你的,其它设备再配对加入。原来那个空间还在,要不要删由你决定。
  • 不需要旧数据的话更简单:新建一个空间,在里面创建账户时填你的地址。

服务器上存着什么、该备份哪个

数据目录里只有三个文件,没有任何内容:不存正文、不存图片,也不存密钥。

  • registry.json:账户号、设备号、设备公钥,以及哪台是管理设备。要备份的就是它。丢了,所有设备再连上来都会被拒(服务器不认识它们了),只能全部重新建账户、重新配对。服务器搬家的做法也就是带上它:在新机器上用同一份 registry.json 起服务,每台设备「修改服务器」改成新地址,就接着同步。
  • banlist.txt:封禁表。
  • meters.json:流量计量,丢了无妨。

替离线设备暂存的数据(信箱)只在内存里,最多存 72 小时,服务器一重启就没了。这不会丢数据:内容的真身在每台设备自己的库里,信箱只是让同步快一点;两台设备下次同时在线时会互相对一遍账,缺的自动补上。真正会丢的只有一种情况 —— 某台设备上还没同步出去的内容,跟着它的硬盘一起坏了,这跟用谁的服务器无关。

服务器的运行日志打在标准错误里:连接时刻、账户号与设备号、传了几帧多少字节,不含内容。

另外两个参数

  • --free-seat-quota N:每个账户能挂几台设备。默认只有 2 台,第三台配对时老设备会提示「同步席位已满:请先移除一台不用的设备,再添加新设备」。自己用就调大,比如 --free-seat-quota 8;服务端对每个账户另有一个设备数上限,调得再大也不会超过它。
  • 管理口(可选,不开完全不影响同步):--admin-listen 127.0.0.1:8788 --admin-token-file <token 文件>,用来从服务器侧吊销设备。只许绑回环地址,别放进反向代理;token 文件用 openssl rand -hex 32 生成、chmod 600,两个参数必须一起给。

这一页没讲清楚?发邮件告诉我,或者在 GitHub 上看它的源文件。