Syncthing 实战:局域网同步仓库

学习目标

  • 掌握两台设备间通过 Syncthing 配对的方法。
  • 掌握文件夹共享配置(双向同步)。
  • 掌握同步状态监控与冲突处理。
  • 理解版本控制配置与冲突副本恢复。
  • 了解 Git + Syncthing 互补使用的策略。

前置条件

  • 已完成 00_syncthing安装与概念 的学习,至少一台设备已完成安装与文件夹添加。
  • 准备两台(或以上)设备,均安装并启动 Syncthing。
  • 所有设备处于同一局域网内(连接到同一个路由器/交换机)。
  • 可选:在防火墙中允许 Syncthing 通过专用网络。

项目概述

在本实战项目中,你将完成以下任务:

  1. 将两台设备通过 Syncthing 配对,建立信任关系。
  2. 将本教程仓库文件夹配置为双向同步,实现多设备实时同步。
  3. 监控同步状态,处理可能出现的冲突。
  4. 配置文件版本控制,保障数据安全。

🎯 最终效果:在工作电脑和笔记本上分别编辑 Obsidian 笔记,Syncthing 自动将改动同步到另一台设备,无需手动拷贝或推送。

步骤

第 1 步:确认两台设备的 Syncthing 状态

在每台设备上:

  1. 打开 http://127.0.0.1:8384 进入 Web UI。
  2. 确认状态显示为 已就绪(绿色对勾)。
  3. 确认防火墙没有阻止 Syncthing 通信:
    • Windows:检查 Windows Defender 防火墙 → 允许应用 → 确保 SyncthingSyncTrayzor专用网络中已允许。
    • macOS:系统设置 → 网络 → 防火墙 → 允许 Syncthing。
    • Linux:检查 ufw status,确保端口 22000/tcp21027/udp 已放行(局域网内通常不需额外配置)。
    • Android:Android 系统通常不会阻止 Syncthing 局域网通信,但需确保省电模式未限制 Syncthing 后台运行(设置 → 应用 → Syncthing-Fork → 电池 → 选择 无限制)。

第 2 步:交换设备 ID 实现配对

Syncthing 的设备配对需要交换设备 ID,形成信任关系。

方法 A:通过设备 ID 文本添加(推荐)

在设备 A(如工作电脑)上:

  1. 点击 Web UI 底部的 添加远程设备 按钮。
  2. 设备 ID 字段中,粘贴设备 B 的设备 ID。

    如何获取设备 ID?在设备 B 的 Web UI 上点击 此设备 → 显示设备 ID,复制完整 ID。

  3. 设备名称 字段中,输入设备 B 的识别名称(如 “笔记本”)。
  4. 点击 保存

在设备 B(如笔记本)上:

  1. 此时设备 B 的 Web UI 会弹出一个配对请求通知(右上角铃铛图标会有红点)。
  2. 点击通知 → 查看请求来源(应显示设备 A 的设备 ID 和名称)。
  3. 确认无误后,点击 添加设备

快速确认设备身份

在点击 “添加设备” 之前,建议面对面核对设备 ID 的前几位和后几位字符,或在已信任的聊天工具中交换 ID 截图。

方法 B:通过二维码添加(适用于手机/平板)

  1. 在设备 A 的 添加远程设备 弹窗中,点击设备 ID 输入框右侧的二维码图标
  2. 设备 B(如果是手机/平板)打开 Syncthing 应用 → 添加设备 → 扫描二维码。
  3. 确认后完成配对。

第 3 步:共享文件夹

设备配对后,还需要指定哪些文件夹参与同步。

在设备 A 上共享文件夹:

  1. 在 Web UI 的 文件夹 区域,找到已添加的仓库文件夹(如 “Obsidian 教程”)。
  2. 点击该文件夹右侧的 编辑(齿轮图标)。
  3. 共享 标签页中,勾选刚才添加的设备 B。
  4. 点击 保存

在设备 B 上接收文件夹:

  1. 设备 B 将收到一个文件夹共享请求通知。
  2. 点击通知,查看请求详情。
  3. 选择文件夹的本地路径
    • 如果设备 B 上已有同路径的文件夹(如从 Git 克隆的同一仓库),选择 与现有文件夹合并
    • 如果是全新设备,可以指定一个位置(如 D:\WorkSpace\obsidian_tutorial),Syncthing 会自动创建。
  4. 点击 接受

路径一致性建议

虽然 Syncthing 不要求不同设备的文件夹路径相同,但为了减少混淆,建议在所有设备上使用相同的路径存放 Obsidian 仓库(例如都在 D:\WorkSpace\obsidian_tutorial)。

第 4 步:验证同步

检查同步状态

  1. 在任一台设备的 Web UI 上,稍等片刻(通常几秒内)。
  2. 观察文件夹状态变化:
    • 未同步(黄色):正在同步中,有文件需要传输。
    • 最新(绿色):所有文件已同步完成。
    • 错误(红色):存在冲突或权限问题。

测试同步

测试流程:

  1. 在设备 A 上修改任意一个笔记文件(例如在 README.md 末尾加一行注释)。
  2. 保存文件。
  3. 观察设备 A 的 Web UI:文件夹状态变为 未同步,同步进度条显示传输进度。
  4. 几秒后状态变为 最新
  5. 切换到设备 B,打开同一文件确认改动已同步。

⚡ 默认情况下,Syncthing 会在文件保存后数秒内触发同步。如果网络通畅,整个过程通常在 10 秒以内。

第 5 步:配置文件版本控制

版本控制可以在文件被误修改或删除时提供恢复能力。

在每台设备上分别配置:

  1. 点击文件夹右侧的 编辑(齿轮图标)。
  2. 进入 高级 标签页。
  3. 文件版本控制 下拉菜单选择 简单版本控制
  4. 保留版本数 设为 5(保留最近 5 个被替换或删除的版本)。
  5. 点击 保存

版本控制策略简介

策略说明适用场景
垃圾桶被替换的文件送到系统回收站最小化存储占用
简单版本控制保留最近 N 个版本的文件副本大多数日常使用
阶段性版本控制按时间间隔保留版本(如每小时 / 每日 / 每周)需要长时间回溯的场景
外部文件版本控制自定义脚本处理同步冲突高级用户 / 与其他工具集成

恢复旧版本文件

使用简单版本控制时,旧版本文件会保存在与同步文件夹同级的 .stversions 目录中。例如:

obsidian_tutorial/
└── .stversions/
    ├── README.md~20260703-120000.sync-conflict
    └── section7/
        └── 00_syncthing安装与概念.md~20260703-121500.sync-conflict

要恢复某个文件的旧版本:

  1. 进入 .stversions 目录。
  2. 找到对应的文件名和时间戳。
  3. 将文件复制回原位置覆盖当前版本(或手动合并)。

第 6 步:处理文件冲突

当同一文件在两个设备上同时被修改时,Syncthing 无法自动判断哪个版本为最终版本,此时会产生冲突副本

冲突副本文件名格式

原文件名.md.sync-conflict-20260703-123000-DESKTOP-ABC123

其中:

  • .sync-conflict-:冲突标记
  • 20260703-123000:冲突发生的时间(UTC)
  • DESKTOP-ABC123:产生冲突的设备名称

解决冲突的推荐工作流

方法一:手动合并(推荐)

  1. 在任意一台设备上打开原始文件和冲突副本。
  2. 逐段比较差异,手动合并为一个最终版本。
  3. 删除冲突副本文件(.sync-conflict-*)。
  4. 保存最终版本,变更将同步到另一台设备。

方法二:使用 VS Code 比较

  1. 在 VS Code 中打开仓库文件夹。
  2. 在文件资源管理器中选中原始文件。
  3. 右键 → 选择以进行比较
  4. 再选中冲突副本文件,右键 → 与已选文件比较
  5. 使用 VS Code 的差异编辑器逐行对比,手动合并。
  6. 合并完成后删除冲突副本。

避免冲突的习惯

  • 编辑文件前,确认 Syncthing 状态为 最新(绿色)。
  • 在不同设备上错开编辑时间,避免同时修改同一文件。
  • 如果需要在多设备上频繁编辑同一笔记,考虑采用 先拉后改 的策略——先等待同步完成,再开始编辑。

第 7 步:进阶配置(可选)

仅发送 / 仅接收模式

如果希望在某些设备上只读同步(如媒体服务器),可以修改文件夹类型:

  1. 编辑文件夹 → 高级 标签页。
  2. 文件夹类型 下拉菜单:
    • 仅发送:本地修改会同步到远端,但远端修改不会同步回来。适用于备份场景。
    • 仅接收:接收远端的修改,本地修改不会同步出去。适用于只读展示设备。
    • 发送和接收(默认):双向同步。

引入速率限制

如果同步过程占用过多带宽,可以在设置中限制:

  1. 设置 → 连接。
  2. 速率限制 中设置最大上传/下载速度(如 10 MB/s)。
  3. 点击 保存

忽略不需要同步的文件

Syncthing 支持 .stignore 文件,类似于 Git 的 .gitignore。可以在同步文件夹根目录创建 .stignore 文件:

# 忽略 node_modules
node_modules/

# 忽略系统文件
.DS_Store
Thumbs.db

# 忽略 Obsidian 工作区缓存
.obsidian/workspace.json
.obsidian/workspace

注意:.stignore 文件的修改需要确保所有设备都同步此文件,或分别在每台设备上手动创建。

常见问题

Q:配对成功后文件夹状态一直是 “未同步”?

可能的原因:

  • 两设备网络不通(尝试在设备 A 上 ping 设备 B 的 IP)。
  • 防火墙阻止了 Syncthing 端口(22000/tcp)。
  • 文件夹 ID 不匹配(检查两台设备上文件夹 ID 是否完全一致)。

Q:同步速度很慢?

  • 确认设备处于同一局域网,直连速度最快。
  • 检查设置中是否启用了中继(局域网内应关闭中继以启用直连)。
  • 确认没有启用速率限制。
  • 如果有大量小文件需要同步,初始同步会慢一些,耐心等待即可。

Q:如何确认两台设备是直连还是通过中继?

  1. 在 Web UI 右侧远程设备区域,点击已连接的设备。
  2. 查看 地址 列:如果显示 tcp://192.168.x.x:22000,说明是直连;如果显示 relay://,说明通过中继。

Q:Git 仓库能用 Syncthing 同步吗?

可以,但需要注意:

  • Syncthing 同步和 Git 版本控制是互补的,不是替代关系。
  • Git 仓库中的 .git 文件夹会被同步——这通常没问题,但如果两台设备同时执行 Git 操作(如 git commit),可能导致 .git 目录冲突。
  • 推荐策略:日常编辑用 Syncthing 实时同步,在正式提交到 GitHub 时选择一台设备执行 git add / commit / push 操作,避免多设备同时操作 Git。

练习任务

  1. 在两台设备上完成 Syncthing 配对。
  2. 共享本教程仓库文件夹,验证同步正常。
  3. 在设备 A 上创建一个新的测试文件 test-sync.md,确认设备 B 上能自动收到。
  4. 在设备 A 和 B 上先后修改同一文件的不同位置,确认同步正常(不产生冲突)。
  5. (选做)模拟冲突:在两台设备上同时修改同一文件的同一位置,观察冲突副本生成,并手动合并解决。

验收清单

  • 两台设备已完成配对,远程设备列表中显示对方且状态为 “已连接”。
  • 文件夹已共享,同步状态显示为 最新(绿色)。
  • 文件夹修改可在另一台设备上自动同步(10 秒内)。
  • 已配置文件版本控制(简单版本控制,保留 5 个版本)。
  • 了解冲突副本的识别与解决方法。
  • 了解 Git + Syncthing 的互补使用策略。