MinIO 是一个开源的对象存储服务,旨在为 Cloud Native 应用程序提供高性能、可扩展和易于部署的存储解决方案。它兼容 Amazon S3 API,可以用作替代传统的文件存储系统或云服务提供商。MinIO 可以在公有云、私有云和混合云中运行。

• 性能优越:MinIO 基于 Go 语言编写,利用现代硬件架构进行了优化,在大规模数据存储时具有出色的吞吐量和低延迟。

• 高度可扩展:通过分布式设计和水平扩展机制,MinIO 允许用户根据需求轻松地增加节点数量以实现更大的容量和更高的负载处理能力。

• 安全可靠:支持数据加密输与保护功能,同时 MinIO 的设计理念是为了确保数据持久性及一致性。

• 易于部署:MinIO 提供简单直观且易于集成的接口,并且拥有详细文档指导用户完成安装配置过程。

安装

推荐使用docker,使用docker部署minio非常简单,首先拉取镜像docker pull bitnami/minio,等待拉取完毕之后启动容器即可。

启动容器推荐挂载卷目录,以防止容器崩溃时数据丢失

$ docker volume create minio_volume
minio_volume
$ docker run -d --name minio \
    --publish 9000:9000 \
    --publish 9001:9001 \
    --env MINIO_SERVER_URL="http://100.125.188.135:9000" \
    --volume minio_volume:/bitnami/minio/data: \
    bitnami/minio:latest

这里先创建docker卷,然后将卷挂载到容器,如果直接挂载宿主机目录的话会报错权限错误,要查看实际绑定的位置可以使用命令docker volume inspect minio_volume。这里还指定了服务的hostname,这里主要影响控制台shared文件时生成的链接。

使用

使用9001端口(或者映射的其它端口)打开MinIO应用,如果没有手动设置密码,使用默认的密码登陆(minio/miniosercret)后即可进入主界面。

创建存储桶

在Buckets菜单下创建第一个存储桶,如图所示

image-20240505132259289

访问控制

常见的访问控制有三种:私有读写、公有读写、公有读私有写。

设置私有读写,只需要在桶管理将访问策略设置为Private即可

image-20240505133940919

设置私有读写的存储痛不可以通过文件路径直接访问对象,需要携带一些参数来访问,否则会被拦截

image-20240505134154990

公有读写是一样的,将访问策略置为Public即可,此时通过文件路径访问不再受限制

image-20240505134533098

设置供公有读私有写,仅需在公有读写的基础上设置匿名访问为只读即可(安全性高,推荐)

image-20240505135202072

AKSK

AKSK(Access Key 和 Secret Key)是一种常用的身份验证和访问控制方法,在云计算、API 接口等领域中经常使用 AKSK 进行身份认证和权限管理。

MinIO 也支持通过 AKSK 使用OpenAPI来对存储桶或者对象来进行操作,在Access Keys菜单下创建一个新的Key

image-20240505163917003

Secret Key只有在创建时可见,后续无法查看,一定要保存好,后续我们可以使用这组AKSK进行SDK的连接。

OpenAPI

调用MinIO 的OpenAPI需要使用官方提供的SDK,有C++、Java、Python、Go、.Net等等,这里我们选择JavaScript来进行测试。

将使用MidwayJS作为环境进行测试,具体初始化方法可以参见官方文档。

如果你也喜欢使用Midway作为NodeJS的Web框架的话,可以通过通用组件midwayjs-minio来进行minio的API操作,如果可以给个star的话不胜感激😚。

在启动文件中引入MinIO组件,在配置文件中添加MinIO的连接配置,这里传入的配置即为MinIO JavaScript SDK需要的配置。

import { MidwayConfig } from '@midwayjs/core';

export default {
  // use for cookie sign key, should change to your own and keep security
  keys: '1715356861596_8605',
  koa: {
    port: 7001,
  },
  minIO: {
    client: {
      endPoint: '100.125.188.135',
      port: 9000,
      useSSL: false,
      accessKey: '5ED6NAyJDQ3ztr8Yc',
      secretKey: 'paHkVVo6EbuBZltJy0yDSN5LggQe9uGBgjw',
    },
  },
} as MidwayConfig;

然后根据API 文档进行调用即可,如listBukcets接口可以这样使用,一个minIOService就是一个MinIO Client实例。

import { Inject, Controller, Get } from '@midwayjs/core';
import { Context } from '@midwayjs/koa';
import { MinIOService } from '@feng-j/midwayjs-minio';

@Controller('/api')
export class APIController {
  @Inject()
  ctx: Context;

  @Inject()
  minIOService: MinIOService;

  @Get('/buckets')
  async getBuckets() {
    const data = await this.minIOService.listBuckets();
    
    return {
      success: true,
      message: 'OK',
      data,
    };
  }
}

更多接口可以见JavaScript Client API Reference

这里着重说一下访问策略,这个在控制台自定义策略和API控制都非常有用。先通过API获取一下之前的存储桶的访问策略JSON.parse(await this.minIOService.getBucketPolicy('my-bucket'))

image-20240512220319388

可以看到很多字段,其实这些字段从名称都可以看出含义

参数 说明
Statement 策略授权语句,描述策略的详细信息,包含Effect(效果)、Action(动作)、Principal(用户)、Resource(资源)
Action Action(动作)对资源的具体操作权限,格式为:服务名:资源类型:操作,支持单个或多个操作权限,支持通配符号*,通配符号表示所有。例如 s3:GetObject ,表示获取对象
Effect Effect(效果)作用包含两种:Allow(允许)和Deny(拒绝),系统预置策略仅包含允许的授权语句,自定义策略中可以同时包含允许和拒绝的授权语句,当策略中既有允许又有拒绝的授权语句时,遵循Deny优先的原则。
Resource Resource(资源)策略所作用的资源,支持通配符号,通配符号表示所有。在JSON视图中,不带Resource表示对所有资源生效。Resource支持以下字符:-_0-9a-zA-Z./\,如果Resource中包含不支持的字符,请采用通配符号。例如:arn:aws:s3:::my-bucketname/myobject\,表示minio中my-bucketname/myobject目录下所有对象文件。
Version 标识策略的版本号,Minio中一般为 “2012-10-17”
Principal Principal(委托人)允许访问语句中的操作和资源的账户或用户。在存储桶策略中,委托人是作为此权限的接收者的用户、账户、服务或其他实体。

前端小白