I. 部署 MinIO

1.1 单节点部署

1.1.1 先决条件

1、存储及内存要求

ℹ️ 参考:官方文档

2、配置防火墙

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

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

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

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

启用 HTTP 和 HTTPS 访问:

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

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

1sudo 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)
1wget https://dl.min.io/server/minio/release/linux-amd64/minio-20xxxxxxxxx.0.0-1.x86_64.rpm
2sudo 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) 权限。

1sudo groupadd -r minio-user
2sudo useradd -M -r -g minio-user minio-user
3sudo mkdir -p /mnt/data/minio
4sudo 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 容器可以将此文件作为所有 环境变量 的来源。

1sudo vim /etc/default/minio

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

 1# MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
 2# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
 3# Omit to use the default values 'minioadmin:minioadmin'.
 4# MinIO recommends setting non-default values as a best practice, regardless of environment
 5
 6MINIO_ROOT_USER=minioadmin
 7MINIO_ROOT_PASSWORD=minioadmin
 8
 9# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.
10
11MINIO_VOLUMES="/mnt/data/minio"
12
13# MINIO_OPTS sets any additional commandline options to pass to the MinIO server.
14# For example, `--console-address :9001` sets the MinIO Console listen port
15
16MINIO_OPTS="--console-address :9001"
17
18# Specify the Fully Qualified Domain Name (FQDN) the MinIO Console listens for incoming connections on.
19# If you want to host the MinIO Console exclusively from a reverse-proxy service, you must specify the hostname managed by that service.
20
21#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 部署作为服务启动:

1sudo systemctl start minio

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

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

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

1sudo systemctl enable minio

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

 1Status:         1 Online, 0 Offline.
 2API: http://192.168.2.100:9000  http://127.0.0.1:9000
 3RootUser: myminioadmin
 4RootPass: minio-secret-key-change-me
 5Console: http://192.168.2.100:9001 http://127.0.0.1:9001
 6RootUser: myminioadmin
 7RootPass: minio-secret-key-change-me
 8
 9Command-line: https://min.io/docs/minio/linux/reference/minio-mc.html
10   $ mc alias set myminio http://10.0.2.100:9000 myminioadmin minio-secret-key-change-me
11
12Documentation: 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 服务”配置文件

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

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

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

3、配置文件内容参考

  1upstream minio_s3 {
  2    least_conn;
  3    server localhost:9000;
  4}
  5
  6upstream minio_console {
  7    least_conn;
  8    server localhost:9001;
  9}
 10
 11server {
 12    listen       443 ssl;
 13    listen       [::]:443 ssl;
 14    http2        on;
 15
 16    server_name  api.example.com;
 17
 18    if ($host != 'api.example.com') {
 19        return 444;
 20    }
 21
 22    # Log configuration
 23    access_log  /var/log/nginx/api-access.log;
 24    error_log   /var/log/nginx/api-error.log warn;
 25
 26    # SSL configuration
 27    ssl_certificate            /etc/ssl/example-com/fullchain.cer;
 28    ssl_certificate_key        /etc/ssl/example-com/example.com.key;
 29    ssl_session_cache          shared:SSL:10m;
 30    ssl_session_timeout        1440m;
 31    ssl_session_tickets        off;
 32    ssl_protocols              TLSv1.2 TLSv1.3;
 33    ssl_prefer_server_ciphers  on;
 34    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;
 35
 36    # Allow special characters in headers
 37    ignore_invalid_headers off;
 38
 39    # Allow any size file to be uploaded.
 40    # Set to a value such as 1000m; to restrict file size to a specific value
 41    client_max_body_size 0;
 42
 43    # Disable buffering
 44    proxy_buffering off;
 45    proxy_request_buffering off;
 46
 47    location / {
 48        proxy_set_header  Host $http_host;
 49        proxy_set_header  X-Real-IP $remote_addr;
 50        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
 51        proxy_set_header  X-Forwarded-Proto $scheme;
 52
 53        proxy_connect_timeout 300;
 54
 55        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
 56        proxy_http_version         1.1;
 57        proxy_set_header           Connection "";
 58        chunked_transfer_encoding  off;
 59
 60        # This uses the upstream directive definition to load balance
 61        proxy_pass http://minio_s3;
 62    }
 63}
 64
 65server {
 66    listen       443 ssl;
 67    listen       [::]:443 ssl;
 68    http2        on;
 69
 70    server_name  web.example.com;
 71
 72    if ($host != 'web.example.com') {
 73        return 444;
 74    }
 75
 76    # Log configuration
 77    access_log  /var/log/nginx/web.access.log;
 78    error_log   /var/log/nginx/web.error.log warn;
 79
 80    # SSL configuration
 81    ssl_certificate            /etc/ssl/example-com/fullchain.cer;
 82    ssl_certificate_key        /etc/ssl/example-com/example.com.key;
 83    ssl_session_cache          shared:SSL:10m;
 84    ssl_session_timeout        1440m;
 85    ssl_session_tickets        off;
 86    ssl_protocols              TLSv1.2 TLSv1.3;
 87    ssl_prefer_server_ciphers  on;
 88    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;
 89
 90    # Allow special characters in headers
 91    ignore_invalid_headers off;
 92
 93    # Allow any size file to be uploaded.
 94    # Set to a value such as 1000m; to restrict file size to a specific value
 95    client_max_body_size 0;
 96
 97    # Disable buffering
 98    proxy_buffering          off;
 99    proxy_request_buffering  off;
100
101    location / {
102        proxy_set_header  Host $http_host;
103        proxy_set_header  X-Real-IP $remote_addr;
104        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
105        proxy_set_header  X-Forwarded-Proto $scheme;
106        proxy_set_header  X-NginX-Proxy true;
107
108        # This is necessary to pass the correct IP to be hashed
109        real_ip_header X-Real-IP;
110
111        proxy_connect_timeout 300;
112
113        # To support websocket
114        proxy_http_version  1.1;
115        proxy_set_header    Upgrade $http_upgrade;
116        proxy_set_header    Connection "upgrade";
117
118        chunked_transfer_encoding off;
119
120        # This uses the upstream directive definition to load balance
121        proxy_pass http://minio_console;
122    }
123}
124
125server {
126    listen  80;
127    listen  [::]:80;
128
129    server_name *.example.com;
130
131    return  301 https://$host$request_uri;
132}

4、测试配置

1sudo 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    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Effect": "Allow",
 6            "Action": [
 7                "admin:*"
 8            ]
 9        },
10        {
11            "Effect": "Allow",
12            "Action": [
13                "kms:*"
14            ]
15        },
16        {
17            "Effect": "Allow",
18            "Action": [
19                "s3:*"
20            ],
21            "Resource": [
22                "arn:aws:s3:::bucket1/*"
23            ]
24        }
25    ]
26}

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

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

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

1Prefix: /
2Access: readonly

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

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

IV. 升级 MinIO

4.1 先决条件

参考:官方文档

4.2 升级 MinIO 部署

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

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

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

  • RPM (RHEL)

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

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

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

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

1sudo systemctl daemon-reload

3、重新启动部署

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

1mc admin service restart ALIAS

替换要重启的 MinIO 部署的 alias

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

4、验证升级

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

5、更新 MinIO 客户端

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

1mc update

V. 数据备份

5.1 安装 mc 客户端

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

1、下载客户端:MinIO Client

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

1%SystemRoot%\System32

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

1mc -v

5.2 配置 mc 服务

设置 MinIO 别名语法

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

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

5.3 备份存储桶至本地

1、本地备份语法:

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

📌 参数说明:

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

2、本地实操(Windows 演示)

1cp -r source\imgs e:\temp

5.4 迁移到另一存储桶

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

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

1mc mirror source target

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

1mc mirror source/test  target/test

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

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

1mc mirror --overwrite source target
2mc 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,会在回显中列出:

1mc ls source

移除已经添加的 minio 服务:

1mc config host remove target

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

1mc du source

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

1mc config host ls

查看所有 alias

1mc alias ls  

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

1mc ls --incomplete source

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

1mc rm --incomplete $hostName/$bucket

VI. 卸载 MinIO

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

6.1 停止 MinIO 服务

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

1sudo systemctl disable minio --now

6.2 删除 MinIO 文件

6.2.1 卸载 MinIO 二进制文件

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

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

6.2.2 删除 MinIO 数据与配置

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

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

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

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

6.2.3 清理 MinIO 用户和组

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

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

6.2.4 清理日志文件

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

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

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

6.2.5 查找剩余文件

1find / -name "*minio*"

VII. 参考文档

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

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