自托管Dropbox替代方案对比:Nextcloud、Seafile与Syncthing
对比Nextcloud、Seafile、Syncthing和对象存储:了解同步拓扑、小型VPS的实际成本,以及为什么同步不能替代备份。
应运行哪种自托管 Dropbox 替代方案?
有4种自托管 Dropbox 替代方案值得考虑:Nextcloud、Seafile、Syncthing,以及在对象存储之上使用客户端。它们不能互相替代。Nextcloud 适合家庭或小型团队,尤其适合需要向他人发送文件的场景。Seafile 适合需要同步大量小文件的个人或团队,此时同步速度比数据在磁盘上的存储形式更重要。Syncthing 适合个人在自己的设备之间同步数据,且不需要向外部人员提供链接。对象存储适合归档:存储成本低,但很少访问。
比较功能之前,应先根据同步方式进行选择。功能列表看起来都很相似。拓扑结构,也就是每台其他设备都要与之保持一致的副本所在的机器,才决定您在6个月后是否仍然满意。
同步拓扑:权威服务器,或无服务器的对等节点
目前有两种设计可选,后续大部分内容取决于您的选择。
权威服务器。 Nextcloud、Seafile 和对象存储都采用这种方式。一台通常是 VPS(虚拟专用服务器)的计算机保存权威副本。每台设备都与这台计算机通信。您的笔记本电脑可以离线一个月,重新上线后会自动追上最新状态。可用空间只有 6 GB 的手机可以只保存部分数据,而服务器保存全部数据。浏览器可以访问这些文件,这也是共享链接能够存在的原因。
无服务器的对等节点。 Syncthing 采用这种方式。设备彼此发现,并通过加密连接直接交换文件列表。没有哪个副本具有权威性:文件只存在于保存它的设备上,其他位置都没有。两台设备必须同时在线,变更才能在它们之间传递。由于没有计算机提供网页服务,因此没有可供他人访问的 URL。
由此会产生4个影响,用户通常会在后期才遇到这些问题。
- 要将文件发送给不愿安装软件的人,需要权威服务器。链接就是 URL,而 URL 需要有进程监听端口。
- 要从不受您控制的计算机(例如工作笔记本电脑)访问文件,需要权威服务器。
- 设备离线数周后,可以在重新上线时从服务器追上最新状态。在对等节点架构中,只有同时有另一台保存这些数据的设备在线时,它才能追上最新状态。因此,许多 Syncthing 用户会在 VPS 上运行一个实例,将其作为始终在线的对等节点。
- 存储空间的计算方式不同。权威服务器保存一个完整副本,此外每台设备还会保存其本地保留的数据。4个共享同一文件夹的对等节点会保存4个完整副本,因为每个对等节点都保留整个文件夹。
Nextcloud:用户、组和公共链接
Nextcloud 是一个 PHP Web 应用。它会将文件以普通文件的形式存储在数据目录中,并在数据库中记录这些文件。您可以与某个用户或组共享文件夹,也可以创建带密码和过期日期的公共链接。版本历史默认启用,删除的文件会先进入回收站。桌面客户端支持 Linux、macOS 和 Windows,iOS 和 Android 也有官方应用。如果您弃用 Dropbox 的原因是其他人需要接收您的文件,那么 Nextcloud 是一个符合实际需求的选择。
代价是组件较多。常规安装需要 Web 服务器、PHP-FPM(PHP 进程管理器)、MariaDB 或 PostgreSQL 等数据库,以及用于文件锁定的 Redis。后台任务通过 cron 或 systemd timer 每五分钟运行一次。在 1 GB VPS 上它可以启动,但大文件上传或较长的 occ 维护命令可能触发 out-of-memory killer。对于少量用户,将 2 GB 视为最低配置;启用更多应用后,预计需要 4 GB。升级也是另一项代价:应用商店中的应用是针对特定核心版本构建的,因此升级到下一个大版本前,请确认您依赖的应用支持该版本。
当一个账户包含数十万个小文件时,Nextcloud 的性能会下降。原因是每个文件都对应文件缓存表中的一行,也对应磁盘上的一个实际文件,而桌面客户端会逐个处理这些文件。在家庭使用规模下通常不会遇到这个问题。容量规划、TLS(传输层安全)和备份请参阅基于 Docker、启用 TLS 并配置备份的 Nextcloud 安装;确定使用 Nextcloud 后,应从这里开始。
还需要明确功能范围。Nextcloud 还可以管理日历、联系人、笔记和照片库;每启用一个应用,就会增加后台任务,并增加一个可能阻止升级的组件。如果实际需求是照片管理,专用工具处理效果更好:请参阅将 Immich 用作自托管的 Google Photos 替代方案。如果实际需求是文档和 Wiki,请查看自托管的 Notion 替代方案,不要将多个应用不断堆叠到文件服务器上。在浏览器中编辑这些文档需要另一个独立的服务器,而不是 Nextcloud 应用,因此在认定 2 GB 仍然足够前,请比较OnlyOffice 和 Collabora。
Seafile:专为大量小文件设计
Seafile 会将每个文件拆分为多个块,并将这些块存储在内部对象存储中,通过内容哈希寻址。这与 git 存储对象的方式相同。同步和共享的单位是库,而不是文件夹树。由于客户端上传的是文件块和一次提交,而不是为每个文件分别发送一个请求,因此同步包含 100,000 个小文件的目录时,速度远快于逐文件处理的协议。相同的块只存储一次,因此大型文件的第二个副本几乎不占用额外空间。
代价是,服务器上的文件不再以普通文件形式存在。打开存储目录后,看到的是名称由十六进制字符组成的对象文件。要导出数据,必须使用 Seafile 客户端,或 Seafile 自带的导出和 fsck 工具。备份仍然有效,因为这些对象本身就是普通文件;但你无法使用 cp 恢复单个电子表格。现在就决定这是否可以接受,因为这是用户日后最容易后悔的特性。
Seafile 提供社区版和付费专业版,两个版本的功能划分会随版本发布而变化。因此,在围绕某项具体功能规划团队部署前,请先阅读其网站上的当前条款。Seafile 提供官方桌面客户端和移动客户端。加密库在客户端加密,因此服务器保存的是无法读取的密文。如果丢失密码短语,整个库都无法读取,包括你自己也无法读取。在浏览器中打开加密库意味着要将该密码短语提供给 Web 会话,因此,这项保证的完整强度只适用于桌面客户端和移动客户端。
资源消耗与 Nextcloud 接近。你需要运行数据库、内存缓存和两个应用进程,因此 2 GB 仍然是合理的最低配置。
Syncthing:无需登录
Syncthing 是一个 Go 单一二进制文件。它监视文件夹,通过发现服务器或中继查找对等设备,并在设备之间直接同步。没有账户,也没有供同步对象使用的登录页面。您通过设备 ID 配对两台设备,然后在两端分别接受该文件夹。它是这里最省事的方案,因为需要运行的组件很少。
您放弃的是完整的共享功能。对应条目为 Device pairing only, no links。您无法向客户、会计人员或亲属提供链接。移动端是另一个缺口:Android app, no official iOS。项目自身的 FAQ 对此说明得很直接:“当前 Syncthing 团队没有在可预见的未来正式支持 iOS 的计划”,因为 iOS 对后台处理的限制很严格,难以实现可靠同步。iOS 用户只能使用第三方应用。
资源占用较小,但有一点需要了解。Syncthing 会为同步的每个文件保留一个索引条目,因此内存占用和首次扫描时间取决于文件数量,而不是总容量。首次为大型文件夹计算哈希时,CPU 会持续工作一段时间,之后占用会趋于稳定。在最小规格的 VPS 方案上运行也很轻松。
发生冲突时,Syncthing 会保留两侧的文件。如果两台设备在无法互相连接期间修改了同一个文件,Syncthing 会重命名其中一个副本,并将其保存在另一个副本旁边,因此您会看到类似 notes.sync-conflict-20260802-141530-K7MB3QT.md 的文件。不会丢失任何内容,也不会自动合并。您需要手动解决冲突。
使用客户端访问对象存储:低成本存储,不是同步文件夹
对象存储是指兼容 S3(简单存储服务)的存储桶。您可以使用 MinIO 自托管,也可以向服务提供商租用。您需要通过工具访问它:可以在命令行使用 rclone,也可以使用将存储桶显示为驱动器的桌面客户端。如果您更愿意通过网页而不是 shell 浏览存储桶,这份自托管文件管理器对比中的一些工具可以将 S3 存储桶用作后端,并在其上提供自己的共享链接。共享方式是预签名 URL,也就是带有自身过期时间的链接。版本控制是存储桶设置:Bucket versioning, off by default,因此请在创建存储桶时启用它,因为它不会应用于之前上传的对象。
将存储桶当作同步文件夹使用,就会出现问题。默认情况下,没有任何程序会监控您的 Documents 目录。rclone bisync支持双向同步,而 rclone 的官方文档也明确说明了使用时需要谨慎。对象存储最适合用作底层存储:作为备份目标,或作为应用程序背后的存储层。使用 MinIO 自托管兼容 S3 的对象存储介绍了服务器端配置。
这里的资源成本比较特殊。MinIO 只有一个二进制文件,空闲时资源占用很低。您实际支付的成本是磁盘费用;在 VPS 上,这意味着按 GB 租用的块存储卷,以及传入和传出对象所消耗的带宽。这两项成本都不会显示在 free -h 中,因此请先阅读VPS 每月的实际成本,再确定归档规模。
共享、移动客户端与版本控制对比
The data behind this chart
[
{
"tool": "Nextcloud",
"sharing": "Public links, users and groups",
"mobile": "Official iOS and Android apps",
"versioning": "On by default, plus trash"
},
{
"tool": "Seafile",
"sharing": "Public links with password and expiry",
"mobile": "Official iOS and Android apps",
"versioning": "Library history and snapshots"
},
{
"tool": "Syncthing",
"sharing": "Device pairing only, no links",
"mobile": "Android app, no official iOS",
"versioning": "Optional per folder, off by default"
},
{
"tool": "Object storage",
"sharing": "Presigned URLs you generate",
"mobile": "Third party clients only",
"versioning": "Bucket versioning, off by default"
}
]所有 4 个选项都沿着同一条线展开。其中 3 个选项可以将文件交给只拥有浏览器的陌生人。另 1 个选项只能与您已经拥有的设备通信。需要特别说明 Seafile 的版本控制选项 Library history and snapshots:历史记录按库保存,因此删除库时,其中的历史记录也会一并删除。
再次取回数据
现在检查退出成本很容易,之后才发现成本很高。因此,在做出承诺前先进行检查。
Nextcloud 将实际文件存储在实际目录中,因此对数据目录执行 tar,即可取回文档,即使应用之后再也无法启动。Syncthing 会在每个对等节点上执行相同操作,因此在这里提供了最可靠的退出方式:文件始终直接存放在每台设备上。Seafile 的对象存储需要使用 Seafile 或其导出工具,才能将数据块重新组装成文件。对象存储需要使用 rclone 或等效工具,只需执行一条命令即可。
同步不是备份,数据丢失往往就发生在两者的差异之间
这里的每个工具都会在设备之间复制变更。删除操作也是一种变更。在笔记本电脑上删除文件夹后,客户端会将删除操作通知服务器,服务器应用该操作,其他设备也会删除对应内容。勒索软件利用的是相同路径:它在本地加密文件,客户端检测到文件已修改,然后上传加密后的版本。同步过程完全正常,但数据仍然丢失。
回收站和版本历史可以降低影响。但它们也会过期,并且可能被执行错误操作的同一账户清空;此外,它们与当前副本位于同一块磁盘上。卷发生故障时,文件及其历史记录会一起丢失。
备份是位于独立硬件上的独立副本,按计划创建,并且你至少成功恢复过一次。应在备份文件的同一轮任务中备份数据库。仅恢复 Nextcloud 数据目录而不恢复数据库,会得到一个不知道这些文件存在的实例;之后执行 occ files:scan 会恢复文件,却丢失存储在这些数据表中的共享和版本历史。从 VPS 执行计划性 restic 备份介绍了这种加密、去重备份方案,包括如何测试恢复,而不是假定恢复一定可用。
我的选择
对于阅读本文的大多数人,我会选择 Nextcloud。离开 Dropbox 后,很多人缺少的是:将链接发给不可能安装任何软件的人,以及在手机上打开文件。Nextcloud 通过官方客户端同时提供这两项功能,而且没有付费层级;为此使用 2 GB RAM 是合理的代价。
有两个例外。如果文件夹始终只属于您,并且始终只存储在您拥有的硬件上,请运行 Syncthing。这样无需修补服务器,也无需保护 Web 登录入口。如果您要同步包含数十万个文件的工作目录,请运行 Seafile,并接受其不透明的存储方式,以换取更高的速度。无论选择哪一种,Object storage 都应位于其下方,作为备份目标,而不是位于其前方充当同步工具。
FAQ
Syncthing 是我笔记本电脑的备份吗?
不是。Syncthing 会在设备之间同步更改,删除操作和其他更改一样,因此误删的文件会在几秒内从所有配对设备中消失。按文件夹启用文件版本控制可以降低风险,但默认关闭,必须在每个文件夹中单独启用。请在独立硬件上按计划执行真正的备份,并至少恢复一次,以确认恢复流程正常。
我可以在同一台 VPS 上运行 Nextcloud 和 Syncthing 吗?
可以。两者监听不同端口,不会发生冲突。不要将 Syncthing 文件夹指向 Nextcloud 的数据目录。Nextcloud 会在数据库中跟踪每个文件,因此直接出现在其目录下的文件在运行 occ files:scan 之前不会显示,而直接从该目录删除的文件会在数据库中留下指向不存在对象的记录。请为 Syncthing 使用独立目录,或将该目录作为外部存储挂载到 Nextcloud,使 Nextcloud 知道需要检查该目录。
哪个应用可以让我与没有账号的人共享链接?
Nextcloud 和 Seafile 都可以创建公开链接,并支持设置可选密码和过期日期。对象存储可以生成预签名 URL,在设定时间到达后自动失效。Syncthing 无法提供这种功能。它采用设备配对的共享模式,因此对方必须安装 Syncthing,向您提供设备 ID,并接受该文件夹。
服务器需要多大的磁盘空间?
对于作为权威数据源的服务器,应按共享数据的完整大小规划空间,并额外预留文件版本历史、回收站和正在上传文件所需的工作空间。文件版本历史最容易被低估:如果保留一个每天变化的 2 GB 文件的所有版本,空间会快速增长,因此应尽早设置保留策略。将数据放在独立卷上,可以避免这些数据占满根文件系统;根文件系统一旦写满,整个服务器都会停止工作,而不只是某次上传失败。