MinIO 部署

I. 部署 MinIO

1.1 单节点部署

1.1.1 先决条件

1、存储及内存要求

ℹ️ 参考: 官方文档

2、配置防火墙

允许流量进入访问 MinIO 服务器和 MinIO 控制台的端口:

  • 9000 是 MinIO 服务器监听的默认端口。
  • 9001 是访问 MinIO 控制台的推荐端口。

使用以下命令打开所需的防火墙端口(==若使用 Nginx 代理则不需要此项==):

1
2
sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
sudo firewall-cmd --zone=public --add-port=9001/tcp --permanent

启用 HTTP 和 HTTPS 访问:

1
2
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent

重新加载防火墙以应用更改:

1
sudo firewall-cmd --reload

1.1.2 部署单节点单硬盘 MinIO

⚠️ 警告:
网络文件系统卷破坏了一致性保证:
MinIO 严格的先读后写和先列后写一致性模型需要本地驱动器文件系统。
如果底层存储卷是 NFS 或类似的网络连接存储卷,MinIO 无法提供一致性保证。

1、下载社区版 MinIO Server 使用以下选项之一,为在英特尔或 AMD 64 位处理器上运行 Linux 的机器下载 MinIO 服务器安装文件。

amd64 (Intel or AMD 64-bit processors)

  • RPM(RHEL)
1
2
wget https://dl.min.io/server/minio/release/linux-amd64/minio-20xxxxxxxxx.0.0-1.x86_64.rpm
sudo dnf install minio-20xxxxxxxxx.0.0-1.x86_64.rpm

📢 注意:
请将 minio-20xxxxxxxxx.0.0-1.x86_64.rpm 替换为实际安装包名。

2、创建 systemd 服务
.deb.rpm 软件包会将以下 System (systemd.io) 服务文件安装到 /usr/lib/systemd/system/minio.service ,对于二进制安装,请在所有 MinIO 主机上手动创建此文件。

📌 过程说明:
systemd 在检查 /usr/lib/systemd/... 路径之前会检查 /etc/systemd/... 路径,并使用找到的第一个文件。为避免配置选项冲突或出现意外,请检查文件是否只存在于 /usr/lib/systemd/system/minio.service 路径下。
有关文件路径搜索顺序的详细信息,请参阅 systemd.unit 手册。

minio.service 文件默认以 minio-user 用户和组的身份运行。 可以使用 groupadduseradd 命令创建用户和组。 下面的示例创建了用户和组,并设置了访问 MinIO 使用的文件夹路径的权限。 这些命令通常需要 root (sudo) 权限。

1
2
3
4
sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user minio-user
sudo mkdir -p /mnt/data/minio
sudo chown minio-user:minio-user /mnt/data/minio

📌 参数说明:
-M 标志指示命令不为用户创建主目录。
-r 标志会创建一个系统用户。
-g 标志将用户分配到其主要组。

指定的驱动器路径 /mnt/data/minio 仅作为示例参考。 请根据 MinIO 打算使用的驱动器路径进行更改。

3、创建环境变量文件
/etc/default/minio 下创建环境变量文件。 对于 Windows 主机,请指定类似于 C:\minio\config 的 Windows 风格路径。 MinIO Server 容器可以将此文件作为所有 环境变量 的来源。

1
sudo vim /etc/default/minio

下面的示例提供了一个起始环境文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# MinIO recommends setting non-default values as a best practice, regardless of environment

MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin

# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.

MINIO_VOLUMES="/mnt/data/minio"

# MINIO_OPTS sets any additional commandline options to pass to the MinIO server.
# For example, `--console-address :9001` sets the MinIO Console listen port

MINIO_OPTS="--console-address :9001"

# Specify the Fully Qualified Domain Name (FQDN) the MinIO Console listens for incoming connections on.
# If you want to host the MinIO Console exclusively from a reverse-proxy service, you must specify the hostname managed by that service.

#MINIO_BROWSER_REDIRECT_URL="https://console.example.com/"

根据部署需要加入其他环境变量。

📢 注意:
MINIO_ROOT_USER 长度至少为 3 个字符;
MINIO_ROOT_PASSWORD 长度至少为 8 个字符;
如有签名证书,可在参数 MINIO_OPTS 中指定( Network Encryption (TLS) ),示例如下:
MINIO_OPTS="--certs-dir /home/<user>/.minio/certs --console-address :9001"

4、启动 MinIO 服务
在本地主机上发出以下命令,将 MinIO SNSD 部署作为服务启动:

1
sudo systemctl start minio

使用以下命令确认服务是否在线并正常运行:

1
2
sudo systemctl status minio
journalctl -f -u minio

MinIO 服务不会在主机重启时自动启动。 您必须使用 systemctl enable minio.service 作为主机启动的一部分来启动该进程。

1
sudo systemctl enable minio

journalctl 的输出应类似于下面的内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Status:         1 Online, 0 Offline.
API: http://192.168.2.100:9000  http://127.0.0.1:9000
RootUser: myminioadmin
RootPass: minio-secret-key-change-me
Console: http://192.168.2.100:9001 http://127.0.0.1:9001
RootUser: myminioadmin
RootPass: minio-secret-key-change-me

Command-line: https://min.io/docs/minio/linux/reference/minio-mc.html
   $ mc alias set myminio http://10.0.2.100:9000 myminioadmin minio-secret-key-change-me

Documentation: https://min.io/docs/minio/linux/index.html

API 块列出了客户端可以访问 MinIO S3 API 的网络接口和端口。 Console 模块列出了客户端可以访问 MinIO Web 控制台的网络接口和端口。

5、连接 MinIO 服务
在首选浏览器(如 http://localhost:9001)中输入MinIO 服务器 Console 区块中的任何主机名或 IP 地址,即可访问 MinIO 控制台。

使用容器指定的环境文件中配置的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 登录。

II. 部署 Nginx

2.1 安装 Nginx

Nginx 安装

2.2 申请 SSL 证书

acme.sh 教程

2.3 配置 Nginx ( 官方文档 )

1、创建“Web 控制台”和 “API 服务”配置文件

1
2
cd /etc/nginx/conf.d/
touch minio.conf

2、创建日志文件并修改其属性

1
2
cd /var/log/nginx
touch api.access.log api.error.log web.access.log web.error.log

3、配置文件内容参考

  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
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
upstream minio_s3 {
    least_conn;
    server localhost:9000;
}

upstream minio_console {
    least_conn;
    server localhost:9001;
}

server {
    listen       443 ssl;
    listen       [::]:443 ssl;
    http2        on;

    server_name  api.example.com;

    if ($host != 'api.example.com') {
        return 444;
    }

    # Log configuration
    access_log  /var/log/nginx/api-access.log;
    error_log   /var/log/nginx/api-error.log warn;

    # SSL configuration
    ssl_certificate            /etc/ssl/example-com/fullchain.cer;
    ssl_certificate_key        /etc/ssl/example-com/example.com.key;
    ssl_session_cache          shared:SSL:10m;
    ssl_session_timeout        1440m;
    ssl_session_tickets        off;
    ssl_protocols              TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers  on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA;

    # Allow special characters in headers
    ignore_invalid_headers off;

    # Allow any size file to be uploaded.
    # Set to a value such as 1000m; to restrict file size to a specific value
    client_max_body_size 0;

    # Disable buffering
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_set_header  Host $http_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 $scheme;

        proxy_connect_timeout 300;

        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version         1.1;
        proxy_set_header           Connection "";
        chunked_transfer_encoding  off;

        # This uses the upstream directive definition to load balance
        proxy_pass http://minio_s3;
    }
}

server {
    listen       443 ssl;
    listen       [::]:443 ssl;
    http2        on;

    server_name  web.example.com;

    if ($host != 'web.example.com') {
        return 444;
    }

    # Log configuration
    access_log  /var/log/nginx/web.access.log;
    error_log   /var/log/nginx/web.error.log warn;

    # SSL configuration
    ssl_certificate            /etc/ssl/example-com/fullchain.cer;
    ssl_certificate_key        /etc/ssl/example-com/example.com.key;
    ssl_session_cache          shared:SSL:10m;
    ssl_session_timeout        1440m;
    ssl_session_tickets        off;
    ssl_protocols              TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers  on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA;

    # Allow special characters in headers
    ignore_invalid_headers off;

    # Allow any size file to be uploaded.
    # Set to a value such as 1000m; to restrict file size to a specific value
    client_max_body_size 0;

    # Disable buffering
    proxy_buffering          off;
    proxy_request_buffering  off;

    location / {
        proxy_set_header  Host $http_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 $scheme;
        proxy_set_header  X-NginX-Proxy true;

        # This is necessary to pass the correct IP to be hashed
        real_ip_header X-Real-IP;

        proxy_connect_timeout 300;

        # To support websocket
        proxy_http_version  1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";

        chunked_transfer_encoding off;

        # This uses the upstream directive definition to load balance
        proxy_pass http://minio_console;
    }
}

server {
    listen  80;
    listen  [::]:80;

    server_name *.example.com;

    return  301 https://$host$request_uri;
}

4、测试配置

1
sudo nginx -t

2.4 添加域名解析

参考示例: 域名解析-腾讯云

III. 创建存储桶

3.1 MinIO 登录

访问地址: mi.example.com ,输入你最初设置的用户密码登录。

3.2 Bucket 配置

1、导航至侧菜单 “Object Browser”,然后创建名为 bucket1 (可自定义桶名称)的新桶。

2、从侧菜单中选择 “Access Keys” -> “Create access key”,打开 “Restrict beyond user policy(超出用户策略限制) ” ,指定可访问的“桶”,参考如下:

 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
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "admin:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket1/*"
            ]
        }
    ]
}

为策略命名,如 ‘Bucket1 Token’,完成后生成一个新的访问密钥。 然后,将新创建的访问密钥和秘钥保存在记事本中,以备后用。

3、从侧菜单中选择"Buckets",选择 bucket1 在“Summary”(摘要)项中选择 “Access Policy”为“Public”。

4、在“Anonymous”(匿名)项中修改规则 readwirtereadonly

1
2
Prefix: /
Access: readonly

5、返回“Summary”项,可以看到“Access Policy”当前为“Custom”。编辑“Custom”,在“Write Policy”中,删除 "s3:ListBucket" 以关闭公开桶的列表展示。

1
2
3
4
5
...
"Action": [
    "s3:GetBucketLocation"
],
...

IV. 升级 MinIO

4.1 先决条件

参考: 官方文档

4.2 升级 MinIO 部署

使用这些步骤升级 MinIO 部署,其中 MinIO 服务器进程由 systemctl 管理,例如使用 MinIO DEB/RPM 软件包 创建的部署。

此过程假定已在所有 MinIO 节点上设置 MINIO_CONFIG_ENV_FILE 变量。

1、在每个节点上更新 MinIO 二进制文件

  • RPM (RHEL)

使用以下命令下载最新稳定的 MinIO RPM 并更新现有安装。

1
2
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20xxxxxxxxx.0.0-1.x86_64.rpm
sudo dnf update minio-20xxxxxxxxx.0.0-1.x86_64.rpm

在每个节点上运行 minio --version 验证是否已成功将所有二进制文件升级到相同版本。 除非所有节点都使用相同的 MinIO 二进制版本,否则不要继续。

2、重新加载 systemd 管理器配置文件

1
sudo systemctl daemon-reload

3、重新启动部署

运行 mc admin service restart 命令,同时重启部署中的所有 MinIO 服务器进程。

1
mc admin service restart ALIAS

替换要重启的 MinIO 部署的 alias

与 S3 兼容的 SDK 和应用程序应自动重试操作,这样重启过程通常不会影响正在进行的操作。

4、验证升级

使用 mc admin info 命令检查所有 MinIO 服务器是否在线、运行并反映已安装的 MinIO 版本。

5、更新 MinIO 客户端

您应该升级您的 mc 二进制文件,以匹配或紧跟 MinIO 服务器的发布。 您可以使用 mc update 命令将二进制文件更新到最新的稳定版本:

1
mc update

V. 数据备份

5.1 安装 mc 客户端

📌 环境说明:
这里以 Windows 客户端演示。

1、下载客户端: MinIO Client

2、将下载的 mc.exe 客户端文件复制到以下目录👇

1
%SystemRoot%\System32

3、打开终端,输入以下命令验证安装👇

1
mc -v

5.2 配置 mc 服务

设置 MinIO 别名语法

1
mc alias set 名称 服务地址 用户名 密码
  • 设置备份源 minio 👇
1
mc alias set source http://ip:9000 user password
  • 设置备份目标 minio 👇
1
mc alias set target http://ip:9000 user password

📢 注意:
这里的端口须是 S3 API 端口,默认为 9000

5.3 备份存储桶至本地

1、本地备份语法:

1
mc cp -r source/<bucket-name> /path/to/local/directory

📌 参数说明:

  • source/<bucket-name> 是 MinIO 上存储桶的路径。
  • /path/to/local/directory 是本地的备份目录。

2、本地实操(Windows 演示)

1
cp -r source\imgs e:\temp

5.4 迁移到另一存储桶

mc 迁移数据通常有下面 3 种场景:

1、全量迁移,重名文件不覆盖,如 bucket 不存在,会自动创建

1
mc mirror source target

2、只迁移某个 bucket ,以 test 为例,迁移的目标 bucket 需要提前创建

1
mc mirror source/test  target/test

📢 注意:
test 要提前在 target 中创建。

3、加上 --overwrite 参数,覆盖重名文件

1
2
mc mirror --overwrite source target
mc mirror --overwrite source/test  target/test

5.5 mc 命令

1、命令参数

CommandExplain
ls列出文件和文件夹
mb创建一个存储桶或一个文件夹
cat显示文件和对象内容
pipe将一个STDIN重定向到一个对象或者文件或者STDOUT
share生成用于共享的URL
cp拷贝文件和对象
mirror给存储桶和文件夹做镜像
find基于参数查找文件
diff对两个文件夹或者存储桶比较差异
rm除文件和对象
events管理对象通知
watch监听文件和对象的事件
policy管理访问策略
session为cp命令管理保存的会话
config管理mc配置文件
update检查软件更新
version输出版本信息

2、演示示例

执行命令测试能否连通,如有文件或至少存在一个 Bucket,会在回显中列出:

1
mc ls source

移除已经添加的 minio 服务:

1
mc config host remove target

执行命令获取集群数据大小,如果有文件或存在至少一个 Bucket,会在最后一行打印当前集群所有文件总大小:

1
mc du source

查看 ~/.mc/config.json 里的配置:

1
mc config host ls

查看所有 alias

1
mc alias ls  

使用命令检查是否有未完整传输的文件,如果有未传输完全的文件,会在回显中列出:

1
mc ls --incomplete source

如果有必要,可以删除某个桶中的残缺文件:

1
mc rm --incomplete $hostName/$bucket

VI. 卸载 MinIO

在 Rocky Linux 9.4 上卸载 MinIO Object Storage 可以按照以下步骤进行:

6.1 停止 MinIO 服务

首先,确保 MinIO 服务已停止,以避免文件锁或其他问题。

1
sudo systemctl disable minio --now

6.2 删除 MinIO 文件

6.2.1 卸载 MinIO 二进制文件

查找 MinIO 二进制文件的路径,一般会安装在 /usr/local/bin/minio/usr/bin/minio,使用以下命令删除它:

1
sudo rm -f /usr/local/bin/minio

6.2.2 删除 MinIO 数据与配置

MinIO 的数据和配置目录一般位于 /var/lib/minio/etc/minio

1
2
sudo rm -rf /var/lib/minio
sudo rm -rf /etc/minio

如果你有自定义路径,请根据实际情况删除相应目录:

1
2
sudo rm -rf /path/to/directory
rm -rf /etc/default/minio

6.2.3 清理 MinIO 用户和组

如果为 MinIO 创建了特定的系统用户或组,可以通过以下命令删除它们:

1
2
sudo userdel minio-user
sudo groupdel minio-group

6.2.4 清理日志文件

如果 MinIO 生成了日志文件,可以在 /var/log/ 中删除相关日志文件。例如:

1
sudo rm -rf /var/log/minio.log

卸载完成后,可以通过运行 which miniominio --version 来确认 MinIO 已成功卸载。

6.2.5 查找剩余文件

1
find / -name "*minio*"

VII. 参考文档

  1. 官方文档: MinIO Object Storage for Linux

  2. 参考文档: MinIO+PicGo+Nginx+Typora 自建图床