基于[对象存储]的低成本全功能私有云搭建
好久不见啦,上一次更新博文还是 18 年底,算起来竟然有足足一年半都没有写东西了。
写博文就是一个习惯,而环境一发生改变,往往就会让人改变一些习惯,同时也会产生一些新的习惯或者是爱好。对我来说,说着也奇怪,自从研究生以来就突然没有写博客的冲动了,当然,这并不是一件坏事,不过是改变了的习惯而已。这一年来我写写论文,做做工程,闲时用 Python 还做了好几个颇为得意的小开发,Github 和豆瓣都有在活跃,只是期间的一些心得体会(屁,其实就是展示成果)没有发布在我的中原驿站~
之前见到的一些特别优秀的博客却没了更新,现在都能理解了,不过如此~
碎碎念结束!而今天,一种巨想写博客的冲动又涌向心头,因为我 以云存储的成本价搭建了一个全功能的私有云:
- 上传下载不限速,数据中心多地任选
- 能实现文件分享功能,同样不限速
- 能自动创建文件历史备份,方便回溯办公文件
- 支持各平台用客户端管理文件,电脑端甚至还可直接将网盘挂载为一个虚拟磁盘
- 价格按用量计费(存储量、下行流量),我一个月大约花费 6 元,属于是云存储的成本价
相比百度网盘等公有云,本方案在实现同等功能的前提下,每月开销更低,并且数据可靠性更高(不会被百度替换成你懂的,同时数据中心用的也是冗余存储,不会丢数据)
当人们步入互联网时代以来,便早已不在是 1 人 1PC 了,每个人都有不止一台智能设备(工作电脑、笔记本、手机、平板等等)。可贵的并不是这些设备,而是我们的数据,毕竟在云时代,我们依赖的都是云服务,智能设备只是云服务的展示终端而已。
而这时,各个终端上数据的共享就是一个难题。大概谁都有在自己的电脑和手机之间互传文件的经历,或是将工作台式机中的办公文件复制到笔记本上继续办公(之后可能又需要拷回去)。而如果我们的数据在云端统一存放,那上述的一切问题都将很自然地解决。
你可以在手机上一键将 10 分钟前电脑上编辑完的文档发送给老板,再打开平板,惬意地回顾一下 2 年前的今天用手机拍摄的照片。每个人都有不少的私有数据需要整齐地存储,并且随时方便地查阅,这便是云存储带给我们的好处。
如果网盘提供额外的功能,那再好不过,那便是额外的福利:
如果网盘支持挂载到电脑磁盘,那网盘就像是电脑的一个本地磁盘一般,可以直接双击打开某个文件,修改后保存,或者拖拽复制新文件进去。非常方便。
除了本方案外,据我所知坚果云和 OneDrive 支持这种玩法。
同步盘和挂载盘不同,同步盘支持选择本地一个文件夹,与网盘中的一个文件夹保持双向同步的关系。这要求电脑本地有一份云文件的备份,但有的场景下这比挂载盘更好用。
大部分网盘都有此功能,百度云同步盘功能需要开通会员(使用 bypy 工具可以免会员实现)
文件历史版本功能可以在你的文件修改或删除后,自动创建历史备份,在需要的时候查看,并恢复至任意历史版本。办公神器。
离线下载功能可以让帮你挂机下载文件至网盘。一般情况下,要么秒传下载成功,要么便无法离线下载。
视频在线播放功能可以直接在线播放网盘中的视频文件,配合离线下载还是很方便实用的。
这些功能各大网盘基本都是需要付费才能用的。
云存储解决方案
安利完了云存储的好处,再来说说云存储的实现方法。首先百度云这种公有云就算是免费版,其实对大多数人是够用的,对于我来说,至少需要付费的百度云才能满足需求,但一方面除了不想花那笔钱外,用着也不够满意。
简单罗列一下现有网盘的优缺点:
优点 | 缺点 | |
百度云等国内网盘 | 容量大 | 害怕丢数据;免费用户限速且功能缺失 |
OneDrive 等国外网盘 | 数据安全相对更可靠,功能齐全 | 容量小,扩容费用很贵;不限速但速度一般 |
自建 NAS | 可满足一切要求 | 电费设备费花钱也不少;需要公共 IP,否则外网体验很差 |
上表仅仅是简单罗列优缺点,想表达的意思是,云存储想要在 功能、稳定性、成本 上三者平衡,是一个不可能三角。本文基于对象存储的方案,则是在满足功能和稳定性上,最大地压缩了成本。
对象存储能干啥
所以,啥是对象存储?现在最著名最早的对象存储服务 Amazon S3 已经承载了很多很多全球知名的服务,S3 主要用户是应用程序开发商而非终端用户。网上大多数关于对象存储的用法都是给站长用作静态资源分发,而没有人把它当作云盘使用。
S3 的功能:S3 就是一个无限大的存储桶,通过 API 让用户上传和下载文件。下载文件时也可以无需 API,通过 CDN 以 https 的方式在各类终端中进行读取文件。同时,存储桶内的数据可以进行一些自动化处理,比如图片视频转码,以及我们需要的 自动版本控制 功能。
由于提供了 API 用于上传下载,便有开发者开发出了 S3FS,能将 Amazon S3 作为虚拟磁盘挂载在电脑中。最难能可贵的是,由于 S3 已成为事实标准,各家的对象存储基本都兼容 S3 API,也能使用这一套工具。
价格怎样
价格方面,以七牛对象存储为例(应该是国内最便宜的一家),每月 60GB 存储空间的预估费用为¥4.73, 相比花费¥15 充值百度云会员,仅花这 5 块钱我的使用体验甚至还更好。
各家都提供了三种对象的存储级别:标准存储、低频存储、归档存储。数据的安全性都一样高,但存储空间费用依次递减,数据访问费用依次递增。其中低频存储的建议使用场景即为网盘。
推荐腾讯云 COS
提供对象存储的服务商很多,并且都兼容 S3 API,但我强烈推荐大家使用腾讯云 COS: https://cloud.tencent.com/product/cos
当时我选择时,为了网速快,主要考虑中国境内的提供商,七牛云基本是最便宜的提供商。但如果需要支持 文件版本控制 功能,则仅剩下四家:AWS 国内版、阿里云、华为云、腾讯云。我选择了相对最便宜的腾讯云,后来证明这是个正确的选择。
因为腾讯云除了提供 API 外,还为各平台都提供了对应的客户端(Win、iOS、安卓、Mac),完成度相当可以,非常方便,开箱即用!
购买时可以选择最近的数据中心,我家与腾讯云重庆数据中心直线仅 145.8km,所以选择了他们的重庆机房。图中也可以看到,上传速度为每秒 π MB,下载速度为每秒 10.24MB,还是挺满意的。(这俩数字也是绝了)
基于对象存储的私有云搭建
其实介绍完对象存储是什么之后,如何把他当作私有云来使用,那便是很自然的事情了:使用 API 或者 App,或者网页上传文件,再在合适的时候使用同样的方式下载你需要的文件。
唯一还需要介绍一下的是对存储桶的一些额外配置,以及挂载为本地磁盘的方法。
存储桶配置
腾讯云对象存储默认未开启 文件版本控制 功能,需要我们手动开通。
除此之外,我还按照下图设置了一个简单的文件规则:
挂载为本地磁盘
在 Linux/Mac 上挂载网盘可以使用腾讯云 COSFS 工具,其他家也都会有提供类似的官方工具,或者使用来自 Amazon S3 的 S3FS。
而如果在 Windows 上挂载硬盘,可以使用针对 S3 开发的 Rclone,完美兼容腾讯云 COS,同时该工具还可以将 SFTP、OneDrive、WebDAV 等等各种网盘挂载为本地盘,很厉害。使用该工具前还需要安装 WinFsp。
我的挂载命令为:rclone.exe mount cos:f-1251515384/ O: --vfs-cache-mode full --attr-timeout 1m
,即可将网盘挂载为本地的 O 盘:
然后有一个很关键的设置如图,如果不这么设置,在图片多的文件夹内 Windows 会自动加载缩略图,在音乐多的文件夹内,会自动读取音乐的 meta 标签,瞬间耗费很多网盘流量,还会造成电脑卡顿。
关于进程保活
Rclone 在前台终端运行之后,我们需要保活,以及在重启之后自动运行。
NSSM 可以便捷地创建一个 Windows 服务,保证该进程在后台运行。不过我用的是 PM2,PM2 在 Windows 上运行会有一些坑,这里就不展开叙述了。
总结
介绍了云存储对普通人的意义,然后提出了使用对象存储这个廉价、简单,且扩展性优秀的私人云方案。可能对于极客而言,这将是自己搭建 NAS 之外的另一条可选的道路。
2 个月后的补充
我的存储量为 22GB,正常使用 2 个月后总开销 7.52 元,确实便宜。速度和稳定性也很满意。
但是,用于 Windows 上挂载网盘的工具 RClone 却是一个大坑:
- 文件名中不支持 ‘:’ 等几个特定的中文字符。
- 挂载盘中使用 Office 系列软件会发生异常,保存时必定会丢文件。用 Chrome 直接下载文件到挂载盘时,也丢失过文件。
问题 1 不算严重,重命名就可以了。而问题 2 令人难受,初步判断是 Office 本身的不兼容导致。但是我发现,使用 webdav 方式挂载的网盘并不存在此问题。
于是,我使用了 Python 包 mar10/wsgidav 将本地挂载好的 Rclone 挂载盘转换为 webdav 协议,监听在 localhost:8080。再使用 Windows 连接本地的 webdav 服务器(这里需要修改一下注册表,否则只支持 HTTPS),wsgidav 号称专门优化并支持了 Office 在线编辑,事实确实如此,Office 工作正常了。
多套了一层协议转换,可能不太优雅。 这里分享一下我最近发现的一个好项目:Cloudreve( 支持多家云存储的云盘系统 ),可以将对象存储作为存储源,提供 Web 访问界面和 WebDaV 接口。并且由 go 语言开发,运行在服务器上既是自己的私有云,运行在本地即充当 S3->webdav 的客户端(代替上面的 rclone+wsgidav 方案),甚至还可以运行在 Android 手机上。
评论区有人留言 rclone serve webdav
可以直接挂载为 webdav,然后再在文件管理器中直接添加该 webdav 服务地址即可,完美解决该问题。