Skip to content

Minio ​

Minio安装配置 ​

部署MinIO ​

在liunx虚拟机部署MinIO,安装方式采用rpm离线安装,具体步骤可参考官方文档。

  1. 获取MinIO安装包

    下载地址如下:https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm,通过以下命令可直接将安装包下载至服务器

    bash
    wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm
  2. 安装MinIO

    bash
    rpm -ivh minio-20230809233022.0.0.x86_64.rpm
  3. 集成Systemd

    • Systemd概述

      Systemd是一个广泛应用于Linux系统的系统初始化和服务管理器,其可以管理系统中的各种服务和进程,包括启动、停止和重启服务,除此之外,其还可以监测各服务的运行状态,并在服务异常退出时,自动拉起服务,以保证服务的稳定性。系统自带的防火墙服务firewalld,我们自己安装的mysqld和redis均是由Systemd进行管理的,将MinIO服务也交给Systemd管理。

    • 编写MinIO服务配置文件

      Systemd所管理的服务需要由一个配置文件进行描述,这些配置文件均位于/etc/systemd/system/或者/usr/lib/systemd/system/目录下,下面创建MinIO服务的配置文件。

      执行以下命令创建并打开minio.service文件

      bash
      vim /etc/systemd/system/minio.service

      内容如下,具体可参考MinIO官方文档。

      ini
      [Unit]
      Description=MinIO
      Documentation=https://min.io/docs/minio/linux/index.html
      Wants=network-online.target
      After=network-online.target
      AssertFileIsExecutable=/usr/local/bin/minio
      
      [Service]
      WorkingDirectory=/usr/local
      ProtectProc=invisible
      EnvironmentFile=-/etc/default/minio
      ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
      ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
      Restart=always
      LimitNOFILE=65536
      TasksMax=infinity
      TimeoutStopSec=infinity
      SendSIGKILL=no
      
      [Install]
      WantedBy=multi-user.target

      注意:

      重点关注上述文件中的以下内容即可

      • EnvironmentFile,该文件中可配置MinIO服务所需的各项参数
      • ExecStart,该参数用于配置MinIO服务的启动命令,其中$MINIO_OPTS、$MINIO_VOLUMES,均引用于EnvironmentFile中的变量。
        • MINIO_OPTS用于配置MinIO服务的启动选项,可省略不配置。
        • MINIO_VOLUMES用于配置MinIO服务的数据存储路径。
      • Restart,表示自动重启
    • 编写EnvironmentFile文件

      执行以下命令创建并打开/etc/default/minio文件

      bash
      vim /etc/default/minio

      内容如下,具体可参考官方文档。

      ini
      MINIO_ROOT_USER=<LOCAL_ONLY_ADMIN_USER>
      MINIO_ROOT_PASSWORD=<GENERATE_A_STRONG_RANDOM_PASSWORD>
      MINIO_VOLUMES=/data
      MINIO_OPTS="--console-address :9001"

      安全提示:以上管理凭据仅供本地教学。生产环境请通过 secret/env 注入独立账号与强随机密码,禁止继续使用默认值或把真实凭据写入仓库。

      注意

      • MINIO_ROOT_USER和MINIO_ROOT_PASSWORD为用于访问MinIO的用户名和密码,密码长度至少8位。

      • MINIO_VOLUMES用于指定数据存储路径,需确保指定的路径是存在的,可执行以下命令创建该路径。

        bash
        mkdir /data
      • MINIO_OPTS中的console-address,用于指定管理页面的地址。

  4. 启动MinIO

    执行以下命令启动MinIO

    bash
    systemctl start minio

    执行以下命令查询运行状态

    bash
    systemctl status minio

    设置MinIO开机自启

    bash
    systemctl enable minio
  5. 访问MinIO管理页面

    管理页面的访问地址为:http://<服务器IP地址>:9001

项目配置 ​

配置流程 ​

  1. 配置xml
  2. 创建Minio属性类
  3. 创建Minion配置类

1.xml配置

xml
minio:
  endpoint: <ip地址:端口>
  access-key: ${MINIO_ACCESS_KEY}
  secret-key: ${MINIO_SECRET_KEY}
  bucket-name: lease

2.创建Minio类

java
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {

    private String endpoint;

    private String accessKey;

    private String secretKey;

    private String bucketName;
}

3.创建Minio配置类

java
@Configuration
@EnableConfigurationProperties(MinioProperties.class)
@ConditionalOnProperty(name = "minio.endpoint")
public class MinioConfiguration {

    @Autowired
    private MinioProperties properties;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder().
                endpoint(properties.getEndpoint()).
                credentials(properties.getAccessKey(), properties.getSecretKey()).
                build();
    }
}

文件上传实现 ​

判断桶是否存在

java
boolean bucketExists =minioClient.bucketExists(																							BucketExistsArgs.builder().
												bucket(minioProperties.getBucketName()).
												build());

创建存储桶

java
if (!bucketExists) {
    minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());
}

设置存储策略

java
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(minioProperties.getBucketName()).config(createBucketPolicyConfig(minioProperties.getBucketName())).build());

存储策略

Statement字段: 定义策略规则

Action字段: 读取对象动作

Effect字段: 允许

Principal: 所有用户

Resource字段:存储桶的ARN格式字符串 其中 %s为桶实际名称 , /*为桶中所有对象

Version字段: 指定AWS策略语言版本

bucketName对应Resource中%s

java
private String createBucketPolicyConfig(String bucketName) {

    return """
            {
              "Statement" : [ {
                "Action" : "s3:GetObject",
                "Effect" : "Allow",
                "Principal" : "*",
                "Resource" : "arn:aws:s3:::%s/*"
              } ],
              "Version" : "2012-10-17"
            }
            """.formatted(bucketName);
}

文件存储路径(通过UUID指定为唯一)

java
String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();

上传文件

java
minioClient.putObject(PutObjectArgs.builder().
        bucket(minioProperties.getBucketName()).
        object(filename).
        stream(file.getInputStream(), file.getSize(), -1).
        contentType(file.getContentType()).build());

返回URL

java
return String.join("/", minioProperties.getEndpoint(), minioProperties.getBucketName(), filename);