SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor

值得自行托管的 Nextcloud 替代方案

按需求比较 Syncthing、Seafile、对象存储和 SFTP:了解小型 VPS 的资源占用、文件迁移成本,以及何时值得放弃 Nextcloud。

哪些 Nextcloud 替代方案值得自行托管?

值得运行的 Nextcloud 替代方案,是那些去掉您从未使用过的功能的方案。Nextcloud 将文件服务器、日历、联系人簿、办公套件和应用平台都放在一个 PHP 应用中。每次加载页面时,您都要为这些功能支付资源成本。因此,应先明确您仍然需要哪一项功能,再检查迁移现有文件需要付出什么代价。

本指南按功能需求整理这些选项:仅同步、同步加更快的服务器、对象存储加客户端,或简单的远程文件访问。每个部分都会说明该方案在小型 VPS(虚拟专用服务器)上需要什么,以及现有目录树会如何处理。如果您使用的是 Dropbox 或 Google Drive,而不是已经运行的 Nextcloud 服务器,请先阅读更全面的自托管 Dropbox 替代方案汇总

为什么 Nextcloud 在小型 VPS 上运行缓慢

性能变慢有明确原因。了解这些原因后,您才能判断迁移实例是否真的有帮助。

每次页面加载都会占用一个 PHP worker。 截至 August 2026,Nextcloud 的系统要求按 每个进程 计算内存:最低 128 MB,建议 512 MB。这不是整个服务器的总内存。对于 2 GB 方案,包含十个 worker 的进程池会占用实际的内存预算。因此,管理员会在 PHP-FPM 进程池配置中降低 pm.max_children,请求随后会排在现有 worker 后面等待。磁盘处于空闲状态,但界面仍然感觉缓慢。

数据库的增长取决于文件数量,而不是文件总大小。 在默认表前缀下,文件缓存表 oc_filecache 会为服务器已知的每个存储中的每个文件和文件夹保存一行记录。包含 300,000 个小文件的照片库会产生一张大表;包含 300 GB 视频文件、但只有 400 个文件的存储则会产生一张小表。共享、搜索和文件扫描器都会读取这张表。

sudo mysql nextcloud -e 'SELECT COUNT(*) FROM oc_filecache;'

数百万条记录比任何磁盘基准测试都更能解释文件列表为何缓慢。如果您的实例使用了其他表前缀或 PostgreSQL,请调整查询。

后台任务会与 Web 界面争用资源。 Nextcloud 手册建议设置系统 cron,每五分钟运行一次 cron.php。预览生成和文件扫描都会在那里运行,并与处理浏览器请求的任务使用同一个 CPU。

重大升级包含数据库迁移。 实例会进入维护模式,并在迁移完成前使用 Nextcloud is in maintenance mode, please try again later 响应每个请求。对于 oc_filecache 较大的小型 VPS,这段时间可能长到足以被用户察觉。

首先确定要保留的功能

  • 在自有设备之间同步一个文件夹,且不需要 Web 界面:Syncthing。
  • 为多人提供同步,且需要 Web 界面、移动客户端和共享链接:Seafile。
  • 以较低成本存储大量数据,并通过脚本和备份工具访问:对象存储加客户端。
  • 无需安装新的服务器软件,即可远程读写文件:SFTP 或 WebDAV。
  • 在浏览器中共同编辑文档,或在人与人之间共享日历:继续使用 Nextcloud,或接受同时运行两个服务。

Syncthing:无需服务器应用的文件同步

Syncthing 将文件保留为普通文件。它没有内容数据库,也没有用于提供文档访问的 Web 界面。加入文件夹的每台设备都保存完整副本,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
sudo systemctl enable --now syncthing@$USER
sudo ss -lntp | grep 8384

显示 127.0.0.1:8384 表示 Web 界面正在运行,且仅绑定到 localhost。这正适合公网上的 VPS。使用 SSH 隧道访问:ssh -L 8384:127.0.0.1:8384 you@your-vps,然后在笔记本电脑上打开 http://127.0.0.1:8384。如果 8384 没有监听,说明服务启动失败;journalctl -u syncthing@$USER -n 50 会说明原因。

资源。 Syncthing 没有公布最低内存要求。它的资源使用量取决于索引的文件数量,而不是文件总大小,因为每个共享文件夹中的每个文件都对应一个索引条目。大型文件夹的首次扫描需要消耗 CPU:Syncthing 必须先计算每个文件的哈希值,才能进行比较。在共享 vCPU 上,首次扫描可能需要运行一段时间。内存使用量会随文件数量增加,而不是随文件总容量增加。

磁盘才是真正的成本。 Syncthing 不是服务器,因此不会在服务器端单独保存文件。在 VPS 和笔记本电脑之间共享一个 200 GB 的文件夹时,两端都需要 200 GB 磁盘空间。这与 Nextcloud 相反:Nextcloud 将所有内容保存在服务器上,由客户端选择要同步的内容。如果 VPS 的用途是作为备份目标而不是对等节点,请使用选择性文件夹,并在 VPS 上使用 receive only 文件夹。

迁移是选择它的原因。 让 Syncthing 指向已有的目录树即可。无需导入、上传或转换。在 VPS 上添加该文件夹,再使用相同的文件夹 ID 在笔记本电脑上添加它,然后让两端逐步完成同步。如果首次连接时两端存在内容不同的同名文件,Syncthing 会保留两份,并将其中一份重命名为 filename.sync-conflict-20260809-142530-ABCD123.txt。首次同步时看到这类文件是正常现象,不表示同步失败。

需要放弃的功能。 没有账户,没有可发送给其他人的共享链接,也无法通过手机浏览器浏览文件。原 Android 应用已不再由项目本身维护,目前由社区分支继续维护。如果移动端访问是主要需求,这一点很重要。Syncthing 与 Nextcloud 的直接比较 将逐项介绍两者的功能差异。

Seafile:更轻量服务器上的高速同步

Seafile 将工作拆分为两部分。名为 Seahub 的 Python Web 应用负责呈现界面,独立的 C 进程负责处理同步流量。文件传输不会经过 Web 应用,因此即使其他用户正在操作界面,大文件上传仍能保持较高速度。13.0 版本于 2026 年 1 月 5 日发布。

sudo mkdir -p /opt/seafile
cd /opt/seafile
sudo wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env
sudo wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml
sudo wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml
sudo wget https://manual.seafile.com/13.0/repo/docker/caddy.yml

开始前先编辑 .env。它会设置 SEAFILE_SERVER_HOSTNAMEINIT_SEAFILE_ADMIN_EMAILINIT_SEAFILE_ADMIN_PASSWORDSEAFILE_MYSQL_DB_PASSWORDJWT_PRIVATE_KEY;这些值必须是至少包含 32 个字符的随机字符串。该文件还会告诉 compose 读取哪些已下载的 YAML 文件,因此这四个下载文件会作为一个堆栈运行。

cd /opt/seafile
sudo docker compose up -d
sudo docker compose ps

每个容器都应报告为运行状态。容器反复重启通常表示 .env 中缺少某个值,sudo docker compose logs seafile 会指出缺少的是哪个值。

资源要求。 截至 2026 年 8 月,Seafile 文档要求至少 2 GB 内存,以及主频高于 2 GHz 的 2 核 CPU。应将其视为整个堆栈的最低配置,因为 Docker 部署还会启动 MariaDB、Caddy 反向代理和 SeaDoc 编辑器。如果有超过一两名用户使用,应分配 4 GB 内存;也可以不启动可选容器。

迁移时需要注意存储格式。 Seafile 不会将文件按普通文件保存。它会将每个文件拆分为块并存储在 /opt/seafile-data 下,同时在数据库中记录目录树。因此,不能让 Seafile 直接使用现有目录并将其显示为资料库;迁移时必须完整上传所有文件。由于采用相同的设计,不能使用 cp 直接导出数据:恢复操作必须通过服务器完成,使用 seaf-fsck 执行一致性检查,或使用只读的 seaf-fuse 挂载。

rclone 提供原生 Seafile 后端,可以将上传过程变成一条支持断点续传的命令,而不是长时间拖放文件。

rclone config
rclone copy /srv/files seafile:MyLibrary --progress

rclone 文档列出的已测试版本为 Seafile 6.x 到 9.x,因此应先对一个较小的目录执行操作并检查结果,再通过它传输 1 TB 数据。

加密资料库是用户迁移到 Seafile 的主要功能。密码在客户端设置,服务器只保存无法读取的文件块。需要明确的是:在浏览器中预览加密资料库中的文件时,该会话会将密码发送到服务器。因此,浏览器预览和零知识存储不能同时实现。Seafile 与 Nextcloud 的功能对比介绍了其余功能差异。

在上层使用同步客户端的对象存储

如果目标是以较低成本存储大量数据,并让脚本能够访问这些数据,可以运行兼容 S3 的对象存储,再将同步作为独立工具使用。这样可以获得数据持久性、版本控制,以及所有备份工具都支持的协议。但它不具备文件服务器意义上的用户账户,也不提供易于使用的文件管理器。使用 MinIO 自托管对象存储介绍服务器端的配置。

rclone copy /srv/files s3remote:mybucket --progress
rclone check /srv/files s3remote:mybucket

rclone check会比较两端的大小和哈希值,并输出存在差异的文件数量。只要错误数不是零,副本就不完整,因此在删除源数据前再次运行 copy。需要注意两点:对象存储没有目录,只有键前缀,因此空文件夹不会在复制后保留;同时提高 --transfers并增大 S3 分块大小会增加 rclone 的内存使用量,因此在 1 GB VPS 上应保留这两个参数的默认值。

仅需远程文件时,使用普通 WebDAV 或 SFTP

最廉价的替代方案通常是什么都不新增。如果您的 VPS 运行 OpenSSH,就已经具备文件服务器。SFTP 不需要额外的 daemon、数据库或 PHP,也不需要可能在周日升级失败的组件。

sftp you@your-vps
rclone mount sftpremote: ~/vps --vfs-cache-mode writes

对于支持 WebDAV 的客户端(包括大多数手机文件管理器),可以使用 rclone 提供同一目录树。

sudo apt install apache2-utils
sudo htpasswd -c /etc/rclone/htpasswd you
rclone serve webdav --addr 127.0.0.1:8080 --htpasswd /etc/rclone/htpasswd /srv/files

将其绑定到 127.0.0.1,并在前面配置带 TLS(传输层安全)的反向代理。WebDAV 基本身份验证会在每个请求中发送密码,因此这里使用普通 HTTP,就意味着每分钟多次传输密码。迁移成本为零,因为文件完全不需要移动。代价是没有同步功能,也没有离线副本:连接断开后,客户端将无法访问这些文件,直到连接恢复。

替代日历、联系人和文档编辑的方案

在这方面,离开 Nextcloud 会带来一定成本,因此有必要明确了解具体影响。日历和联系人使用 CalDAV 和 CardDAV(通过 HTTP 同步日历和联系人),Radicale 是一个轻量级替代方案。它将每个集合存储为磁盘上的文件,运行时只需占用几十 MB 内存。

sudo apt install radicale
sudo systemctl enable --now radicale
sudo ss -lntp | grep 5232

该软件包包含 /usr/lib/systemd/system/radicale.service,默认配置文件位于 /etc/radicale/config,监听 localhost:5232。Radicale 没有编辑事件的界面,因此需要让手机或桌面客户端连接到它,并在客户端中进行编辑。

浏览器中的文档编辑更难替代。OnlyOffice Docs 和 Collabora Online 都是编辑引擎,而不是存储系统:两者都需要一个用于保存文件并传递文档的宿主应用。移除 Nextcloud 后,您需要使用其他宿主,例如搭配自有 SeaDoc 编辑器的 Seafile。OnlyOffice 和 Collabora 对比介绍了在确定宿主应用后应运行哪个编辑引擎。

如果符合以下任一情况,请继续使用 Nextcloud

  • 多人需要在与文件相同的账户中,共享一个日历和一个地址簿。
  • 您需要在浏览器中编辑办公文档,并与其他人同时编辑同一个文件。
  • 您需要支持过期日期和密码的单文件共享链接,以及群组权限。
  • 您的用户不熟悉技术,而他们实际使用的是移动应用。

对于这些需求,没有更轻量的方案能够全部满足。与其弃用 Nextcloud,不如修复现有安装。大多数运行缓慢的实例都使用了默认的 PHP-FPM pool,且未配置内存缓存;Nextcloud 的管理概览页面也会提示缺少缓存。减少跟踪的文件数量比其他任何单项更改都有效,因为增长的是文件缓存表。在 VPS 上使用 Docker、TLS 和备份部署 Nextcloud 的配置方式可以避免其中大部分问题。

迁移的实际成本:逐项比较

  • Syncthing:无需导入。让它访问两端已有的目录树,然后等待两端收敛。
  • 基于同一目录树的 SFTP 或 WebDAV:完全无需导入,因为没有数据需要移动。
  • 对象存储:需要完整复制一次网络数据。复制过程可恢复,也可通过脚本执行,但空目录无法保留。
  • Seafile:需要将所有数据完整上传到资料库,因为服务器保存的是数据块,而不是文件。

无论选择哪种方式,都应先从 Nextcloud 导出一份完整且一致的副本。用户文件以明文形式存放在 data 目录下,每个用户对应一个目录,因此该目录树的 rsync 就是源数据。复制前将实例置于维护模式,否则复制过程中可能读到正在写入的文件。

sudo -u www-data php occ maintenance:mode --on
sudo rsync -a --info=progress2 /path/to/nextcloud/data/ /srv/files/
find /srv/files -type f | wc -l

将该计数与源端相同的 find 进行比较。数量不足通常表示权限阻止 rsync 读取某些内容;它会在处理过程中输出这些错误。

复制过程中有两个容易忽略的问题。通过 Nextcloud 外部存储功能访问的文件根本不在 data 目录中,因为它们位于 Nextcloud 配置的远程系统上。如果曾启用服务器端加密,磁盘上的文件就是密文,因此必须先运行 occ encryption:decrypt-all,再进行复制,否则迁移的将是一整个无法读取的数据目录。在取消任何操作前,请先检查这两点。

FAQ

是否有保留现有文件夹结构的 Nextcloud 替代方案?

Syncthing,以及普通的 SFTP 或 WebDAV 配置都可以。Syncthing 会为您指定的目录建立索引,并在每台设备上保留相同的名称和层级结构,因此不需要导入,也不需要上传。Seafile 和对象存储都需要完整上传一次,因为它们都不会将数据存储为普通目录树中的普通文件。Seafile 会在其数据目录下将文件拆分为多个块,而对象存储使用的是键,不是目录。

Seafile 能在 2 GB VPS 上运行吗?

截至 2026 年 8 月,Seafile 文档要求至少 2 GB RAM 和 1 个主频高于 2 GHz 的 2 核 CPU。应将这视为没有余量的最低配置,因为 Docker 部署还会在各自的容器中运行 MariaDB、Caddy 和 SeaDoc 编辑器。单个用户使用基本可行。对于家庭或小型团队,应升级到 4 GB,或者不运行 SeaDoc 容器,并放弃在浏览器中编辑文档。

为什么下载速度仍然很快,但 Nextcloud Web 界面很慢?

因为这两条路径执行的工作不同。下载会从磁盘流式传输字节,而页面加载需要运行 PHP、查询文件缓存表,并且通常要等待空闲的 PHP-FPM worker。在归咎于存储之前,请统计 oc_filecache 中的行数,并检查 PHP-FPM pool 中的 pm.max_children。如果表中有数百万行,而 pool 只有 5 个 worker,就会出现这种情况。

可以保留 Nextcloud 用于日历,只迁移文件吗?

可以,而且这通常是成本最低的方案。使用 Syncthing 或 Seafile 同步大文件夹,同时继续运行 Nextcloud 以提供 CalDAV、CardDAV 和浏览器文档编辑功能。Nextcloud 跟踪的文件越多,数据库就越大,因此要让界面恢复速度,关键是从 Nextcloud 中移除这些大型目录。请通过 Web 界面或 occ 删除它们,不要直接从磁盘上的数据目录删除,否则数据库会继续保留指向已不存在文件的记录。