共计 4743 个字符,预计需要花费 12 分钟才能阅读完成。
Syncthing 不是传统云盘,而是一套点对点文件同步工具。它适合在多台设备之间同步笔记、配置、文档和小型项目目录,但前提是目录规划、忽略规则和版本保护要做好。
这篇笔记整理一些实际使用中的经验,尤其适合 [[macOS]]、[[Obsidian]] vault、多设备和 [[Git]] 仓库混合同步的场景。
目录规划
不要把过大的总目录直接作为一个同步 Folder,例如把整个 /Users/einverne/Sync 全部交给 Syncthing。这样一旦目录里混入 Git 仓库、虚拟环境、构建缓存、图片资源和大量小文件,扫描会变得很慢,排查问题也很困难。
更推荐把同步内容按照需求和功能拆成多个 Folder:
rime-config Rime 配置
obsidian-notes Obsidian 笔记
books 书籍文件
projects 项目仓库
这样做有几个好处:
- 每个 Folder 的共享设备可以单独配置
- 每个 Folder 的忽略规则可以更精确
- 哪个目录扫描慢一眼能看出来
- 重建索引时影响范围更小
- 不同设备可以只同步自己需要的目录
不要把 ~/、Desktop、Downloads 这种变化频繁、内容混杂的目录整包同步。对于重要目录,最好使用清晰的 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 timeout、relay-client、Abandoning 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
