Syncthing:通过阿里云公网服务器进行跨设备同步
更新时间:2026-07-29
用途:同步私有 Obsidian Vault;服务器只做私有同步中枢,不公开提供笔记文件。
当前架构
Mac ──TLS 直连──┐
│
阿里云 Syncthing
│
Windows ─TLS 直连┘
所有设备只与阿里云服务器同步,不直接互相共享 Vault。这样服务器保持一个常在线副本;任意设备离线编辑后,重新联网会先与服务器交换变更,再由服务器分发给其他设备。
Syncthing 传输使用设备身份验证和 TLS 加密。服务器持有同步副本,但不通过 Nginx、网站目录或文件浏览器公开。
当前目录
| 位置 | Vault 路径 |
|---|---|
| Mac | /Users/mac/Sync/Obsidian/Obsidian Vault |
| Windows | D:\Sync\Obsidian\Obsidian Vault |
| 阿里云服务器 | /srv/sync/xerhoo/Obsidian Vault |
旧 Mac 副本 /Users/mac/Obsidian Vault 暂时保留作迁移回退,不再作为日常编辑位置。
服务器部署约定
服务器使用官方 Syncthing Docker 镜像,容器名为 syncthing-xerhoo。
/srv/syncthing/config Syncthing 配置、设备身份与数据库
/srv/sync/xerhoo 私有同步数据根目录
/srv/git 后续私有 Git 仓库
/srv/backups 后续加密备份
/srv/publish 后续发布输入与版本
/www/wwwroot 仅公开网站;绝不放 Vault
容器实际以专用、不可登录的 syncthing 系统账号读写同步目录。容器配置为自动重启;服务器重启后会恢复同步。
网络边界
| 端口 | 用途 | 当前策略 |
|---|---|---|
| TCP 22000 | Syncthing 直连同步 | 对公网开放 |
| UDP 22000 | Syncthing QUIC 直连同步 | 对公网开放 |
| TCP 8384 | Syncthing 管理界面 | 仅监听服务器 127.0.0.1,不对公网开放 |
| UDP 21027 | 局域网发现 | 未映射到服务器公网 |
服务器管理界面需要时可从 Mac 建立临时 SSH 隧道:
ssh -N -L 18384:127.0.0.1:8384 aliyun
然后访问 http://127.0.0.1:18384。注意:Mac 本机 Syncthing 已占用 127.0.0.1:8384,因此这里必须使用不同的本地端口(例如 18384)。关闭 SSH 终端后隧道会断开。
同步触发与频率
当前三个端的 obsidian-vault 都是双向同步(sendreceive):
| 设置 | 当前值 | 说明 |
|---|---|---|
| 实时文件监听 | 开启 | 保存、重命名、附件变更会被系统事件捕获 |
| 监听合并延迟 | 10 秒 | 将连续自动保存合并后再扫描,避免频繁传输 |
| 完整扫描 | 3600 秒 | 每小时一次,作为文件监听遗漏时的兜底 |
| 跨系统权限同步 | 关闭 | 避免 Mac、Linux、Windows 权限元数据互相影响 |
因此 Obsidian 自动保存后,通常在约 10 秒加上索引与网络传输时间内到达服务器;另一台在线设备再从服务器获得变更。设备离线、休眠或关机时,改动会留在已在线的一端与服务器,设备恢复联网后立即补同步,不必等待一小时扫描。
忽略规则
每台设备的 Vault 根目录都应各自有一份 .stignore。它是本机同步规则,不要假定会自动传播。
# Device-specific Obsidian layouts
.obsidian/workspace.json
.obsidian/workspace-mobile.json
# Regenerable local state and operating-system metadata
.obsidian/cache/
.DS_Store
Thumbs.db
desktop.ini
这会保留笔记、附件、模板、主题、插件及通用设置,但不让不同设备覆盖彼此的窗口布局、缓存和系统元数据。
日常使用规则
- 仅在当前同步路径中的 Vault 编辑。
- 尽量不要在两台离线设备上同时编辑同一篇笔记。
- 若出现
sync-conflict文件,先保留两份内容,人工合并后再删除冲突副本。 - 不在服务器
/srv/sync中通过 SSH 手动编辑笔记。 - 不将 Vault 放回百度网盘实时同步目录。
- Syncthing 是同步,不是版本历史或唯一备份;Git 与加密异地备份后续单独建设。
通过服务器管理 Syncthing
服务器的 Syncthing 管理页不会公开到互联网。需要操作服务器配置时,在 Mac 终端建立临时隧道:
ssh -N -L 18384:127.0.0.1:8384 aliyun
然后在浏览器打开 http://127.0.0.1:18384。这里的 18384 是 Mac 本地临时端口;它会被 SSH 转发到服务器的 127.0.0.1:8384,并不是 Mac 自己的 Syncthing 管理页。在该页面可以:
- 在
Actions → Show ID查看服务器 Device ID。 - 在
Add Remote Device添加新设备的 Device ID。 - 在某个文件夹的
Edit页面选择哪些设备可共享该任务。 - 检查每个文件夹的
Out of Sync、Up to Date或错误状态。
关闭 SSH 终端后管理隧道消失;端口 8384 依然不会暴露到公网。
添加新的同步任务
一个同步任务就是一个独立的 Syncthing Folder。Obsidian Vault、工作资料和普通文件不要混在同一个笼统的大目录中。建议使用稳定、全小写、以连字符分隔的 Folder ID;标签可以随时改名,但 ID 不应在同步后更改。
例如:
obsidian-vault 个人笔记库
work-vault 工作笔记库
files 普通私有文件
新增任务前,先决定:
- Folder ID:例如
work-vault。 - 初始内容来源(种子设备):哪台设备已有正确、完整的文件。
- 参与设备:只让确实需要这份内容的设备加入。
- 各端路径:路径可以不同,但 Folder ID 必须相同。
- 是否为 Obsidian Vault:若是,所有设备都要准备
.stignore;普通文件任务至少忽略.DS_Store、Thumbs.db和desktop.ini。
有现成内容时的安全首轮同步
假设 Mac 上已有一个工作库,准备同步到服务器和 Windows:
Mac(种子) /Users/mac/Sync/Obsidian/Work Vault
服务器 /srv/sync/xerhoo/work-vault
Windows D:\Sync\Obsidian\Work Vault
Folder ID work-vault
建议按以下顺序操作,避免空目录意外影响已有数据:
- 在种子设备确认文件完整,并在开始前做一次本地备份或 Git 提交。
- 在服务器管理页添加种子设备;在种子设备添加服务器 Device ID。两边都只添加对方。
- 种子设备中新增 Folder ID 为
work-vault的文件夹,路径指向现有内容,首轮设为 Send Only。 - 服务器中新增同 ID 的空文件夹,路径为
/srv/sync/xerhoo/work-vault,首轮设为 Receive Only,并只共享给种子设备。 - 等服务器显示与种子设备内容一致、无错误后,将两端文件夹都改回 Send & Receive。
- 为每台额外设备创建空的目标目录;若是 Obsidian Vault,先写入
.stignore。 - 服务器将
work-vault共享给新设备;新设备接受共享时选择刚创建的空目录路径。首轮完成并确认内容正确后,新设备保持 Send & Receive。
整个过程都不要把新任务嵌套在已有 Syncthing 任务的目录内,也不要把服务器上的 /srv/sync 直接作为 Nginx 网站根目录。
新建一个空任务时
若任务一开始没有任何数据,三端可直接创建同一 Folder ID 的空目录,再都设为 Send & Receive。仍然只让每台设备与服务器共享,不要勾选其他终端设备。
添加新设备
每个新设备都保持“只连接服务器”的星型结构:
新设备 ⇄ 阿里云 Syncthing
不要把服务器设为 Syncthing 的 Introducer,否则设备可能自动彼此认识并建立不需要的直接同步关系。
接入步骤
- 在新设备安装并启动 Syncthing,并设置为用户登录后自动启动。
- 记录新设备的 Device ID;不要记录或复制它的
key.pem、API Key、密码等私密配置。 - 通过 SSH 隧道打开服务器管理页,在
Add Remote Device添加新设备 ID,并起一个清晰名称,例如laptop-2026。 - 在新设备的 Syncthing 中只添加服务器的 Device ID;不要添加 Mac 或 Windows 的 ID。
- 在服务器管理页编辑要同步的文件夹,例如
obsidian-vault,勾选新设备进行共享。 - 在新设备上预先创建目标目录。若是 Obsidian Vault,先在根目录写入本笔记中的
.stignore,再接受共享。 - 接受服务器发来的 Folder 邀请,选择目标目录;Folder ID 必须与服务器显示的 ID 相同,类型选择 Send & Receive,并开启文件监听、勾选
Ignore Permissions。 - 等待状态变成
Up to Date/idle,并确认needBytes: 0,再用 Obsidian 打开该目录。 - 检查新设备的文件夹共享对象只有“本机 + 服务器”,不应包含其他终端设备。
示例:添加一台新笔记本
新笔记本本地路径:/Users/name/Sync/Obsidian/Obsidian Vault
服务器任务:obsidian-vault
服务器路径:/srv/sync/xerhoo/Obsidian Vault
共享关系:新笔记本 ⇄ 阿里云服务器
首次同步完成前,不要在新笔记本的 Vault 中创建或编辑同名笔记;先让服务器副本完整落地,再在 Obsidian 中打开。
移除设备或停止一个任务
不要直接删除本地目录。正确顺序是:先确认所有需要保留的内容已同步或备份,再在服务器管理页取消该设备对该 Folder 的共享,最后在该设备本机暂停或移除该 Folder。若要彻底移除设备,再从服务器的 Remote Devices 中删除其设备记录。
独立任务更容易暂停、排错、回收和控制哪些设备可访问。
自启动状态
| 设备 | 启动方式 |
|---|---|
| Mac | Homebrew LaunchAgent;mac 用户登录后启动 |
| Windows | Syncthing 计划任务;Admin 用户登录后启动 |
| 阿里云 | Docker restart unless-stopped;服务器重启后恢复 |
设备未登录、关机或休眠时不会继续同步;锁屏状态下 Syncthing 仍会运行。
维护检查
日常只需确认 Syncthing 显示文件夹状态为“已同步”或 idle,且 needBytes: 0。如遇异常,优先检查:
- 设备是否在线、未休眠,Syncthing 是否在运行。
- 服务器 TCP/UDP 22000 是否仍在阿里云安全组中允许访问。
- 文件夹是否仍只与服务器共享。
.stignore是否在每台设备上都存在。- 是否发生了同文件离线并发编辑导致的冲突副本。