MDObsidian Vault / 阿里云服务器/Syncthing 跨设备同步.md

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 SyncUp to Date 或错误状态。

关闭 SSH 终端后管理隧道消失;端口 8384 依然不会暴露到公网。

添加新的同步任务

一个同步任务就是一个独立的 Syncthing Folder。Obsidian Vault、工作资料和普通文件不要混在同一个笼统的大目录中。建议使用稳定、全小写、以连字符分隔的 Folder ID;标签可以随时改名,但 ID 不应在同步后更改。

例如:

obsidian-vault   个人笔记库
work-vault       工作笔记库
files            普通私有文件

新增任务前,先决定:

  1. Folder ID:例如 work-vault
  2. 初始内容来源(种子设备):哪台设备已有正确、完整的文件。
  3. 参与设备:只让确实需要这份内容的设备加入。
  4. 各端路径:路径可以不同,但 Folder ID 必须相同。
  5. 是否为 Obsidian Vault:若是,所有设备都要准备 .stignore;普通文件任务至少忽略 .DS_StoreThumbs.dbdesktop.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

建议按以下顺序操作,避免空目录意外影响已有数据:

  1. 在种子设备确认文件完整,并在开始前做一次本地备份或 Git 提交。
  2. 在服务器管理页添加种子设备;在种子设备添加服务器 Device ID。两边都只添加对方。
  3. 种子设备中新增 Folder ID 为 work-vault 的文件夹,路径指向现有内容,首轮设为 Send Only
  4. 服务器中新增同 ID 的空文件夹,路径为 /srv/sync/xerhoo/work-vault首轮设为 Receive Only,并只共享给种子设备。
  5. 等服务器显示与种子设备内容一致、无错误后,将两端文件夹都改回 Send & Receive
  6. 为每台额外设备创建空的目标目录;若是 Obsidian Vault,先写入 .stignore
  7. 服务器将 work-vault 共享给新设备;新设备接受共享时选择刚创建的空目录路径。首轮完成并确认内容正确后,新设备保持 Send & Receive

整个过程都不要把新任务嵌套在已有 Syncthing 任务的目录内,也不要把服务器上的 /srv/sync 直接作为 Nginx 网站根目录。

新建一个空任务时

若任务一开始没有任何数据,三端可直接创建同一 Folder ID 的空目录,再都设为 Send & Receive。仍然只让每台设备与服务器共享,不要勾选其他终端设备。

添加新设备

每个新设备都保持“只连接服务器”的星型结构:

新设备 ⇄ 阿里云 Syncthing

不要把服务器设为 Syncthing 的 Introducer,否则设备可能自动彼此认识并建立不需要的直接同步关系。

接入步骤

  1. 在新设备安装并启动 Syncthing,并设置为用户登录后自动启动。
  2. 记录新设备的 Device ID;不要记录或复制它的 key.pem、API Key、密码等私密配置。
  3. 通过 SSH 隧道打开服务器管理页,在 Add Remote Device 添加新设备 ID,并起一个清晰名称,例如 laptop-2026
  4. 在新设备的 Syncthing 中只添加服务器的 Device ID;不要添加 Mac 或 Windows 的 ID。
  5. 在服务器管理页编辑要同步的文件夹,例如 obsidian-vault,勾选新设备进行共享。
  6. 在新设备上预先创建目标目录。若是 Obsidian Vault,先在根目录写入本笔记中的 .stignore,再接受共享。
  7. 接受服务器发来的 Folder 邀请,选择目标目录;Folder ID 必须与服务器显示的 ID 相同,类型选择 Send & Receive,并开启文件监听、勾选 Ignore Permissions
  8. 等待状态变成 Up to Date / idle,并确认 needBytes: 0,再用 Obsidian 打开该目录。
  9. 检查新设备的文件夹共享对象只有“本机 + 服务器”,不应包含其他终端设备。

示例:添加一台新笔记本

新笔记本本地路径:/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。如遇异常,优先检查:

  1. 设备是否在线、未休眠,Syncthing 是否在运行。
  2. 服务器 TCP/UDP 22000 是否仍在阿里云安全组中允许访问。
  3. 文件夹是否仍只与服务器共享。
  4. .stignore 是否在每台设备上都存在。
  5. 是否发生了同文件离线并发编辑导致的冲突副本。
\[ A= \]