为了她,我自研了一款现代化的网盘
相比 NextCloud 之类的网盘,ZPan 是一款更加现代化的网盘系统,它的底层使用业界通用的 S3 协议进行开发,这使得用户可以使用任何云存储来驱动它。你可以使用七牛云搭建一个免费的私人网盘给家人朋友或者员工使用,你也可以使用阿里云 OSS 搭建一个统一的资源管理系统给公司内部用。
# 起源
某度网盘,充了会员还这么慢,咋办啊? XX,你!赶紧给我弄一下啊!!
女票的抱怨又来了,我真的是很无奈啊。女票的网盘需求比较多,但是 Pandownload 的前车之鉴在那里,走灰色路线虽然也能解决问题,但始终有风险不是。那么,最根本的解决方式是什么呢? 对,那就是不用某度网盘!
都 0202 年了,提供对象存储的厂商比比皆是,甚至有的还有免费额度给你用。那么为什么不基于对象存储自己搭建一个网盘呢?
# 目标
那么,接下来就是想办法搭建一个基于对象存储的网盘。经过搜索,我发现大家搭建网盘一般用到的软件有 OwnCloud、NextCloud、Cloudreve、Seafile、Z-File 等。但是,经过了解我发现大多数网盘都是基于本地文件系统进行的存储,只有 Cloudreve 支持配置对象存储策略。
很显然,NextCloud 之类的传统网盘与我们的目标不符。那么选择就只剩下了 Cloudreve,经过试用,我发现 Cloudreve 总有一些我不满意的地方。虽然 Cloudreve 是一款开源产品,但一方面它是基于 PHP 实现的,再加上它的某些设计理念与我的设想实在不相符,所以最终决定还是自己用 Go 语言写一个。
# 设计
一般来说不管是上传还是下载都是需要经过服务器的,那么我们的上传下载速度就会受服务器带宽限制。比如一台 1M 的服务器它可以达到的速度就只有 128KB/s。那如果我们自建网盘,想要跑满自己家里的带宽(比如 200M),那你就需要一台同样 200M 带宽的服务器。而阿里云上一台 200M 的服务器带宽费用是 ¥660.48/天。
这显然是不可能的,自建网盘的成本这么高就啥都别玩了。别担心,我们另辟蹊径!那就是使用对象存储。那么什么是对象存储呢?
::: tip 对象存储 对象存储,也称为基于对象的存储,是一种数据存储,其中每个数据单元存储为称为对象的离散单元。对象可以是离散单元,类似于 pdf,音频,图像或视频文件。这些对象实际上可以是任何类型的数据和任何大小的数据。对象存储中的所有对象都存储在单个平面地址空间中,而没有文件夹层次结构。 :::
看完了是不是觉得还是不懂? 没关系,其实不用理解对象存储的底层实现,我们只需要知道各大云平台都提供了一种叫做对象存储的服务就可以了。在国内有阿里云的 OSS 和七牛的 Kodo,在国外有亚马逊的 S3 和谷歌的 Storage 等等。
对象存储天然的支持不限速的上传和下载,它是按存储量和下载流量计费的。而像七牛云会给予 10G 的免费存储空间。
# 基于 S3 协议
虽然我们可以单独的对接每一个云平台,但那样开发成本未免太高了。经过了解我们发现有一个叫做 S3 协议的东西,因为亚马逊是最早做对象存储的,所以它设计的 S3 协议各大云平台都有兼容(感谢 V 友提醒)。
那么,这样一来就很简单了,基于 S3 协议进行开发,可以轻松的对接所有对象存储云平台。另外开源社区也有基于 S3 实现的对象存储,像 MinIO。基于这种开源的产品,如果你不想用云平台,想要完全自建,那么也是可以轻松实现的。
# 直链传输
虽然对象存储不限速,但是网盘的运行服务器还是有带宽限制的啊。别担心,对象存储提供了一种直链传输的方式,也就是预签名链接。我们完全没有必要让流量到网盘服务器兜一圈,只需要将经过签名的 URL 告诉浏览器,浏览器即可直接将文件 PUT 到对象存储上去。 即可。本文后续所有修改都会第一时间在原始地址更新。