Bootstrap

【CentOS7】MiniO对象存储利用宝塔面板对SSL配置

MiniO简介:

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

〇、背景:

MiniO对象存储服务看起来跟阿里的OSS很像,前段时间在阿里的ECS上部署了一下,用起来感觉还不错,但是这在阿里ECS上部署会收费!经过仔细研究会产生一个叫做按量付费的服务,虽然钱不多,但是每天都有邮件提醒甚是不爽!每天凌晨都会发送扣费信息。无奈,还是在自建服务器上进行搭建吧。

在这里插入图片描述


准备工作:
1、宝塔面板 7.6.0 (已安装Nginx 1.20.1、Docker 3.6)
2、二级域名
3、SSL证书(oss.pem、oss.key)


一、Docker中拉取minio镜像

docker pull minio/minio

二、启动docker MiniO服务

docker run -d -v \
   /www/wwwroot/minio/data/usb/minio:/www/wwwroot/minio/data/usb/minio \
  -p 9000:9000 \
  -e "MINIO_ROOT_USER=账号" \
  -e "MINIO_ROOT_PASSWORD=密码" \
  minio/minio server /www/wwwroot/minio/data/usb/minio

此时访问ip:9001就能访问了
在这里插入图片描述

进入之后可以添加存储桶,上传文件

三、Nginx配置SSL

在宝塔的软件商店,找到已安装软件,找到Nginx(如下图),点击设置
在这里插入图片描述

选择配置修改
在这里插入图片描述

把以下配置加进去
注意:SSL证书key和pem需要自定义路径,我放到了/www/server/nginx/conf/cert/目录下

server{
    listen 9001 ssl;
    server_name 你的域名;
    ssl_certificate  /www/server/nginx/conf/cert/oss.pem;
    ssl_certificate_key  /www/server/nginx/conf/cert/oss.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://localhost:9000;
        proxy_set_header  Host       $host;
        proxy_set_header  X-Real-IP    $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

重启Nginx,此时再次访问你的域名,就是以Https安全协议访问了
在这里插入图片描述

四、MiniO在Springboot中的使用

1、POM引入minio

<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
   <groupId>io.minio</groupId>
   <artifactId>minio</artifactId>
   <version>8.2.2</version>
</dependency>

2、application.properties的配置

#minio配置
minio.endpoint=http://你的域名
minio.port=80
minio.accessKey=账号
minio.secretKey=密码
minio.secure=false
minio.bucketName=存储桶名称
minio.configDir=/www/wwwroot/minio/data/usb/minio/

VARIFY_PATH=/www/wwwroot/minio/data/usb/minio/minio/varifycode/
VARIFY_URL=http://域名/minio/varifycode/

3、MinioConfig配置类

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
* @Title:
* @Description:
* @author:real
* @Date: 2021/6/25 9:03
* @Version: 1.0
*/
@Configuration
public class MinioConfig{
    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.port}")
    private int port;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.secure}")
    private Boolean secure;
    @Value("${minio.bucketName}")
    private String bucketName;


    @Bean
    public MinioClient getMinioClient() {
        MinioClient minioClient = MinioClient.builder().endpoint(endpoint, port, secure)
                .credentials(accessKey, secretKey)
                .build();
        return minioClient;
    }
}

4、MinioService

import org.springframework.web.multipart.MultipartFile;


/**
* @Title:
* @Description:
* @author: real
* @Date: 2021/6/25 13:38
* @Version: 1.0
*/
public interface MinioService {
    boolean isExitBucket(String bn);
    void putObject(MultipartFile multipartFile,String date);
}

5、MinioServiceImpl



import io.minio.BucketExistsArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import top.count.service.MinioService;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;


/**
* @Title:
* @Description:
* @author: real
* @Date: 2021/6/25 13:39
* @Version: 1.0
*/
@Service
public class MinioServiceImpl implements MinioService {


    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucketName}")
    private String bucketName;


    @Override
    public boolean isExitBucket(String bn) {
        try {
            return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bn).build());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }


    @Override
    public void putObject(MultipartFile multipartFile,String date) {
        try {
            String fileName = UUID.randomUUID().toString().replace("-","") + "." + getSuffix(multipartFile.getOriginalFilename());
            String finalPath = date + "/" + fileName;


            minioClient.putObject(PutObjectArgs.builder()
                    .stream(multipartFile.getInputStream(), multipartFile.getSize(),PutObjectArgs.MIN_MULTIPART_SIZE)
                    .object(finalPath)
                    .contentType(multipartFile.getContentType())
                    .bucket(bucketName)
                    .build());
            System.out.println("文件已上传!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取文件后缀
     * @param fileName
     * @return
     */
    protected static String getSuffix(String fileName) {
        int index = fileName.lastIndexOf(".");
        if (index != -1) {
            String suffix = fileName.substring(index + 1);
            if (!suffix.isEmpty()) {
                return suffix;
            }
        }
        throw new IllegalArgumentException("非法文件名称:"  + fileName);
    }
}

五、以上就是MiniO的总结,备忘

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;