前言
博主之前一直用MinIO搭建S3存储,并用作本博客的图床。
兼容S3标准的对象存储用起来很方便,许多软件都可以调用S3 API方便地进行文件的上传下载和管理。因此,很多大厂也会将支持S3作为对象存储的标配。但大厂的对象存储往往定价昂高,而且又有着许多配额限制,容易超标,所以,自建S3对个人项目而言是一个不错的选择。
关于搭建S3,MinIO十分方便,还拥有一个带UI的控制台。但,最近MinIO变动比较大,在许可证上进行了调整,并且目前官方GitHub已经宣布停止更新,进入维护状态(Maintenance Mode)。况且,在博主的小配置机器上,MinIO吃资源情况也比较严重。
于是,博主开始寻找替代品。逛完reddit等社区,发现Garage是一个比较不错的替代 —— 轻量、稳定、社区驱动。
迁移纵览
使用MinIO时,博主通过Nginx反向代理了9000和9001,分别用于S3和管理面板。
- 9000: MinIO S3服务(即图床外链&S3 API)
- 9001: MinIO WebUI(管理后台)
而,Garage不太一样,它不支持桶策略(Bucket Policy),比如公开桶(Public Bucket),它有4个端口。
- 3900: 用于S3 API(仅允许有权限的人进行文件管理)
- 3902: 用于Web服务(真正给外部用户访问的图床外链)
- 3901: 用于内部集群沟通的rpc端口(单机用户可忽略)
- 3903: 用于管理Garage的admin api接口(后续用于对接第三方WebUI面板)
除此之外,Garage是块存储机制,而MinIO则维持文件原本的模样。
本篇文章还会用到garage-webui,这是一个第三方WebUI管理面板,可以平替MinIO的管理面板。毕竟,UI还是要比敲命令更直观的hhh。
- 3909: garage-webui面板(与3903、3900进行通讯)
在MinIO中,oss.keke.su指向了9000,并创建了名为image的public bucket,因此,访客可以通过http://oss.keke.su/image/...访问到图床的图片。
在Garage中,*.oss.keke.su将绑定3902,当一个名为xxx的bucket开启了Website Access,访客通过http://xxx.oss.keke.su/...或http://xxx/...访问到其资源。
为了无缝迁移,我们将创建名为oss.keke.su的bucket,开启website access,并在该bucket创建image文件夹,因此,访客依旧可以通过http://oss.keke.su/image/...访问到图片。
最后,我们将MinIO中imagebucket的内容clone到Garage的oss.keke.subucket的image目录下,即可完成迁移。
搭建Garage
Garage使用garage.toml作为配置文件,因此我们需要先创建garage.toml:
由于我们是单机部署,所以replication_factor设为1。为了更好地保证数据安全,我们还开启了metadata_auto_snapshot_interval。
然后是docker-compose.yaml。
因为我们是单机部署,这里为了安全,阻止了3901、3903端口的暴露。
然后,执行docker-compose up -d,服务就run起来了,搭建完成。
初始化节点
使用你设定的面板密码登录http://服务器ip:3909,我们成功进入了第三方WebUI面板。
第一步是需要初始化节点,进入Cluster。因为是单机模式,我们只有一个Nodes,直接选中点击Assign,随便取一个Zone名称,并在Capacity设定bucket容量,最后点击Apply即可完成初始化。
创建Key
进入Keys,点Create Key新建一个Key,名字随便写。
创建Bucket
进入Buckets,点Create Bucket新建一个Bucket,名字根据你们自己需要来,博主这里名称为oss.keke.su。
然后,在这个Bucket进入Manage->Permissions->Allow Key,为刚刚创建的Key分配所有权限(Read、Write、Owner)。
最后,在Overview打开Website Access。可以看到,一切如我们所愿:我们可以通过http://bucket名(oss.keke.su),或者通过http://<bucket名>.root_domain(oss.keke.su.oss.keke.su)公开访问到这个bucket,这就是我们图床的外链链接。
迁移数据
正如前文“迁移纵览”所述,为了实现无缝迁移,我们还需要借助Rclone工具,同时连接MinIO的imagebucket和Garage的oss.keke.subucket进行sync。数据流如下所示:
MinIO: <image bucket>/* --> Garage: <oss.keke.su bucket>/image/*
安装Rclone
以Mac为例,可以很方便地使用brew install rclone安装:
创建配置
我们需要创建rclone配置,来连接MinIO和Garage这两台S3。
执行nano /tmp/rclone.conf,写入:
注意根据情况自行修改use_ssl、endpoint以及access_key_id、secret_access_key。
开始同步
使用下面命令进行同步:
看到日志,已经成功同步完成:
收尾工作
至此,我们已经完成所有的迁移预操作。
最后一步,就是将域名解析、反向代理等根据自身情况指向Garage即可。
重定义Web服务
正如前文“迁移纵览”所述,博主原本使用Nginx反向代理至127.0.0.1:9000。
现在,参考官方文档,只需使用下面配置,指向127.0.0.1:3902即可。
重定义S3 API服务
除此之外,在使用到S3 API的应用中,比如图床一键上传插件,我们之前可以直接在oss.keke.su进行上传,因为MinIO支持公开桶的桶策略,S3 API和图床外链都可以复用9000端口。
然而,在Garage中,最佳实践是,再使用一个子域名单独反向代理至3900端口,仅作为S3 API使用。
可以参考如下的Nginx反向代理配置:
结语
至此,我们完成了所有的迁移步骤。
如你所见,本博客所有图片外链已迁移至Garage,目前资源均正常访问。
最后,希望Garage可以更好地接力MinIO吧~
