Syncthing 使用小技巧

1次阅读
没有评论

共计 4743 个字符,预计需要花费 12 分钟才能阅读完成。

Syncthing 不是传统云盘,而是一套点对点文件同步工具。它适合在多台设备之间同步笔记、配置、文档和小型项目目录,但前提是目录规划、忽略规则和版本保护要做好。

这篇笔记整理一些实际使用中的经验,尤其适合 [[macOS]]、[[Obsidian]] vault、多设备和 [[Git]] 仓库混合同步的场景。

目录规划

不要把过大的总目录直接作为一个同步 Folder,例如把整个 /Users/einverne/Sync 全部交给 Syncthing。这样一旦目录里混入 Git 仓库、虚拟环境、构建缓存、图片资源和大量小文件,扫描会变得很慢,排查问题也很困难。

更推荐把同步内容按照需求和功能拆成多个 Folder:

rime-config   Rime 配置
obsidian-notes  Obsidian 笔记
books          书籍文件
projects       项目仓库

这样做有几个好处:

  • 每个 Folder 的共享设备可以单独配置
  • 每个 Folder 的忽略规则可以更精确
  • 哪个目录扫描慢一眼能看出来
  • 重建索引时影响范围更小
  • 不同设备可以只同步自己需要的目录

不要把 ~/DesktopDownloads 这种变化频繁、内容混杂的目录整包同步。对于重要目录,最好使用清晰的 Folder ID,而不是长期依赖默认的 default

善用忽略规则

.stignore 是 Syncthing 性能优化的核心。很多同步慢、冲突多、数据库膨胀的问题,本质上都是因为同步了不该同步的文件。

常见建议:

// macOS 和 Windows 系统文件
.DS_Store
**/.DS_Store
Thumbs.db
desktop.ini

// 编辑器缓存
.idea
**/.idea
.vscode
**/.vscode

// 依赖目录
node_modules
**/node_modules
venv
**/venv
.venv
**/.venv
__pycache__
**/__pycache__

// 构建产物
dist
**/dist
build
**/build
.cache
**/.cache

如果是可重新生成的内容,可以使用 (?d)

(?d)node_modules
(?d)**/node_modules
(?d).DS_Store
(?d)**/.DS_Store

(?d) 的意思是:文件被忽略,但如果远端删除了这个文件,本地也允许跟着删除。它适合缓存、依赖、系统垃圾文件。

.git 这种重要目录,建议先不要使用 (?d),只做普通忽略:

.git
**/.git

这样只是不同步 Git 内部数据库,不主动删除本地已有 .git

Git 仓库不要完整同步

如果目录本身是 Git 仓库,不建议通过 Syncthing 同步 .git

推荐规则:

.git
**/.git

原因很简单:

  • .git/objects 通常有大量小文件
  • .git/index.git/logs 经常变化
  • 多设备同时修改 Git 仓库容易产生冲突
  • 用 Syncthing 同步 Git 历史不如使用 Git remote 稳定

更合理的模式是:

  • 文件内容用 Syncthing 同步
  • Git 历史用 GitHub、GitLab 或自建 Git 服务同步
  • 每台设备维护自己的 .git 目录

对于笔记仓库,这种模式通常最稳。

Obsidian 使用建议

Obsidian vault 很适合用 Syncthing 同步,但要排除机器相关状态文件。

建议规则:

.obsidian/workspace.json
.obsidian/workspace-mobile.json
.obsidian/cache
.trash

是否同步 .obsidian 取决于你的使用方式。通常可以同步:

  • 插件目录
  • 主题目录
  • 部分插件配置
  • 快捷键和外观配置

但不建议同步:

  • workspace 状态
  • 缓存文件
  • 临时文件
  • 每台设备差异很大的插件数据

如果多台设备同时打开同一个 vault,容易产生冲突文件。尤其是移动端和桌面端都在自动保存时,最好避免同时编辑同一篇笔记。

开启文件版本控制

Syncthing 是同步工具,不是备份工具。同步意味着误删也会同步到其他设备。

对重要目录建议开启 File Versioning,例如:

  • Staggered File Versioning
  • Trash Can File Versioning
  • Simple File Versioning

适合开启版本控制的目录:

  • Obsidian vault
  • 文档目录
  • 配置文件目录
  • 写作草稿目录

例如可以保留最近三十天的旧版本,或者把删除文件放进 .stversions。这样可以减少误删或错误覆盖带来的损失。

注意:.stversions 会占用空间。对于大文件目录,需要定期检查磁盘使用情况。

选择合适的同步方向

Syncthing 的 Folder 可以设置不同同步类型:

Send & Receive
Send Only
Receive Only

常见用法:

  • 主力 Mac 使用 Send & Receive
  • 服务器或 NAS 备份节点使用 Receive Only
  • 配置源设备使用 Send Only
  • 手机只同步必要目录,通常使用 Receive Only 或有限的 Send & Receive

如果担心某台设备误删文件,可以把它设置成 Receive Only。这样本地改动不会自动传播到其他设备。

不要同步缓存和依赖

强烈建议排除:

node_modules
venv
.venv
target
dist
build
.cache
.pytest_cache
.mypy_cache
.ruff_cache
.gradle
.next
.nuxt

这些目录通常有几个共同点:

  • 文件数量巨大
  • 可重新生成
  • 和操作系统或机器环境相关
  • 容易产生冲突
  • 极其拖慢扫描

尤其是 node_modules,一个项目就可能包含几万到几十万个文件。

避免同步运行中的数据库

慎重同步这些文件:

*.sqlite-wal
*.sqlite-shm
*.db-wal
*.db-shm
*.lock
*.pid

如果应用正在运行,数据库文件可能持续变化,同步过程中容易产生冲突,严重时可能导致应用数据库损坏。

这类目录包括:

  • 浏览器 profile
  • 编辑器状态目录
  • Docker volume
  • SQLite 数据库目录
  • 邮件客户端数据目录

如果确实需要同步数据库,最好先关闭应用,再让 Syncthing 完成同步。

优化连接方式

如果两台设备在同一个局域网,尽量让它们直连。

可以检查连接类型:

tcp-client
tcp-server
quic-client
relay-client

通常直连比 relay 快很多。如果长期走 relay,说明两台设备可能无法直接互联。

可以尝试:

  • 给局域网设备配置静态地址
  • 手动配置 tcp://192.168.x.x:22000
  • 确认防火墙允许 TCP 和 UDP 22000
  • 路由器开启 UPnP 或手动端口转发
  • 不需要公网同步时关闭 relay
  • 服务器节点使用固定公网 IP 或域名

如果日志里频繁出现 read timeoutrelay-clientAbandoning old index handler,说明网络连接有抖动,可能会拖慢索引交换。

调整扫描策略

Syncthing 发现文件变化有两种方式:

  • File watcher,依赖系统事件通知
  • Periodic rescan,定期全量扫描

建议:

  • 开启 Watch for Changes
  • 对巨大目录调大 Full Rescan Interval
  • 对稳定目录设置更长的定期扫描间隔
  • 对频繁变化的小目录单独拆 Folder

不要频繁手动点击 Rescan。大目录每次全量扫描都会给磁盘和数据库带来压力。

拆分大 Folder

如果一个 Folder 长期扫描慢,最有效的优化不是调参数,而是拆分。

例如把一个大目录拆成:

/Users/einverne/Sync/wiki
/Users/einverne/Sync/Books
/Users/einverne/Sync/rime-config
/Users/einverne/Sync/projects

拆分后可以更容易看出哪个目录慢,也能避免某一个目录的问题影响全部同步。

处理冲突文件

如果出现 .sync-conflict 文件,不要直接批量删除。

建议流程:

  • 用 diff 工具比较冲突文件和原文件
  • 手动合并内容
  • 确认无误后删除冲突文件
  • 如果冲突频繁,调整使用习惯或同步策略

Obsidian 用户尤其容易遇到冲突,因为移动端和桌面端可能同时自动保存。

手机端注意事项

手机端同步受到系统限制较多。虽然可以使用 Syncthing iOS 端 [[Mobius Sync]] / [[SyncTrain]] ,但在手机上通常会遇到一些问题。

常见问题:

  • iOS 后台能力有限
  • Android 可能被省电策略杀后台
  • 大目录同步耗电
  • 移动网络不稳定
  • 文件系统权限有限

建议:

  • 手机只同步必要目录
  • 避免同步超大 vault
  • 开启仅 Wi-Fi 同步
  • 关闭系统电池优化
  • 不要把手机当作长期可靠中继节点

使用服务器节点

如果有 VPS、NAS 或家里常开的机器,可以作为常在线节点。

好处:

  • 多设备不必同时在线
  • 提高同步成功率
  • 作为额外副本
  • 远程设备更容易连接

但要注意:

  • 服务器也会同步误删
  • 最好开启版本控制
  • 敏感数据注意磁盘加密
  • 不要把服务器当作唯一备份

同步不是备份

这是使用 Syncthing 最重要的一点。

同步的意思是:

你删了,其他设备也会删。
你改坏了,其他设备也会变坏。

所以重要数据还需要额外备份,例如:

  • Time Machine
  • Restic
  • Borg
  • NAS snapshot
  • Git remote
  • 云端冷备份
  • 定期导出 Obsidian vault
  • [[backup tools]]

Syncthing 提高的是多设备一致性,不是数据安全的全部答案。

常用排查命令

macOS 下可以用这些命令排查:

# 查看 Syncthing 进程
ps aux | grep -i '[s]yncthing'

# 查看日志
tail -n 100 ~/Library/Application\ Support/Syncthing/syncthing.log
less ~/Library/Application\ Support/Syncthing/syncthing.log

# 查看数据库大小
ls -lh ~/Library/Application\ Support/Syncthing/index-v2/

# 查看 API 是否响应
curl -H "X-API-Key: $API" http://127.0.0.1:8384/rest/system/status

# 查看 Folder 状态
curl -H "X-API-Key: $API" 'http://127.0.0.1:8384/rest/db/status?folder=default'

# 查看扫描进度事件
curl -H "X-API-Key: $API" 'http://127.0.0.1:8384/rest/events?limit=20'

推荐配置模板

一个比较稳的 .stignore 模板:

// Syncthing
.stfolder
.stversions

// macOS 和 Windows
.DS_Store
**/.DS_Store
Thumbs.db
desktop.ini

// Git
.git
**/.git

// JetBrains 和 VS Code
.idea
**/.idea
.vscode
**/.vscode

// Node 和 Python
node_modules
**/node_modules
venv
**/venv
.venv
**/.venv
__pycache__
**/__pycache__

// Build cache
dist
**/dist
build
**/build
.cache
**/.cache
.pytest_cache
**/.pytest_cache
.mypy_cache
**/.mypy_cache
.ruff_cache
**/.ruff_cache

// Obsidian local state
.obsidian/workspace.json
.obsidian/workspace-mobile.json
.trash

正文完
 0
评论(没有评论)