前言
在我们平时想要给朋友分享一个文件的时候,一般不外乎以下2方式:
1、通过网盘
通过上传到网盘(百度网盘,阿里云盘之类),分享为链接,需要接收者另存到自己的网盘或者直接下载下来播放,发送者和接受者都可能要受到是否是付费会员等因素的影响。
2、直接微信或qq发送
通过微信直接发送文件有大小限制,小文件还无所谓,大文件就不可能通过微信直接发送了。其实qq发文件倒是有一些优势,不过一来离线发送也有限制(2G还是4G,记不清了,好像还和是否会员有关),在线发到是没有限制,但是需要双方都在,且那个速度难说。
算来算去,想正常分享个文件居然没有一个完美的方法。
这个时候,对象存储(COS)方案就成了最佳的选择。可以将各类型的文件生成一个http(s)链接的方式进行分享,可以直接下载或者在线打开,算是日常生活中的小帮手。其实各个云服务器商都提供COS的业务,而且从腾讯云来看价格也不算贵,个人还有50GB(6个月)的免费额度,但是本着建立家庭数据中心,能自建的业务绝对不花钱的原则,还是自己搭一个免费的COS吧。目前最好用的开源免费对象存储是minio,我们使用最简单的docker的部署方式。
部署minio COS
minio的docker仓库下其实包含了好几个组件,但是一般而言我们最小化部署只需要一个server端。只部署server端有个问题是分享链接最长只能7天有效,如果这个时间对大家已经足够就不需要折腾了,就一个server端就够了。但是如果是想设置成永久有效(比如用在网页上),那就需要再安装一个client端来对server端的桶进行策略配置。
安装minio server端
因为下面要用到一个名为public-net的bridge,所以需要提前创建:
docker network create public-net
部署minio server端:
命令如下:
docker run --name minioserver -d --restart=always --network=public-net -v /docker/minio/data:/data -p 9000:9000 -p 9001:9001 -e "MINIO_ROOT_USER=root" -e "MINIO_ROOT_PASSWORD=123" \ minio/minio server /data --console-address ":9001"
参数解释如下:
-v /docker/minio/data:/data
将宿主机的/docker/minio/data目录映射到容器内部的/data目录
-p 9000:9000 -p 9001:9001
将宿主机的9000和9001端口分别映射到容器的9000和9001端口
-e "MINIO_ROOT_USER=root" -e "MINIO_ROOT_PASSWORD=123"
指定minio server的登录用户名和密码,如果不指定,默认的登录用户名和密码都是minioadmin
server /data
启动server端并以/data目录为数据目录
--console-address ":9001"
指定9001端口为控制台端口
容器启动以后,就可以直接用http://宿主机ip:9001登录控制台。
COS中的管理单元是桶(buckets),默认是没有桶的,需要先创建一个桶:
这里我已经创建了一个名为video的桶,如上图。点进这个video的桶,然后点击右上角红框的Browse Buckets按钮:
这个时候可以进入桶中,这里可以通过右上角红框中的Upload直接上传文件,也可以用右下红框中的Create new path按钮先建立分类文件夹以后再上传文件,例如下图中我建立了mtv文件夹:
在mtv文件夹中我上传了2个mtv:
讲道理来说,现在已经可以开始分享了,有2种方式:
1、在web界面里选中文件然后直接生成分享链接:
种方式优点是可以指定分享链接的生效时间(最长7天,最短1分钟),缺点是链接太长,并且这个链接也不能直接用,如果要内网使用,需要将127.0.0.1修改成宿主机的内网IP地址;如果要外网使用,需要改成反向代理的域名或者云主机公网IP(如果不是标准的端口,例如80和443,还需要加上具体端口)。
2、直接手动拼接地址:
内网使用:http://宿主机内网IP:9000/mtv/斑马斑马.mp4
外网使用:https://反向代理公网IP或域名:端口/mtv/斑马斑马.mp4
,其中端口是在使用非标准端口才加,比如我的家庭宽带,如果是80或者443端口则不用加。
这种方式明显高效得多,是推荐方式,不过缺点是不能定制时间,只能是默认的7天过期。
不管是第1种还是第2种方式,如果要通过反向代理进行发布,都需要先设置好反向代理,反向代理的设置教程网上很多,我就不重复了,不过这里有一个关键点,也是很坑人的一点:看前面web界面的分享链接:
其实光看这个可能还想不到,但是后来设置了反向代理之后,一直不能成功,报以下错误:
开始没往host地址和端口上面去想,后来折腾了好久,忽然想到,不会这么无聊限制host和端口吧,然后在反向代理上(以宝塔Linux面板为例)设置了传递域名和端口:
然后就通了。。minio server的docker居然限制了host地址和端口是127.0.0.1:9000,这个真是坑死我了,这谁能想到。。?
总之,其实到这里为止一般人已经足够用了,7天的限制正常使用情况下也没问题,但是不正常环境下呢?比如要用在网页或者博客上的时候。。
如果要破除7天的限制,就要借助minio client了。
安装minio client:
命令如下:
docker run -it --name minioclient -d --restart=always --network=public-net --entrypoint=/bin/sh minio/mc
docker起来以后,直接进入minioclient容器内部命令行(或者用docker exec执行也可以,看大家的习惯了):
在minio client里绑定已经建立好的minio server,命令格式如下:
mc alias set <alias> <your-minio-endpoint> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
其中,alias是minio server的别名;your-minio-endpoint是minio server的访问链接,以我环境为例,docker宿主机的IP地址是192.168.10.130,端口9000,则访问链接就是http://192.168.10.130:9000
;YOUR-ACCESS-KEY和YOUR-SECRET-KEY需要在minio server上生成,如下图位置:
实际命令以我的环境为例如下:
mc config host add minio http://192.168.10.130:9000 YOUR-ACCESS-KEY YOUR-SECRET-KEY --api S3v4
正常会显示:
使用mc ls命令查看查看刚刚创建的存储上面的内容:
mc ls minio
正常会看到我们前面创建的桶:
使用mc alias ls命令查看刚刚新建的alias minio
mc alias ls minio
使用mc anonymous命令可以看到有4种策略,如下图红框:
其中,upload对应write-only,download对应read-only,我们需要将桶video设置为download:
mc anonymous set download minio/video
大功告成。