MinIO的S3对象存储替代品Garage

据说 Minio 在最新的更新中,删除了 Web UI 中的管理员功能。后续我们可以选择 OpenMaxIO 作为替代,这是 Minio 使用 UI 的一个分支。而今天我们介绍的 Garage ,则是另一个不同的对象存储选项。

简介

什么是 Garage ?

Garage 是一个 S3 兼容的分布式对象存储服务,设计用于小到中型的自托管环境。它旨在支持在不同物理位置运行的存储集群,能够高效地复制数据并保持可用性,即使部分服务器不可达。

主要特点

  • 分布式存储:支持多个节点,提供地理分布的存储解决方案。
  • 高可用性:即使部分节点出现故障,数据仍然可访问。
  • 轻量级和易于操作:专注于简化管理,适合小规模部署。
  • 开源:完全免费,遵循 AGPLv3 许可证。

什么是 Garage Web UI ?

Garage Web UI 是一个简单的管理界面,用于 Garage 对象存储服务。它是一个自托管的、S3 兼容的分布式对象存储解决方案的前端界面。

主要特点

  • 健康状态监控:可以查看 Garage 的健康状态。
  • 集群与布局管理:方便管理存储集群的布局。
  • 桶管理:创建、更新和查看桶的信息。
  • 对象浏览:集成的对象和桶浏览器。
  • 访问密钥管理:创建和分配访问密钥。

Garage Web UI 提供了一个用户友好的界面,方便用户管理和操作 Garage 对象存储服务。

安装

在群晖上以 Docker 方式安装。

garage.toml.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "sqlite"

replication_factor = 1

rpc_bind_addr = "[::]:3901"
rpc_public_addr = "192.168.0.197:3901"
rpc_secret = "1a3dde195f0e94165b1fdd8587d54c657b3e7567646187565121526beedd70d1"

[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.laosu.tech"

[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.laosu.tech"
index = "index.html"

[admin]
api_bind_addr = "[::]:3903"
admin_token = "040adfcd8ea79d96a6e4404355e496d11e8bf6f4bffc41e7878f9def198bf78b"
metrics_token = "cbb4a2fb16cec7c0e16ce8efe62766b22e625872e4fa24ef9020c7d11b8b0fc1"
变量名 说明
metadata_dir 存储元数据的目录,设置为 /var/lib/garage/meta
data_dir 存储对象数据块的目录,设置为 /var/lib/garage/data
db_engine 数据库引擎,设置为 sqlite
replication_factor 数据的复制因子,设置为 1
rpc_bind_addr 节点监听RPC通信的地址和端口,设置为 [::]:3901
rpc_public_addr 其他节点用于联系该节点的公共地址和端口,设置为 192.168.0.197:3901
rpc_secret RPC 通信的密钥,用于节点间的身份验证,通过 openssl rand -hex 32 生成。
[s3_api] S3 API 的配置部分。
s3_region S3 区域,设置为 garage
api_bind_addr S3 API 的绑定地址,设置为 [::]:3900
root_domain S3 桶的根域名。
[s3_web] 将桶公开为网站的配置部分。
bind_addr 网站请求的绑定地址,设置为 [::]:3902
root_domain 网站的根域名。
index 网站的索引文件,设置为 index.html
[admin] 管理功能的配置部分。
api_bind_addr 管理 API 的绑定地址,设置为 [::]:3903
admin_token 管理 API 的访问令牌,通过 openssl rand -hex 32 生成。
metrics_token 监控 API 的访问令牌,通过 openssl rand -hex 32 生成。

更多设置变量的详细说明,可以参考官方的文档:https://garagehq.deuxfleurs.fr/documentation/reference-manual/configuration

docker-compose.yml

将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services:
garage:
image: dxflrs/garage:v1.1.0
container_name: garage
restart: unless-stopped
ports:
- 3900:3900 ## s3 api
- 3901:3901 ## rpc
- 3902:3902 ## s3 web
- 3903:3903 ## admin api and '/metrics' for prometheus
volumes:
- ./garage.toml.txt:/etc/garage.toml
- ./meta:/var/lib/garage/meta
- ./data:/var/lib/garage/data
environment:
- TZ=Asia/Shanghai

webui:
image: khairul169/garage-webui:latest
container_name: garage-webui
restart: unless-stopped
ports:
- 3909:3909
volumes:
- ./garage.toml.txt:/etc/garage.toml:ro
environment:
API_BASE_URL: "http://garage:3903"
S3_ENDPOINT_URL: "http://garage:3900"

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 garage 和 子目录
mkdir -p /volume1/docker/garage/{data,meta}

# 进入 garage 目录
cd /volume1/docker/garage

# 将 docker-compose.yml 和 garage.toml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中输入 http://群晖IP:3909 就能看到主界面

进入 Cluster 可以查看当前节点的信息

点开后面的三个点 –> Assign

  • Node ID:默认的就可以
  • Zone:必填项,例如:home
  • Capacity:必填项

Save 保存后,还需要点 Apply 创建分区

进入 Keys,点 Create Keys 新建一个 Key

创建成功后

进入 Buckets

Create Buckets 创建存储桶

创建完成后,暂时还无法使用

无论是点 Manage 还是 Browse

切换到 Permissions

Allow Key

勾选 key 并赋予相应的权限

现在可以开始使用了

参考文档

Deuxfleurs/garage: S3-compatible object store for small self-hosted geo-distributed deployments - Gitea: git with a cup of coffee
地址:https://git.deuxfleurs.fr/Deuxfleurs/garage

khairul169/garage-webui: WebUI for Garage Object Storage Service
地址:https://github.com/khairul169/garage-webui

Garage - An open-source distributed object storage service
地址:https://garagehq.deuxfleurs.fr/

Quick Start | Garage HQ
地址:https://garagehq.deuxfleurs.fr/documentation/quick-start/

Garage - S3 object storage alternative to Minio : r/selfhosted
地址:https://www.reddit.com/r/selfhosted/comments/1kw1q9j/garage_s3_object_storage_alternative_to_minio/