需求背景

在开发或者博客文章制作过程中,会涉及大量图片、文件等存储,当然,市面上有很多方案,我总结了以下对于我来说最为经济(穷比)的方案:

  • OSS对象存储(贵,按请求量+占用空间+API请求量+流量计费,如果被不法分子盯上,盗刷流量,那就要呱呱叫了)

  • 使用家宽的自建服务器安装MinIO做对象存储(48小时会重拨一次号,DDNS更新也会有5-10分钟空白期,导致外部无法访问)

  • 服务器买存储空间(价格十几G那是嗷嗷贵啊)

目标🎯

  • 不要钱

  • 稳定

  • 不要钱

  • 安全

  • 不要钱

为什么选择MinIO🧷

  • 基本Java、Go、Python都有相关的库支持(跨平台性)

  • 开源、免费

  • 服务端要求不高

  • 满足亚马逊S3标准

  • docker启动,配置了映射目录,直接复制去其他设备进行映射启动数据配置均在,良好的迁移性

解决方案⛳️

  • 利用家中的群晖与服务器组网,将服务代理到域名上,外部访问该域名即可。

  • 外网无法直接访问到MinIO服务,安全性拉满。

  • 由于没有走DNS解析,走的是TCP请求,所以不会出现DNS解析空白期问题。

  • 开源的MinIO可以实现OSS存储常见的所有功能,主要是免费。

  • 具体拓扑结构如下

步骤🧑‍💻

1、异地组网

参考我的这篇文章《搭建zerotier实现异地设备统一管理》

2、搭建MinIO

在内网某节点设备里使用docker安装MinIO,MinIO有两个端口,9000是API用的,9090是WebUI的,所以反代的域名最好只针对API端口,这样安全性比较不错。

docker run \
-p 19000:9000 \
-p 19090:9090 \
--net=host \
--name Minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=控制台登录账号" \
-e "MINIO_SECRET_KEY=控制台登录密码" \
-e "MINIO_SERVER_URL=反代的域名" \
-v /volume3/docker/Minio/data:/data \
-v /volume3/docker/Minio/config:/root/.minio \
 minio/minio server \
/data --console-address ":19090" -address ":19000"

搭建完成后访问UI输入设置的账号密码后做一些基础配置(禁止列出存储桶文件、公共读、私有写):

  • 创建AccessKey,并保存ACK和SK

  • 创建存储桶,编辑访问策略

  • 按照以下进行配置,这样别人访问存储桶就不会列出所有的文件了

  • 设置访客只读

这样MinIO搭建就大功告成了!使用测试工具测试上传,个人推荐PicGo,输入节点IP,填入相关信息

测试上传成功!!

3、服务器测试

组网后服务器对该页面进行测试请求,看看节点子网间网络是否能通信

4、服务器Nginx进行反向代理

以宝塔为例,正常添加反向代理

踩坑🦶

纯使用反向代理的时候就没法上传,通过nginx日志看,发现有个head请求经过反向代理后会被转为默认的GET请求

所以我们要解决掉经过反代后这个head请求转换的问题,在nginx配置文件Server内添加内容:禁用将“ HEAD”方法转换为“ GET”进行缓存。也就是设置proxy_cache_convert_head off;

PicGo测试

将域名切换为服务器域名

上传成功!!

总结📒

  • 切换域名后不会那么顺利,可能有很多因素影响,例如WAF啊,网络环境等等,注意排查。

  • 注意测试节点网络可以直接上传后再切换域名测试,不然出问题都不知道哪里出的。

  • 最难解决的问题就是那个请求方法转换的问题,折腾老半天了。

  • 考虑电费和存储,四舍五入等于不要钱,比买厂商的对象存储香太多了。