跳转到正文
Monster Cone
返回

用 Docker 部署 MinIO:搭建自己的对象存储服务

编辑页面

目前有很多免费的图床服务可以提供给个人使用,但文件类型局限于图片。下面为大家介绍单机版 MinIO 服务部署,适用于个人应用使用。

1. 部署 MinIO

# docker-compose.yaml
version: "3"

services:
  minio:
    image: minio/minio:latest
    container_name: minio
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001" # MinIO 控制台
    environment:
      MINIO_ROOT_USER: xxxx # 更改为你自己的用户名
      MINIO_ROOT_PASSWORD: xxxx # 更改为你自己的密码
      MINIO_SERVER_URL: https://xxx.xxx.com
      MINIO_BROWSER_REDIRECT_URL: https://xxx-console.xxx.com
    volumes:
      - ./data:/data # 数据存储目录
    command: server /data --console-address ":9001" # 启动命令
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 5s
      timeout: 5s
      retries: 5

2. 配置宿主机 nginx

这一步很简单,直接复制然后修改为 docker-compose.yaml 中的域名即可。

server {
    server_name xxx-console.xxx.com;
    ignore_invalid_headers off;
    client_max_body_size 200m;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_pass http://127.0.0.1:9001; # MinIO 控制台默认端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-NginX-Proxy true;
        real_ip_header X-Real-IP;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        chunked_transfer_encoding off;
    }
}

server {
    server_name xxx.xxx.com;
    ignore_invalid_headers off;
    client_max_body_size 200m;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_pass http://127.0.0.1:9000; # MinIO API默认端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
    }
}

注意: http 还是 https 需要视自己情况调整,我这里 nginx 使用了插件配置证书,所以没有 listen 443;

3. 配置 MinIO

创建存储桶

到这一步,我们已经可以通过上面的https://xxx-console.xxx.com域名访问到控制台了。如下:

image

在登录后,我们可以通过菜单栏 Buckets -> Create Bucket 创建一个存储桶。

image

公共访问权限

然后我们配置访问权限,Buckets -> 刚刚创建的存储桶 -> Anonymous

image

该规则表示任何人都可以访问这个存储桶的文件,仅可以上传带有 upload 前缀的文件,如果你不想匿名人上传可以删除 upload 这条规则。

API 上传 Token

创建 Access Key

image

你需要记住 Access Key 和 Secret Key,后续不能再查看了,忘记只能重新创建

4.后端通过 Access Key 创建预上传 URL,提供给客户端上传

通过 MinIO 提供的 SDK,使用生成的 Access Key 和 Secret Key 调用接口即可。这里使用 Node SDK 做示范。

const dotenv = require("dotenv");
const Minio = require("minio");

const envFile = process.env.NODE_ENV ? `.env.${process.env.NODE_ENV}` : ".env";
dotenv.config({ path: envFile });

const minioClient = new Minio.Client({
  endPoint: "xxx.xxx.co", // 之前配置的api域名
  port: 443, // https 443  http 80
  useSSL: true, // 是否使用HTTPS
  accessKey: process.env.MINIO_ACCESS_KEY, // 上一步生成的Access Key
  secretKey: process.env.MINIO_SECRET_KEY, // 上一步生成的Secret Key
});

const presignedUrl = await minioClient.presignedPutObject(
  "bucketName",
  `objectName`,
  expiry
);

presignedPutObject 接受三个参数

5. 使用 presignedUrl 上传文件

推荐使用 Postman 测试,然后用 Postman 转换为相关的代码。如下所示:

image

需要注意的一点是 body 必须是 binary 类型,否则可能响应码为 200,但文件并不在存储桶中。


编辑页面
分享这篇文章:

上一篇
移动端适配方案对比:REM 和 VW 到底怎么选
下一篇
Vue 3 自定义指令实战:封装通用 v-loading