Syncthing 与 Nextcloud:VPS 文件同步方案对比
Syncthing 是点对点同步工具,Nextcloud 是功能完备的服务器平台。本文对比两者在 VPS 上的资源消耗与架构差异,帮助您根据需求选择。注意:两者均非备份方案,请勿将其作为数据恢复的唯一手段。
Syncthing 与 Nextcloud:决定选择的关键差异
Syncthing 与 Nextcloud 的区别归根结底在于一种结构性差异,其他所有特性均由此衍生。Syncthing 是点对点(P2P)架构。每台设备都持有完整的文件夹,不存在所谓的权威副本。Nextcloud 是服务器架构。一台机器存储文件,用户账户在文件之上进行管理,客户端则从服务器拉取副本。
这就是 Syncthing 没有共享链接和文档网页视图的原因。因为没有中心副本可供服务,浏览器也就无从请求数据。Nextcloud 同时提供上述两种功能,但为此需要运行 PHP 环境、数据库服务器、Web 服务器以及用于 TLS(传输层安全)的反向代理。
当所有涉及的设备都归您个人所有时,请选择 Syncthing。当需要通过浏览器访问或需要与他人共享文件时,请选择 Nextcloud。
每种设计中 VPS 的实际作用
运行 Nextcloud 的 VPS 是您的数据中心。删除笔记本电脑上的本地副本后,文件依然保存在服务器上,因为服务器始终是原始数据源。
运行 Syncthing 的 VPS 则承担不同的任务:它是一个始终在线的节点。Syncthing 在两个同时在线的设备之间直接传输数据。因此,两台从不同时开机的笔记本电脑永远无法同步,无论等待多久。在从不休眠的 VPS 上添加第三个节点即可解决此问题。笔记本 A 在 09:00 推送数据,笔记本 B 在 22:00 拉取数据,而 VPS 在此期间负责暂存文件夹。
这是一个非常有用的角色,其定位比“Dropbox 替代品”更务实。Syncthing 无法为您提供可发送给客户的共享链接。如果您有此需求,请在此处停止,转而阅读 自托管 Dropbox 替代方案汇总。
小型 VPS 上的资源成本
Syncthing 是一个单一的 Go 二进制文件。它监听一个套接字,并在本地数据库中维护文件索引,这就是其全部技术栈。自 2.0 版本起,该索引已从 LevelDB 迁移至 SQLite,因此从 1.x 版本升级时,首次启动会执行一次性迁移。若文件夹数量庞大,迁移可能耗时较长。请务必等待其完成。无需安装或修补其他任何组件。
Nextcloud 的需求更高。截至 2026 年 8 月,Nextcloud 35 支持 PHP 8.3 至 8.5,后端需搭配 MariaDB 或 PostgreSQL,并由 Apache 2.4 或 nginx 配合 php-fpm 提供服务。管理手册建议“每个进程至少分配 512MB 内存”,而 php-fpm 会同时运行多个工作进程。
在 1 GB 内存的 VPS 上,Syncthing 运行轻松,而 Nextcloud 则非常吃力。但这并不意味着 Nextcloud 不是合适的选择。它意味着更高的维护成本,因为你需要同时保持四个组件的更新,而非一个。通过 涵盖 Docker、TLS 和备份的 Nextcloud VPS 部署指南 采用容器化部署,是减轻该负担最简便的方式。
在 VPS 上安装 Syncthing
Ubuntu 官方仓库提供 syncthing 软件包,但其版本滞后于上游较多。请使用项目官方仓库进行安装。
sudo mkdir -p /etc/apt/keyrings
sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable-v2" | sudo tee /etc/apt/sources.list.d/syncthing.list
sudo apt-get update
sudo apt-get install syncthing
syncthing --versionsyncthing --version 命令输出的第一行应以 syncthing v2 开头。如果出现 v1,说明 apt 仍优先选择发行版自带的软件包。请将上游仓库的优先级调高,然后重新安装。
printf "Package: *\nPin: origin apt.syncthing.net\nPin-Priority: 990\n" | sudo tee /etc/apt/preferences.d/syncthing.pref请以普通用户身份将 Syncthing 作为系统服务运行,这样即使无人登录,服务也能在开机时自动启动。
sudo systemctl enable --now syncthing@youruser.service
systemctl status syncthing@youruser.servicesystemctl status 命令应输出 active (running)。配置文件和索引文件存放在 /home/youruser/.local/state/syncthing,其中主配置文件为 config.xml。在 Syncthing 1.27 版本之前创建的安装实例,其文件存放在 ~/.config/syncthing,因此在不同机器间迁移数据前,请检查这两个路径。
接下来开放端口。Syncthing 使用 22000/TCP 进行同步协议传输,使用 22000/UDP 进行 QUIC 传输,并使用 21027/UDP 进行局域网发现。由于发现机制使用广播和多播,无法跨越互联网,因此在 VPS 上只需开放前两个端口。
sudo ufw allow 22000/tcp
sudo ufw allow 22000/udp
sudo ufw statusufw status 命令应列出这两条规则。如果输出 Status: inactive,说明 ufw 未启用任何过滤,此时仅受服务商网络防火墙的限制。请同时检查服务商的控制面板,因为大多数主机商都提供独立的防火墙管理。如果服务已运行但远程设备仍显示 Disconnected,通常意味着上述两个防火墙中仍有端口处于关闭状态。
在不暴露端口的情况下访问 Syncthing GUI
Web GUI(图形用户界面)默认监听 127.0.0.1:8384,因此仅响应来自服务器自身的请求。此默认设置具有保护作用,因为 GUI 携带的 API(应用程序编程接口)密钥拥有重写服务器上所有文件夹路径的权限。
请勿将其直接暴露给公网。文档明确指出绑定到特定网络地址的后果:“指定计算机的局域网地址并不会将访问权限仅限于本地网络设备!”请改用 SSH 将端口从服务器转发到您的笔记本电脑。
ssh -L 8384:127.0.0.1:8384 youruser@your.vps.example在 SSH 会话保持期间,在本地浏览器中打开 http://127.0.0.1:8384。隧道会随 SSH 会话关闭而断开,因此后续不会有任何端口处于监听状态。
如果确实需要直接访问 GUI,请先设置凭据。由于服务器上没有浏览器,请通过命令行完成此操作。
sudo systemctl stop syncthing@youruser.service
sudo -H -u youruser syncthing generate --gui-user=admin --gui-password=-
sudo systemctl start syncthing@youruser.service-H 至关重要,因为如果不指定,sudo 会默认使用 root 的主目录,导致您编辑错误的 config.xml。将密码值设为单个短横线(-)会使 syncthing generate 从标准输入读取密码,从而避免密码出现在 shell 历史记录中,且该值在写入文件前会被哈希处理。登录后,请在 GUI 设置中启用 HTTPS。
为什么 Syncthing 会同步你的误操作
Syncthing 的 FAQ 明确回答了备份相关的问题:“Syncthing 并不是一个优秀的备份应用,因为你对文件所做的任何更改(修改、删除等)都会同步到所有设备。”
如果你在笔记本电脑上误删了一个文件夹,Syncthing 会严格按照设计逻辑执行操作。它会在几秒钟内将该文件夹从所有设备上删除。同步意味着保持一致,而这种一致性也包括确认文件已被删除。
文件版本控制是解决此问题的方案,但除非你手动开启,否则它默认是关闭的。文档指出,版本控制“默认设置为‘无文件版本控制’,即不会保留文件的旧副本。”每个文件夹有 4 种策略可选。Trash Can(回收站)会保留每个被远程更改删除或替换的文件副本。Simple(简单)为每个文件保留指定数量的旧版本。Staggered(交错式)会随时间推移精简历史记录,例如保留一天的每小时副本、一个月的每日副本等。External(外部)则将决策权交给用户编写的脚本。旧副本会存放在共享文件夹内的 .stversions 目录中。
建议在 VPS 节点上设置 Staggered 策略,而笔记本电脑保持版本控制关闭。这样,始终在线的节点将承担保存历史记录的任务,而笔记本电脑则保持轻量。
Nextcloud 在这方面处理得更好,但它依然不是备份工具。删除的文件会进入回收站,编辑记录由 Versions 应用保存,但当磁盘空间不足时,两者都会被自动清理。如果笔记本电脑上的进程加密了文件,这些加密版本会被同步上去,而原始的完好副本会按预定计划被自动清除。
无论使用哪种工具,底层都需要真正的备份:由独立程序创建快照,存储在同步客户端无法触及的位置,并至少进行一次恢复测试,以确保恢复流程有效。restic 与 BorgBackup 的对比 介绍了如何针对数据目录选择合适的工具。
两者冲突处理机制的区别
当两个同步端点在同步间隔内修改了同一文件时,这两个工具都会生成冲突文件。区别在于谁会看到这些文件。
Syncthing 会将落后的副本重命名为 <filename>.sync-conflict-<date>-<time>-<modifiedBy>.<ext>。修改时间较早的副本会被判定为落后。如果修改时间相同,则设备 ID 前 63 位数值较大的设备会被判定为落后;该判定虽是任意的,但在所有对等节点上结果一致。接下来是用户通常未预料到的部分:这些文件“一旦创建就会被视为普通文件,因此会在各设备间传播”。每个对等节点都会收到冲突副本。清理冲突文件只需执行一次删除操作并同步即可,但在此之前,您会在所有设备上看到该文件。
Nextcloud 桌面客户端会写入 <name> (conflicted copy YYYY-MM-DD HHMMSS).<ext>(例如 mydata (conflicted copy 2018-04-10 093612).txt),且默认不会上传该文件。客户端手册给出的理由是:变更的发起者最适合解决冲突,向其他用户展示冲突只会造成困扰。如果您希望改变此行为,可在客户端环境中设置 OWNCLOUD_UPLOAD_CONFLICT_FILES=1。
综上所述,Syncthing 的冲突是集群范围内的事件,而 Nextcloud 的冲突仅保留在单台桌面设备上。
文件夹类型可提升 Syncthing 在服务器上的安全性
Syncthing 提供三种文件夹类型。在 VPS 上选择合适的类型可避免多种人为失误。
- “发送与接收” (Send & Receive) 是默认设置。更改会在双向同步。
- “仅发送” (Send Only) 会忽略集群发送的所有更改。适用于仅需发布数据的设备。当状态不同步时,GUI 会显示红色的“覆盖更改” (Override Changes) 按钮,将本地状态强制推送到所有设备。
- “仅接收” (Receive Only) 仅应用来自集群的更改,不会将本地编辑回传。适用于作为归档节点的 VPS。在该模式下,本地编辑会触发红色的“还原本地更改” (Revert Local Changes) 按钮。
在 VPS 上使用“仅接收”文件夹并开启“交错式” (Staggered) 版本控制,即可获得一个带版本备份的镜像。笔记本电脑上的删除操作仍会同步,因为删除被视为合法的集群更改,但旧版本文件会进入 .stversions 目录,而不会直接消失。
该如何选择
下方的 7 行内容涵盖了用户提出此问题的实际原因。
The data behind this chart
[
{
"label": "Keep two of my own laptops in sync",
"pick": "Syncthing",
"notes": "No accounts to manage. The VPS is the peer that is always awake."
},
{
"label": "Send a download link to a client",
"pick": "Nextcloud",
"notes": "Syncthing has no public link sharing at all."
},
{
"label": "Open a file from a borrowed browser",
"pick": "Nextcloud",
"notes": "The Syncthing GUI shows sync state, never file contents."
},
{
"label": "Sync 200 GB between machines I own",
"pick": "Syncthing",
"notes": "Peers transfer directly. The VPS copy is optional."
},
{
"label": "Phone photo upload with a store app",
"pick": "Nextcloud",
"notes": "The official Syncthing Android app ended in December 2024."
},
{
"label": "Calendar and contacts alongside files",
"pick": "Nextcloud",
"notes": "Syncthing syncs files. That is the entire feature set."
},
{
"label": "1 GB VPS with nothing else to spare",
"pick": "Syncthing",
"notes": "One Go binary against PHP plus a database plus a web server."
}
]请查看第一行。若需同步两台个人笔记本电脑,应选择 Syncthing,此时 VPS 作为永不关机的对等节点发挥作用。涉及浏览器、链接或他人的每一行情况,则指向相反的选择。
如果 Nextcloud 持续胜出但你担心其资源占用,Seafile 与 Nextcloud 的对比 是接下来应阅读的内容,因为 Seafile 在底层采用了不同的同步引擎,但仍保留了服务器模式。
在同一台 VPS 上同时运行两者
两者并不冲突。使用 Syncthing 在个人设备间同步文件,同时利用 Nextcloud 处理共享和日历,是一种常见的部署方案。
如果同时使用,请遵循一条原则:切勿将 Syncthing 指向 Nextcloud 的数据目录。Nextcloud 会在数据库中追踪所有文件,因此直接在磁盘上添加的文件在数据库更新前,无法在 Web 界面中显示。在 Nextcloud 安装目录下执行:
sudo -u www-data php occ files:scan --all该命令会输出扫描到的文件和文件夹数量。通过定时任务运行此命令仅为权宜之计,而非设计初衷。请为每个工具分配独立的目录。如果您仍在考虑服务器上应部署哪些服务,2026 年自托管指南 比优先选择同步工具更适合作为起点。
FAQ
Syncthing 可以替代 Dropbox 吗?
仅限于同步个人设备这一功能。Syncthing 没有公共分享链接,也没有用户账户;其 Web 界面从不显示文件内容,因为不存在供浏览器请求的中央副本。官方 Android 应用在 2024 年 12 月发布后已停止维护并从 Play Store 下架,因此手机端支持目前依赖社区分支版本。如果你需要向他人发送链接,则需要一台服务器,这意味着你需要使用 Nextcloud 或类似工具。
Syncthing 是备份工具吗?
不是,项目官方对此有明确说明。删除和修改操作会同步到所有设备,因此误删操作会在几秒钟内导致所有设备上的文件丢失。为每个文件夹开启文件版本控制(尤其是针对常驻节点的 Staggered 模式)可以通过 .stversions 目录提供恢复窗口。但这不能替代由独立工具在独立存储上执行的快照备份。
为什么我在 Syncthing 的 Web GUI 中看不到我的文件?
因为该 GUI 是用于管理同步状态的控制面板,而非文件浏览器。它仅显示文件夹、设备、传输进度和冲突计数,从不列出或打开文件内容。这是由其点对点(peer-to-peer)设计决定的:文件存储在你的设备上,而 VPS 上的 GUI 仅负责管理文件传输进程。
Syncthing 在 VPS 上需要开放哪些端口?
22000/TCP 用于同步协议,22000/UDP 用于 QUIC 传输。21027/UDP 端口用于局域网发现(通过广播和组播),该流量不会跨越互联网,因此请在公网服务器上保持关闭。将 8384 端口的 GUI 绑定到 127.0.0.1,并通过 SSH 隧道访问。请同时检查服务商的网络防火墙和 ufw,因为它们是独立的控制层。
我可以在同一台 VPS 上同时运行 Syncthing 和 Nextcloud 吗?
可以,在内存为 2 GB 或以上的服务器上这样做是合理的。请保持它们的目录独立。Nextcloud 会将其数据库中的文件建立索引,因此 Syncthing 写入 Nextcloud 存储目录的任何内容,在执行 occ files:scan 之前,在 Web 界面中都是不可见的。两个工具同时写入同一个目录还会产生双方都无法预期的冲突文件。