使用 MinIO 搭建自己的 S3 服务

目标 & 背景

之前一直听说过 MinIO 的大名,一直懒得研究,正好今天有时间给环境装一下,我当前的博客使用 Halo 建站,在官方插件中有一个名为 增强备份 的工具,刚好也支持 S3 存储

在前段时间,Halo 的团队发布了 obsidian-halo 的插件,但是上传图片的功能,一直没有下文,所以正好可以将 MinIO 同时作为博客的图床来用,还能利用家里闲置的带宽~

MinIO 在本篇文章中,会搭建在我自己的群晖上,如果跟你的环境不同,还请自行解决

image

MinIO 搭建

第一次看 MinIO 的文档时,一头雾水,咋那么多变量,看的头疼,但是就我上面的这些需求,实际配置非常简单,这里我使用 docker-compose 进行配置

version: "3.3"
services:
  minio:
    ports:
      - 9000:9000
      - 9090:9090
    container_name: minio
    volumes:
      - /volume1/docker/minio:/data
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=xxxxx
    image: minio/minio
    command: server /data --console-address ":9090"
networks: {}

这里开放了两个端口,90009090,其中 9090 是管理后台,这个端口不需要暴露在外网下

在我的环境中,家里的内网使用 Surge Ponte 访问

进入后台,输入 docker compose 中设置的账号和密码,接着来到 Buckets 中,点击 CreateBucket,在 Bucket Name 输入名字即可

我这里创建了两个 Bucket,一个是 blog 作为图床用,另一个是 blog-backup 作为 Halo 的备份服务

image

接着来到创建好的 Buckets 中,修改 Access Policypublic

image

接着在 Access Keys 中 点击 Create access key 创建一个访问密钥

注意保存好创建的内容

image

最后在 ConfigurationRegion 菜单,将 cn 填入 Server Location 即可完成所有配置

image

Halo 配置

除了 增强备份 我们还需要 对象存储 这个插件,在后台自行安装即可,安装完成后,需要现在附件中创建存储策略

image

接着依次填入之前在 MinIO 中设置的内容

image
最后来到 备份插件 中的 定时任务 中,开启 启用远程同步,并将 附件存储策略 设置为上图的 blog-backup 就完成了备份同步到 NAS 的所有过程

image

Obsidian 配置

在 OB 的插件中,需要安装 s3-image-uploader,接着来到这个插件的设置页面,同样填入之前的基础信息

需要注意,这里我自己为了区分两种行为,Bucket 使用的是 blog

image

接着需要开启 Use custom endpointUse custom image URL,填入当前服务器的域名和端口,要注意这里两个值不一样,我们上传时使用的是 http 协议的 9000 端口,但是下载时使用的是 https 协议的 9001 端口,文章后面会介绍为什么

#  Custom S3 Endpoint 格式参考
http://你的域名:9000/
# Custom image URL 格式参考
https://blog.你的域名:9001/blog/

这个插件在我测试过程中,发现并不支持热修改,因此测试时,如果发生改动,记得重启 OB

image

反向代理

在我测试时,发现上传到 halo 的文章图片地址,虽然原始值都是 http://xxx 但是在实际请求时会默认修改为 https://xxx 这样会导致无法正确获取图片,因此需要对 9000 这个端口做一个反向代理

在群晖 控制面板 -> 登录门户 -> 高级 -> 反向代理服务器 中增加一个 https 的 9001 端口转发规则

# 来源主机名 格式参考
https://blog.你的域名
# 目的地主机名 格式参考
192.168.31.111

image

最后

终于可以愉快的用本地编辑器写 Halo 的博客了~ 之前一直使用 MWeb 导出到 VSCode 中,再上传到站点上,非常烦

把 S3 部署在家庭服务器中,同时也减少了建站的流量成本,舒服~