轻量级对象存储系统——Minio

序言

  MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。 MinIO 提供与 Amazon S3 云存储服务兼容的 API,使用 MinIO 可以为机器学习、分析和应用程序数据工作负载构建高性能基础架构。

Minio Server

  要想使用 Minio,需要下载 Minio 的服务端并启动。

下载与安装

1
2
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio

启动

  执行以下命令将输出相关信息。

1
2
# 启动
MINIO_ROOT_USER=leeqingshui MINIO_ROOT_PASSWORD='#a123456' nohup ./minio server data --console-address ":9010" &

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RootUser: admin
RootPass: 12345678

Console: http://192.168.3.179:9001 http://127.0.0.1:9001
RootUser: admin
RootPass: 12345678

Command-line: https://docs.min.io/docs/minio-client-quickstart-guide
$ mc alias set myminio http://192.168.3.179:9000 admin 12345678

Documentation: https://docs.min.io

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ You are running an older version of MinIO released 7 months ago ┃
┃ Update: Run `mc admin update` ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Minio Client

  虽然 MinIO 实现了多用户权限控制管理,但是在前端控制台却无法对特定的云服务进行配置,而要去使用 MinIO Client(简称 mc)的相关命令进行配置。

下载与安装

1
2
3
4
# 下载
wget https://dl.min.io/client/mc/release/linux-amd64/mc
# 赋予执行权限
chmod +x mc

云服务管理

  默认情况下,Minio Client 自带部分云服务的配置,包括playgcss3

添加云服务

  通常情况下,我们都会新建一个自己的云服务,那么如何添加一个云服务呢?

  使用以下命令即可:

1
2
3
4
5
# <YOUR-S3-ENDPOINT> 云服务地址,即 Minio Server 地址,如 http://127.0.0.1:9000, 必填
# <ALIAS> 赋予云服务别名,必填
# <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> 云存储服务账号密码,即 Minio Server 启动后 API 的端口,注意是 API 端口,不是控制台端口
# API 名是可选参数,默认不填则为 S3v4
mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> [--api API-SIGNATURE]

  云服务的配置内容在~/.mc/config.json件中,此文件在我们第一次添加云服务时生成。

  下面我们新增一个自己的云服务:

1
./mc config host add local http://127.0.0.1:9000/ leeqingshui 123456

  命令执行成功后,输出以下内容,生成了相关文件:

1
2
3
4
5
mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/root/.mc/share`.
mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
Added `local` successfully.

查看云服务信息

  我们现在去~/.mc/config.json看下配置内容:

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
29
30
31
32
33
{
"version": "10",
"aliases": {
"gcs": {
"url": "https://storage.googleapis.com",
"accessKey": "YOUR-ACCESS-KEY-HERE",
"secretKey": "YOUR-SECRET-KEY-HERE",
"api": "S3v2",
"path": "dns"
},
"local": {
"url": "http://127.0.0.1:9000",
"accessKey": "leeqingshui",
"secretKey": "123456",
"api": "s3v4",
"path": "auto"
},
"play": {
"url": "https://play.min.io",
"accessKey": "Q3AM3UQ867SPQQA43P2F",
"secretKey": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
"api": "S3v4",
"path": "auto"
},
"s3": {
"url": "https://s3.amazonaws.com",
"accessKey": "YOUR-ACCESS-KEY-HERE",
"secretKey": "YOUR-SECRET-KEY-HERE",
"api": "S3v4",
"path": "dns"
}
}
}

  可以看到,我们自定义的云服务新增成功了。

删除云服务

  默认情况下,Minio 自带的三个云服务我们均不需要,那么删掉好了。

1
2
3
./mc config host remove gcs
./mc config host remove play
./mc config host remove s3

  上述命令执行完成之后,再次查看~/.mc/config.json文件,可以发现删除成功,现在只剩我们自己添加的了:

1
2
3
4
5
6
7
8
9
10
11
12
{
"version": "10",
"aliases": {
"local": {
"url": "http://127.0.0.1:9000",
"accessKey": "leeqingshui",
"secretKey": "123456",
"api": "s3v4",
"path": "auto"
}
}
}

桶管理

命令 说明
./mc mb local/blog local云服务下创建blog
./mc ls local 列出local云服务下的所有桶
./mc ls local/blog 列出local云服务下blog桶的文件列表

权限管理

  MinIO Client(mc)提供了admin子命令来进行 Minio 的权限管理。

命令 说明
mc admin user 用户管理
mc admin group 群组管理
mc admin policy 策略管理

用户管理

  mc admin user命令,用于添加,删除,启用,禁用 MinIO 服务器上的用户。

用户新增

  mc admin user add命令可用于新增用户。

  下面的命令执行后,在local云服务下新增了一个newuser用户,并且密码为newuser123

1
2
3
4
5
./mc admin user add local/ newuser newuser123
# 等同
./mc admin user add local/
Enter Access Key: newuser
Enter Secret Key: newuser123

禁用用户

  mc admin user disable命令可用于禁用用户。

  下面的命令执行后,在local云服务下禁用了newuser用户。

1
./mc admin user disable local/ newuser

启用用户

  mc admin user enable命令可用于启用禁用的用户。

  下面的命令执行后,在local云服务下启用了禁用的newuser用户。

1
./mc admin user enable local/ newuser

删除用户

  mc admin user remove命令可用于删除用户。

  下面的命令执行后,在local云服务下删除的newuser用户。

1
./mc admin user remove local/ newuser

查看所有用户信息

  mc admin user list命令可用于查看所有用户的信息。

  下面的命令执行后,将显示在local云服务下的所有用户信息。

1
./mc admin user list --json local/

1
{"status":"success","accessKey":"newuser","userStatus":"enabled"}

显示特定用户信息

  mc admin user info命令可用于显示特定用户信息。

1
./mc admin user info local newuser

群组管理

  mc admin group命令用于添加,删除,信息,列出,启用,禁用组。

组中添加用户(新建组)

  mc admin group add命令可用于在组中添加用户。

  将一对用户添加到 MinIO 上的somegroup组中。 如果组不存在,则会创建该组。

1
mc admin group add local somegroup someuser1 someuser2

组中删除用户(删除组)

  mc admin group remove命令可用于在组中删除用户。
  从 MinIO 的local云服务下的somegroup 组中删除一对用户:

1
mc admin group remove local somegroup someuser1 someuser2

  从 MinIO 上删除组somegroup仅在给定组用户为空时有效。

1
mc admin group remove local somegroup

获取组信息

  mc admin group info命令可用于获取组信息。

1
mc admin group info local somegroup

列出所有组

  mc admin group list命令可用于列出所有组。

1
mc admin group list local

禁用组

  mc admin group disable命令可用于禁用组。

1
mc admin group disable local somegroup

启用组

  mc admin group enable命令可用于启用组。

1
mc admin group enable local somegroup

策略管理

  对桶而言,policy 命令可以为其添加,删除,列出策略,获取有关策略的信息并为 MinIO 服务器上的用户设置策略。

命令 说明
mc admin policy add 添加新策略
mc admin policy set 替换策略
mc admin policy remove 删除策略
mc admin policy list 查看策略列表
mc admin policy info 查看策略信息

策略文件说明

  Minio 使用json格式的文件配置策略,具体说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"Version": "2012-10-17", # 日期勿动
"Statement": [
{
"Effect": "Allow",
"Action": [ // 权限列表
"s3:ListAllMyBuckets", // 查看所有的桶权限
"s3:ListBucket", // 查看桶内对象权限
"s3:GetBucketLocation", // 定位bucket权限
"s3:GetObject", // 下载权限
"s3:PutObject", // 上传权限
"s3:DeleteObject" // 删除权限
],
"Resource": [
"arn:aws:s3:::blog/*" // arn:aws:s3 默认即可,后面接*表示所有桶,用 blog/* 表示只针对 blog 这个桶
]
}
]
}

添加新策略

  首先创建策略文件policy/blog.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetBucketLocation",
"s3:PutObject",
],
"Resource": [
"arn:aws:s3:::blog/*"
]
}
]
}

  之后将blog策略添加到策略数据库中:

1
./mc admin policy add local/ blog ./policy/blog.json

  输出Added policy blog successfully.代表成功。

删除策略

  执行以下命令后,将删除

1
./mc admin policy remove local/ blog

  输出Removed policyblogsuccessfully.代表成功。

显示桶策略的信息

  执行以下命令后,

1
./mc admin policy info local/ writeonly

1
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:PutObject"],"Resource":["arn:aws:s3:::*"]}]}

在用户或组上设置固定策略

  执行以下命令后,

1
2
3
4
5
mc admin policy set local/ writeonly user=someuser
Policy writeonly is set on user `someuser`

mc admin policy set local/ writeonly group=somegroup
Policy writeonly is set on group `somegroup`

设定指定策略到指定用户上

  执行以下命令后,

1
./mc admin policy set local blog user=chris

  执行命令输出以下内容后代表成功

1
Policy blog is set on user chris

列出指定桶所有固定策略

  执行以下命令后,

1
./mc admin policy list local/

1
2
3
4
5
6
readonly
readwrite
writeonly
blog
consoleAdmin
diagnostics

Nginx 配置

http

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name img.yourdomain.com;
client_max_body_size 50M;

# 代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

location / {
proxy_pass http://127.0.0.1:9000;
}
}

https

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
server {
listen 443 ssl;
server_name img.yourdomain.com;
client_max_body_size 50M;

# 证书文件名称
ssl_certificate /etc/nginx/certificate/minio/img.yourdomain.com_bundle.crt;
# 私钥文件名称
ssl_certificate_key /etc/nginx/certificate/minio/img.yourdomain.com.key;
ssl_session_timeout 5m;
# 请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
# 请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto "https";

location / {
proxy_pass http://127.0.0.1:9000;
}

}

扩展——文件匿名访问

  存储桶策略若为private,则无法被匿名用户访问,若想允许匿名访问,可以对桶进行如下设置:

匿名访问

定时备份

准备文件夹

1
2
cd /data/software/minio
mkdir -p backups/scripts backups/logs backups/files

创建备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vim /data/software/minio/backups/scripts/backup.sh

#!/bin/bash
# 当前日期
curTime=`date +'%Y%m%d'`
# 记录的日志文件
BACKUP_LOG_FILE=/data/software/minio/backups/logs/backup.log
# 备份的文件
BACKUP_DATA_DIR=/data/software/minio/data
# 备份后文件根目录
BACKUP_ROOT_DIR=/data/software/minio/backups/files/
# 备份文件保存时间
expireDay=7

# 执行备份脚本
## --ignore-table 参数指定忽略的日志表
tar -cvf ${BACKUP_ROOT_DIR}${curTime}_backup.tar ${BACKUP_DATA_DIR}

echo "[INFO] $(date +%Y-%m-%d_%H:%M:%S) minio backup file generate done" >> ${BACKUP_LOG_FILE}

echo "[INFO] $(date +%Y-%m-%d_%H:%M:%S) minio backup compress done" >> ${BACKUP_LOG_FILE}

# 删除过期数据
find ${BACKUP_ROOT_DIR} -type f -mtime +${expireDay} -name "*.tar" -exec rm -rf {} \;

赋予执行权限

1
chmod +x /data/software/minio/backups/scripts/backup.sh

加入定时计划

1
2
# 每天凌晨一点执行
00 1 * * * sh /data/software/minio/backups/scripts/backup.sh > /dev/null 2>&1 &

文章信息

时间 说明
2022-06-21 初稿
2022-06-26 完稿
2022-12-19 增加定时备份一节
0%