前面的文章讲了Fly.io 的入门使用和如何使用 Fly.io 部署 go 开发的应用程序。今天我们来继续讲解使用 Fly.io 部署 对象存储服务 MinIO.

MinIO 是什么我就不过多介绍了, 接下来我们就进入正题,进行 MinIO 服务的部署。

准备 Dockerfile 文件

我们先准备 MinIO docker 部署相关的文件, 我们使用官方的镜像进行部署, Dockerfile 文件内容如下:

FROM minio/minio

CMD [ "server", "/data", "--console-address", ":9001"]

MinIO 的数据文件将存储在 data 目录下,指定 9001 为 web 控制台的端口,如果不指定将会使用随机端口。

初始化 Fly.io 应用

接下来像以前一样使用 flyctl launch 命令进行应用的初始化。

我们照常不使用数据库,不立即部署,生成的配置如下:

# fly.toml file generated for twilight-lake-5450 on 2022-11-19T22:34:39+08:00

app = "twilight-lake-5450"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[env]

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 8080
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

如果我们要限制从公网连接 MinIO ,只允许和 MinIO 使用相同网络的应用访问,只要删除 [[services]] 下的内容即可。

数据存储

Fly.io 应用部署的vm 和 image 是临时的, 每当你删除或移动应用程序时,当前应用写入的数据就会丢失,为了保持数据,我们要创建存储卷来持久化数据。

我们使用 flyctl vol create miniodata 来创建持久化存储,需要注意的是存储卷要和 MinIO 应用要在同一个区域。

img.png

由于没有指定大小,默认使用 3GB 的大小。我们需要在应用配置中,将刚创建的存储卷挂载进应用中。


[mounts]
source = "miniodata"
destination = "/data"

机密信息

MinIO 使用 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 环境变量来存储管理员的登录信息,为了安全起见,我们不能使用普通的环境变量直接设置,而是使用 Fly secret 来设置账号密码,使用 flyctl 设置的敏感信息,只会在真正使用时解密。

flyctl secrets set MINIO_ROOT_USER=xxx MINIO_ROOT_PASSWORD=xxx

部署

接下来我们执行 flyctl deploy 进行应用的部署。

MinIO 管理界面

MinIO 提供了一个 dashboard ,它使用我们前面 Dockerfile 指定的端口,我们前面设置端口为 9001 ,由于 fly,io 限制了对标准端口的访问,我们需要连接到我们的私有 WireGuard 网络。

有2个方法可以进行连接: 1 设置一个常规的 WireGuard 隧道 2 将端口代理到我们的本地,就像 k8s 的kubectl proxy 一样

由于我对 WireGuard 不熟悉,这里我将使用第二种方法进行,我们使用 flyctl proxy 9001 命令将端口代理到我本地。我们浏览器访问 http://localhost:9001/ 即可看到我们熟悉的界面(访问有点慢)

Console 的用户名密码是我们前面设置的 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 的值。进入后我们可以创建存储桶、进行管理以及上传和下载文件。

小结

本文我介绍了怎么样在 fly.io 上部署 MinIO 服务的过程,在实际过程中,我遇到了一些问题,你们在遇到问题时可以使用 flyctl logs 命令查看部署过程中的问题。

参考