Minio
Minio安装配置
部署MinIO
在liunx虚拟机部署MinIO,安装方式采用rpm离线安装,具体步骤可参考官方文档。
获取MinIO安装包
bashwget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm安装MinIO
bashrpm -ivh minio-20230809233022.0.0.x86_64.rpm集成Systemd
Systemd概述
Systemd是一个广泛应用于Linux系统的系统初始化和服务管理器,其可以管理系统中的各种服务和进程,包括启动、停止和重启服务,除此之外,其还可以监测各服务的运行状态,并在服务异常退出时,自动拉起服务,以保证服务的稳定性。系统自带的防火墙服务firewalld,我们自己安装的mysqld和redis均是由Systemd进行管理的,将MinIO服务也交给Systemd管理。编写MinIO服务配置文件
Systemd所管理的服务需要由一个配置文件进行描述,这些配置文件均位于
/etc/systemd/system/或者/usr/lib/systemd/system/目录下,下面创建MinIO服务的配置文件。执行以下命令创建并打开
minio.service文件bashvim /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文件bashvim /etc/default/minio内容如下,具体可参考官方文档。
iniMINIO_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用于指定数据存储路径,需确保指定的路径是存在的,可执行以下命令创建该路径。bashmkdir /dataMINIO_OPTS中的console-address,用于指定管理页面的地址。
启动MinIO
执行以下命令启动MinIO
bashsystemctl start minio执行以下命令查询运行状态
bashsystemctl status minio设置MinIO开机自启
bashsystemctl enable minio访问MinIO管理页面
管理页面的访问地址为:
http://<服务器IP地址>:9001
项目配置
配置流程
- 配置xml
- 创建Minio属性类
- 创建Minion配置类
1.xml配置
minio:
endpoint: <ip地址:端口>
access-key: ${MINIO_ACCESS_KEY}
secret-key: ${MINIO_SECRET_KEY}
bucket-name: lease2.创建Minio类
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
}3.创建Minio配置类
@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();
}
}文件上传实现
判断桶是否存在
boolean bucketExists =minioClient.bucketExists( BucketExistsArgs.builder().
bucket(minioProperties.getBucketName()).
build());创建存储桶
if (!bucketExists) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());
}设置存储策略
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(minioProperties.getBucketName()).config(createBucketPolicyConfig(minioProperties.getBucketName())).build());存储策略
Statement字段: 定义策略规则
Action字段: 读取对象动作
Effect字段: 允许
Principal: 所有用户
Resource字段:存储桶的ARN格式字符串 其中 %s为桶实际名称 , /*为桶中所有对象
Version字段: 指定AWS策略语言版本
bucketName对应Resource中%s
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指定为唯一)
String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();上传文件
minioClient.putObject(PutObjectArgs.builder().
bucket(minioProperties.getBucketName()).
object(filename).
stream(file.getInputStream(), file.getSize(), -1).
contentType(file.getContentType()).build());返回URL
return String.join("/", minioProperties.getEndpoint(), minioProperties.getBucketName(), filename);