教程
如何用一台属于自己的 Nextcloud 服务器取代 Google Drive
云存储,是大多数人交给一家公司的东西里最私密的那一类。不是文档——是照片,是身份证件的扫描件,是报税记录,是一部手机里几乎所有东西的备份。它放在一个账户里,这个账户可能被一套自动化系统说封就封、且没有申诉余地;服务器会扫描你上传的一切;账户还绑着你多年前验证过、如今再也解不开的那个身份。人们往往在最糟糕的时刻才发现这套安排的真实形状——通常是一个被锁死的账户,连带二十年的家庭照片一起消失的那一刻。Nextcloud 是开源世界给出的答案:同样的同步客户端,同样的手机 App,同样的分享链接——只不过跑在一台你自己租来的机器上,存的文件也没有别人在旁边建索引。安装它只需要一个下午。真正决定它是不是比你离开的那个平台更好的,是底下那块磁盘,还有一个几乎每篇教程都会讲错的加密问题。
Nextcloud 到底替代了什么
Nextcloud 与其说是一个应用,不如说是一整套小工具的集合,凑巧覆盖了消费级云账户能做的大部分事情。这份广度,正是它值得自托管的理由:只为替代一项服务而自己维护一台服务器,通常并不划算,但用一台服务器同时替代五项服务,通常就划算了。
- 文件同步与分享,这是核心功能。Windows、macOS 和 Linux 都有桌面客户端,两大移动平台都有 App,还有网页界面——你熟悉的那种把文件夹一拖、到处都会自动出现的体验,这里都有。
- 手机照片备份,支持相机自动上传、相册和人脸分组。对大多数人来说,这是数据量最大的一块,也是磁盘容量必须算准的原因。
- 日历和联系人走的是开放的 CalDAV 与 CardDAV 标准,每部手机原生就支持——同步它们不需要任何第三方 App。
- 协同文档功能可以通过外挂的办公套件实现,在浏览器里直接编辑表格和文本文件,不用把它们发到别处去。
- 公开分享链接可以设密码、设过期时间,还能建立只能上传的收件文件夹——这个功能通常能彻底治好用邮件发大附件的老习惯。
- 服务端版本控制和回收站,让一次覆盖写入或一次糟糕的同步,不用动用备份就能恢复。
这里的边界值得说清楚,因为围绕自托管的宣传通常不会说。Nextcloud 给你的是控制权和隐私。它给不了你超大规模云服务商那种级别的持久性——那些公司会把你的数据复制到好几个大洲,而一台你租来的服务器不会,不管它的磁盘有多好。它也不会让存储变免费:不管走哪条路,你都在为存储付钱,区别只是这次付给了一个从没问过你叫什么名字的主机商,而不是问过的那个。自托管,本质上是拿别人的可靠性去换你自己的控制权,而这笔交易只有在你真的认真对待"可靠性"这一半的时候,才划算。
你自己成了存储提供商
这就是老老实实的代价,最好在搬家之前就想清楚,而不是搬完之后才明白。没有人替你盯着在线率,没有人手里还留着你照片的另一份拷贝,当同步客户端提示某个你今早正要用的文件发生冲突时,客服热线的另一头也不会有人接。
- 备份是你自己的事,而且不是可选项。RAID 阵列能扛过一块盘的物理损坏;它扛不过一次文件夹删除、一次糟糕的升级,或者一次通过同步目录传播开来的勒索软件。版本控制和回收站是便利功能,不是备份。
- 在线率是你自己的事。同步客户端连不上服务器时会安静地把改动排队,等恢复了再补上,这一点很宽容——但你发给客户的那个分享链接,在机器宕机期间就是死的。
- 更新是你自己的事,而且 Nextcloud 更新得很勤。这是一个挂在公网 IP 上、装着你几乎整个人生的 PHP 应用,打补丁这件事经不起"等哪个月有空再说"。
- 容量是你自己要盯着的。一部会自动上传每一张照片的手机,会在一个你没规划过的时间点,把一块你以为留了不少余量的磁盘塞满——而磁盘一旦占满,出的问题远不止"停止工作"这么简单。
- 恢复是你自己的事。恢复意味着数据库和文件目录要在同一个时间点上一起恢复。只恢复其中一个,得到的会是一个能正常打开、却列着一堆根本不存在的文件的界面。
一旦搭好,这些都算不上沉重的负担。往后每个月也就几分钟的事,外加一开始那个用心投入的下午,需要的纪律和任何自托管服务并无二致——区别只在于,这一次放的是你最不能接受丢失的那些东西。如果你已经自己折腾过托管一个网站,这里的一切都不会陌生。
机器怎么选:为数据做预算,而不是为应用
Nextcloud 本身是个很轻量的 PHP 应用。这里几乎每一个选型上的失误,都是因为按应用本身的标准来预算,却忘了整件事的重点是要装下一堆会不断变大的数据。一开始就把规格定对,因为日后把一整棵文件目录连同它的数据库搬到另一台机器上,是自托管里最不愉快的一个下午。
- 存储空间是决定你选哪个套餐的关键,你大致需要现有文件体积的两倍。版本控制会保留改动文件的旧副本,回收站会在一段保留期内存着已删除的文件,而生成的缩略图和预览图,在一个照片库之上也是实实在在的一个百分比。
- 内存决定的是体验好不好,而不是能不能跑起来。2 GB 能跑一个单用户实例;4 GB 对一个开着手机自动上传的家庭来说很宽裕;到了 8 GB 以上,才轮到办公套件和几个并发用户同时在线这种场景真正需要用上。
- CPU 几乎全程都是闲着的,只在少数时刻才会突然变得很重要——第一次为导入的照片库批量生成预览图,以及任何即时的文档格式转换,都是值得预留余量的峰值时刻。
- 数据库需要快速存储,文件本身则没那么讲究。元数据操作会持续不断地打在数据库上,而文件目录大多是顺序读写——这就是为什么一块小容量的 NVMe 系统盘搭配大容量存储,是比一整块巨大慢速卷更合理的组合。
- 流量在这里是不限的,但首次上传一个既有的资料库,是实打实的一次性大流量。把它规划成跑一整夜的任务,而不是等它突然让你措手不及。
实际选型上,这大多会落在两档,具体看你到底要存多少。几百 GB 以内——文档、一个规模适中的照片库、一两个人用——VPS-8,$13.99/mo,配 4 vCPU EPYC、8 GB DDR5 ECC、120 GB Gen4 NVMe,够快也绰绰有余。一旦手机相册也算进来,容量就会变成唯一的问题,这时候为 NVMe 付费就不划算了:存储服务器从 $7.99/mo 起给你 1 TB 的 RAID-6 空间,STO-4 以 $22.99/mo 给到 4 TB——这是任何 VPS 都给不了的那种量级的余量,每 TB 的价格却只是零头。如果你要把一整个家庭、或者一个小团队的需求都并到一起,再往上就是独立服务器,从 $64/mo 起、配 2 × 1 TB NVMe,速度和空间都给够,账也不会算得很离谱。
分步指南:从一台全新服务器到同步正常工作
- 01先部署服务器,并先把它加固好一台 Debian 或 Ubuntu 机器,只用密钥登录的 SSH,默认拒绝的防火墙——都要赶在上面放第一个文件之前做好。趁这台机器还空空如也、平平无奇的时候,把这件事做掉。
- 02把域名指向它,并让证书顺利签发Nextcloud 客户端会拒绝通过明文 HTTP 同步,这么做是对的。主机名必须先能解析到这台机器,证书才能签发下来——这是目前为止最常见的安装失败原因。
- 03选好安装方式,然后就不要再换容器镜像是最快的路径,也最容易保持更新;手动装在 Web 服务器和数据库上,则能让你对调优拥有更多控制权。选一种——两种混着用,正是升级出问题的常见原因。
- 04用一个真正的数据库,而不是 SQLiteSQLite 只适合一个几乎不怎么用它的用户,两个客户端一旦同时同步,它立刻就撑不住。安装时就选 MariaDB 或 PostgreSQL,因为事后再转换,是一次很不愉快的迁移。
- 05加上内存缓存,并配置好后台任务用 Redis 做锁和缓存,后台任务用系统级的 cron,而不是靠浏览器触发的默认方式。跳过这一步,正是有些自托管实例跑得飞快、有些却卡得要命的原因。
- 06在迁移任何东西之前,先调高上传限制默认值是按小文件设的,一个视频或者一个磁盘镜像都会被拒绝。先在 Web 服务器和 PHP 配置里把限制调好,不然你第一次大文件上传,会卡在百分之九十的地方失败。
- 07一次性、有计划地迁移文件通过桌面客户端上传现有资料库,或者直接把文件复制到位再触发一次扫描。趁着还没人依赖这个实例,一次性地、放在夜里跑完。
- 08接入客户端,当天就把备份配好桌面同步、手机自动上传、日历和联系人。然后配置备份,并真的去测试一遍——一个已经在用、却没有恢复路径的实例,就是一个正在倒计时的定时炸弹。
加密:什么真正保护了你,什么只是听起来在保护你
如果你离开消费级云服务,就是因为受不了一家公司能读到你的文件,这一节就是最关键的部分——也是大多数教程讲得最错的一部分。Nextcloud 有一个叫服务端加密的功能。打开它,感觉像是找到了答案。但大多数情况下并不是,搞懂原因,能让你躲开一种比完全不加密还糟糕的虚假安全感。
- 服务端加密把密钥留在服务器上。应用必须能解密你的文件才能把它们呈现给你,这意味着任何能访问这台运行中机器的人,都能拿到这台机器拥有的一切。它防的是磁盘被偷、或者一个不可信的外部存储后端——防不住服务器本身被攻破,也防不住运营者本人。
- 端到端加密才是真家伙,而且它是刻意做了限制的。它在客户端上对特定文件夹加密,这意味着服务器确实读不到里面的内容——同样也意味着这部分内容没有网页界面、没有预览图、没有服务端搜索,也没有公开分享链接。
- 服务器上的全盘加密,保护的是一台断电的机器。一台正在运行的服务器,卷是挂载着的,密钥也在内存里,所以它防的是处置报废的硬盘、或者一台冷机被物理查扣,除此之外什么都防不住。
- 上传之前先加密,才是大多数人真正想要的东西。用一个工具在本地给文件夹加密、只同步密文,能让你在底层是一个普普通通的 Nextcloud 的情况下,获得真正的机密性,代价是那个文件夹没了预览图,也没法在浏览器里直接访问。
- 传输加密不是存储加密。HTTPS 保护的是传输途中的文件,静止存放时完全没有保护,把这两者混为一谈,是这整个领域里最常见的误解。
对大多数人来说,老实的答案是两者混用。让实例正常运行——这是你自己的服务器,预览图、搜索和分享链接带来的便利,正是你没有干脆去用一个加密压缩包的全部理由。然后把真正敏感的那一小部分文件挑出来——证件、密钥,以及那些在糟糕的一年里会真正要命的东西——在它们碰到磁盘之前,先在客户端把它们加密掉。这样你得到的是一朵能用的云,加一个真正的保险柜,而不是一个假装两者都是、实际上哪个都做得平平的折中方案。
默认安装会留下的那些身份线索
Nextcloud 去掉了那家能读你文件的公司。但它自己并不会去掉所有把这台服务器和某个具体的人绑在一起的东西——而这些线索,大多来自那些感觉上和存储毫不相关的步骤。
- 域名。就算公开的 WHOIS 已经打码,注册商手里依然握着你的身份信息,而且它需要一个能收到信的地址来维系这个域名不过期。主机名,是一套自托管服务被追查到所有者身上最常见的一条路径。
- 证书透明度(Certificate Transparency)。证书一旦签发,确切的主机名就会被发布进任何人都能查询的公开日志里。一个你以为很私密的子域名——比如 cloud.something、files.something——就这样带着时间戳被公告给了全世界。
- 主机商。如果这台服务器是用你本人名下的信用卡租的,那不管上面跑着什么,这台机器都是你本人名下的。这一点在注册的那一刻就已经定了,远早于第一个文件上传之前。
- 手机推送通知。官方 App 默认会通过平台厂商的推送服务转发通知,这意味着即便你的文件不会被 Google 或 Apple 看到,关于你这个实例的元数据也还是会传到它们那里。
- 照片元数据。图片带有 EXIF 数据,其中包括 GPS 坐标和设备标识符。把相册搬到自己的服务器上,并不会剥掉其中任何一项——它只是把这些信息搬到了一个你能掌控的地方,这确实更好,但和真正去掉它们不是一回事。
- 外部集成。联邦分享、远程存储后端、邮件通知,还有应用商店的更新检查,都会从这台机器主动向外连接,每一个都是一个能看到你服务器的第三方。
- 服务器日志。你自己的日志会记录每一次同步的 IP 地址和 User-Agent。放在自己的机器上没什么问题——直到这台机器被查扣的那一刻,你的日志就变成了关于你自己行踪的证据。
把这些补上,都是些寻常的功课,算不上什么特别的技巧。挑一家接受加密货币、只收集最低限度信息的注册商。把机器放在一家无需 KYC 的主机商那里,并用加密货币余额付款——比特币是化名制,不是匿名的,所以如果链上追踪对你来说是个问题,用门罗币充值才能真正切断这条链上痕迹。如果推送带来的元数据让你不放心,就关掉它,并接受随之而来的同步延迟。而如果这个实例只给你自己和少数几个信得过的人用,那就干脆别把它暴露在整个互联网上:把它放到一条 WireGuard 隧道后面,让它只在隧道里应答——这样也顺带去掉了针对公开登录页面的整整一类攻击。
迁移之后:怎么让它继续活下去
一台已经稳定运行了一年的文件服务器,也是一台整整一年都没人去看过的文件服务器。一套简短的维护流程,决定的是能不能守住这一点,还是把你当初想保护的东西弄丢。
- 把数据库和文件目录放在同一个时间点上一起备份。一份没有对应数据库的文件备份,恢复出来会是一个看起来空空如也、实则堆满孤儿文件的实例。
- 留一份不在服务器本机上的副本。一份和本体放在同一台机器上的快照,只能扛过磁盘故障,除此之外什么都扛不过——扛不过服务器被攻破,扛不过一次会同步到所有地方的误删,也扛不过账户丢失。
- 在什么问题都没有的时候,主动、刻意地完整恢复一次。一份没测试过的照片库备份,只是一个关于你那些回忆的假设。
- 按项目自己的节奏更新,绝不要跳过任何一个大版本。Nextcloud 的升级是一个大版本一个大版本走的,一次跳两个大版本,就是一次你得自己动手拆解的迁移。
- 留意剩余空间,并保留真正的余量。升级需要空间才能进行,一块在数据库迁移过程中被占满的磁盘,正是一次寻常更新变成一次被迫恢复的原因。
- 确认后台任务真的在运行。预览图生成、回收站清理和版本修剪都靠它,一个悄无声息坏掉的 cron,会在几个月后变成一块莫名其妙占满的磁盘才被发现。
顺手也加一个外部监控——一个从外部去请求登录页面、一旦它不再应答就报警的监控,能让你在排队等待的同步客户端察觉之前,先一步知道实例已经宕机。至于机器本身,就按新 VPS 的头十分钟里说的那样去对待它,因为一台装着你所有文件的机器,风险并不比一台装着钱的机器更低。
会让你赔上文件的那些错误
- 因为是默认选项就装在 SQLite 上,然后眼睁睁看着它在两台设备第一次同时同步时就锁死。
- 把回收站和文件版本当成备份,直到某天一个同步客户端把一次删除操作传播到了所有地方,才发现它们根本不是。
- 在配置备份之前就先把整个照片库迁移了过去,结果有一整个月的时间里,唯一的一份拷贝,都放在一台租来的机器上。
- 打开了服务端加密,就认定文件现在对主机商是保密的,还真的照着这个想法行事。
- 按文件今天的体积去选磁盘容量,完全没给版本、回收站和预览图留出余量。
- 跳过内存缓存和后台任务的配置,然后把一个跑起来很卡的实例,怪到硬件头上。
- 把上传限制留在默认值上,结果在迁移到一半时才发现,稍微大一点的文件都会悄无声息地失败。
- 因为实例晾了一整年没人管,一次升级里直接跳过了两个大版本。
- 前面所有事都做对了,最后却用自己的真实姓名租用服务器、注册域名。
Nextcloud 是少数几个能在日常真正要紧的地方,实打实追平它所替代的那个商业产品的自托管项目——同步就是能用,手机 App 就是能用,一周之后你就不会再注意到区别。安装花一个下午,迁移花一个晚上。剩下的,是你拥有的每一个文件,都在一台只听命于你的机器上,用加密货币余额付的钱,主机商也从没问过你叫什么名字。把磁盘按数据将来会变成的样子去选,而不是按它现在的样子;把真正需要加密的那一小部分,在客户端加密掉;把备份在你需要它之前配好,而不是之后。