# Minio文件系统安装与服务化

内容简介:Minio是一款跨平台的可「自建」轻量级对象存储服务,只需要一个命令,就能实现可以通过浏览器访问的简易网盘功能。支持本地储存和 AWS S3,最大存储对象 5TB。提供 API 与 SDK,可以和很多服务整合,甚至可以整合到 Android 与 iOS 应用中,使用 Apache License 2.0 协议发布。

https://github.com/minio/minio (opens new window)

https://gitee.com/mirrors/minio (opens new window)

# docker

docker run -p 9000:9000 --name minio \
-e "MINIO_ACCESS_KEY=TEST" \
-e "MINIO_SECRET_KEY=TEST123456" \
-v /mnt/data:/data \
-v /mnt/config:/root/.minio \
minio/minio server /data

# docker-compose

version: '2'
services:
  minio:
    image: minio/minio
    container_name: minio
    environment:
      - TZ=Asia/Shanghai
      - MINIO_ACCESS_KEY=TEST
      - MINIO_SECRET_KEY=TEST123456
    command:
      - server
      - /data
    ports:
      - 9000:9000
    volumes:
      - ./data:/data
      - ./config:/root/.minio

# 安装篇

简单安装

# wget https://dl.minio.io/server/minio/release/linux-amd64/minio
# chmod +x minio
# mv minio /usr/local/bin
# mkdir -p /tmp/minio

通过这个安装之后,在/usr/local/bin目录下面执行这个命令,就能看到输出信息,获得accessKey和secretKey

# minio server /tmp/minio   //后面的是数据目录

# 将Minio设置成服务

# 1、首先需要添加minio用户,以及建一个Minio文件夹

# adduser minio-user
# mkdir /tmp/minio
# chown minio-user:minio-user /tmp/minio

# 2、建立一个配置文件,并更新你的Key值

# vim /etc/default/minio
MINIO_ACCESS_KEY=xxx
MINIO_SECRET_KEY=xxx
MINIO_VOLUMES="/tmp/minio/"
MINIO_OPTS="--address :9000"

# 3、新建一个minio.service 在 /etc/systemd/system

# vim /etc/systemd/system/minio.service
[Unit]
Description=Minio
Documentation=https://docs.minio.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local/

User=minio-user
Group=minio-user

PermissionsStartOnly=true

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "[ -n \"${MINIO_VOLUMES}\" ] || echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\""

ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop Minio
KillSignal=SIGTERM

SendSIGKILL=no

SuccessExitStatus=0

[Install]
WantedBy=multi-user.target

# 5、正式启用和查看状态

# systemctl enable minio.service
# systemctl daemon-reload
# systemctl start minio
# systemctl status minio.service

通过这些步骤,就可以后台运行Minio服务了。

# minio 图片直接访问地址,而不是下载

通过浏览器访问管理页面设置

登录后台管理界面,在右下角有个红色的加号图标,点击create bucket ,输入要创建的bucket,如test. 创建成功之后对bucket进行编辑。在页面的右上角。找到刚刚创建的test bucket。 点击那三个点,选择Edit policy ,在Prefix中输入* ,即允许所有访问。右边的选项选择 Read and write。然后点击Add 按钮就可以了。

通过minio管理客户端mc设置

1、下载客户端程序

下载地址 https://dl.minio.io/client/mc/release/windows-amd64/mc.exe (opens new window)

2、启动一个cmd窗口,进入mc.exe的目录

输入 .\mc.exe --h 可以查看mc.exe的命令帮助。

3、设置服务端

使用 minio client 将自己的 minio server 添加到 mc 的配置管理,命令如下

.\mc.exe config host add minio http://192.168.50.179:9000 3K2287Q20OW3HWQ2FJXJ L0eTMaBzVQwUgbeuo05f+qmSA
buZiWt4yZfDzrMv
Added `minio` successfully.

此命令将 http://192.168.50.179:9000 取一个别名 minio ,并交给mc进行配置管理。

4、查看minio中的桶,命令

.\mc.exe ls minio
[2019-02-18 20:34:25 CST]     0 B asiatrip\
[2019-02-18 21:15:55 CST]     0 B tonnyyy\
[2019-03-28 20:54:28 CST]     0 B xzspfj\

5、设置桶的访问策略,命令

.\mc.exe policy public minio/xzspfj/20190328/
Access permission for `minio/xzspfj/20190328/` is set to `public`

通过以上步骤,图片就可以直接通过地址进行访问了。

# java sdk

MinioClient minioClient new MinioClient("http://127.0.0.1:9000/","minioadmin","minioadmin");
String bucketName = "test"; // 桶名称,相当于根目录,方便设置权限
InputStream inputStream = new ByteArrayInputStream(data); // 上传文件的数据流
boolean exists = minioClient.bucketExists(bucketName); // 判断桶是否存在
if (!exists) minioClient.makeBucket(bucketName); // 不存在则创建桶
minioClient.putObject(bucketName, filename, inputStream, inputStream.available(), contentType); // 上传文件
path = "/" + bucketName + "/" + filename; // 返回上传的路径

# javascript sdk

初始化客户端

this.minioClient = new Minio.Client({
      ...this.options,
      endPoint: 'xxx.xxx.xxx.xxx',
      port: 9000,
      useSSL: false,
      accessKey: 'xxx',
      secretKey: 'xxxx',
    });

makeBucket -新建bucket

this.minioClient.makeBucket(BucketName, 'us-east-1', err => {
        if (err) {
          reject(err);
        } else {
          resolve('success');
        }
      });

bucketExists - 判断bucket是否存在

this.minioClient.bucketExists(BucketName)

putObject - 上传文件

const metaData = {
      'Content-Type': type,
    };
this.minioClient.putObject(
    BucketName,
    fileName,
    file,
    1024,
    metaData,
  );

getObject - 获取上传的文件流

this.minioClient.getObject(BucketName, fileName)

removeObject - 删除文件

this.minioClient.removeObject(BucketName, fileName)