DevOps笔记 - 搭建私有化的对象存储 minio

简介

​ minio 是一款基于Go语言的高性能对象存储服务,可以方便的私有化部署。虽然现在诸如亚马逊 S3、阿里云 OSS 等使用很方便,但是在应对一些大量文件数据的本地化处理时使用私有化的对象存储无疑是一个更好的选择(这里需要注意的是 minio 的许可是基于GNU AGPLv3 如果商用需要注意)。 ​ 这里我们将使用单机 Docker 化来部署一个 minio 服务。

部署流程

前置条件

  • pve 环境
  • Docker 环境
  • Treafik
  • Portainer
  • nps 内网穿透(如无可以忽略)

操作步骤

  1. 在 docker 所在 VM 创建新的挂载点(挂载新的磁盘)

  2. 磁盘挂载成功后创建 minio 相关目录(配置目录和数据目录)

    bash 复制代码
    cd /mnt/sda2
    
    mkdir minio
    
    cd minio
    
    # 创建配置目录
    mkdir config
    # 创建数据目录
    mkdir data
  3. 使用 Portainer 或者 docker-compose 部署, yml 配置如下:

    关于 api 和 console 地址不一致问题,最初尝试过添加content path 的方式,比如 console 的 host 配置为:

    yml 复制代码
    "traefik.http.routers.minioc.rule=Host(`minioc.xxx.com`) && PathPrefix(`/console`)"

    但是无法访问,报错信息如下:

    bash 复制代码
    ERROR Invalid MINIO_BROWSER_REDIRECT_URL value is environment variable: URL contains unexpected resources, expected URL to be of http(s)://minio.example.com format: https://minioc.xxx.com/console

    只能支持根域名,不支持 context path 的方式,所以改到了如下配置,api 和 console 使用不同的域名(注意:这里暴露了两个端口,每个域名 http 和 https 绑定的端口必须指定,否则会默认查找应用第一个 expose 的端口)

    yaml 复制代码
    version: "3"
    
    networks:
      traefik:
        external: true
    
    services:
      server:
        image: minio/minio:RELEASE.2023-10-16T04-13-43Z
        container_name: minio
    
        restart: always
        
        command: minio server /data --console-address ":9001"
    
        volumes:
          - "/etc/localtime:/etc/localtime"
          - "/mnt/sda2/minio/data:/data"
          - "/mnt/sda2/minio/config:/root/.minio"
        ports:
          - "8101:9001"
          - "8100:9000"
        networks:
          - "traefik"
        environment:
          - "MINIO_ROOT_USER=xxx"
          - "MINIO_ROOT_PASSWORD=xxx"
          - "MINIO_BROWSER_REDIRECT_URL=https://minioc.xxx.com"
          
        healthcheck:
          test: ["CMD-SHELL", "curl -f localhost:9001 || exit 1"]
        labels:
          - "traefik.enable=true"
          
          # 设置HTTP强制跳转HTTPS 中间件
          - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
          
          # HTTP配置
          # --- api
          - "traefik.http.routers.minio.entrypoints=web"
          - "traefik.http.routers.minio.rule=Host(`minio.xxx.com`)"
          - "traefik.http.routers.minio.service=minio"
          - "traefik.http.services.minio.loadbalancer.server.port=9000"
    
          # --- console
          - "traefik.http.routers.minioc.entrypoints=web"
          - "traefik.http.routers.minioc.rule=Host(`minioc.xxx.com`)"
          - "traefik.http.routers.minioc.service=minioc"
          - "traefik.http.services.minioc.loadbalancer.server.port=9001"
          
          # HTTPS配置
          # --- api
          - "traefik.http.routers.minio-secure.rule=Host(`minio.xxx.com`)"
          - "traefik.http.routers.minio-secure.entrypoints=websecure"
          - "traefik.http.routers.minio-secure.tls=true"
          - "traefik.http.routers.minio-secure.tls.certresolver=le"
          - "traefik.http.routers.minio-secure.service=minio-secure"
          - "traefik.http.services.minio-secure.loadbalancer.server.port=9000"
          
          # --- console
          - "traefik.http.routers.minioc-secure.rule=Host(`minioc.xxx.com`)"
          - "traefik.http.routers.minioc-secure.entrypoints=websecure"
          - "traefik.http.routers.minioc-secure.tls=true"
          - "traefik.http.routers.minioc-secure.tls.certresolver=le"
          - "traefik.http.routers.minioc-secure.service=minioc-secure"
          - "traefik.http.services.minioc-secure.loadbalancer.server.port=9001"
  4. 部署完成后访问 https://minioc.xxx.com,默认登录名密码为minioadmin/minioadmin

    注意如果访问 https://minio.xxx.com 默认会重定向到 https://minioc.xxx.com:9001 ,这里我们需要配置环境变量 MINIO_BROWSER_REDIRECT_URL 来指定我们真正的 console 的路径

  5. 修改默认登录名和密码

    需要配置环境变量如下

    yaml 复制代码
    environment:
          - "MINIO_ROOT_USER=user"
          - "MINIO_ROOT_PASSWORD=pwd"
          - "MINIO_BROWSER_REDIRECT_URL=https://minioc.xxx.com"

使用

这里我们只讲 linux 下的使用

客户端的安装

bash 复制代码
curl https://dl.min.io/client/mc/release/linux-amd64/mc \
  --create-dirs \
  -o $HOME/minio-binaries/mc

chmod +x $HOME/minio-binaries/mc

# 此处最好添加到 bashrc 中
export PATH=$PATH:$HOME/minio-binaries/

mc --help

添加连接

bash 复制代码
mc alias set minio https://minio.xxx.com ACCESS_KEY SECRET KEY

添加完成后使用以下命令测试链接:

bash 复制代码
mc admin info minio

也可以直接编辑配置文件 $HOME/.mc/config.json

上传

  1. 上传文件夹(需要先创建存储桶)

    bash 复制代码
    mc cp --recursive /root/data/ minio/temp/
  2. 上传文件

    bash 复制代码
    mc cp ~/mydata/object.txt minio/temp/object.txt
  3. 使用 node sdk 操作

    bash 复制代码
    import * as Minio from 'minio';
    
    const minioClient = new Minio.Client({
      endPoint: 'xxx',
      port: 9000,
      useSSL: true,
      accessKey: 'ACCESS_KEY',
      secretKey: 'SECRET KEY',
    });
    
    let file = '/tmp/my.pbf';
    
    function upload() {
      const metaData = {
        'Content-Type': 'application/octet-stream',
        example: 5678,
      };
    
      minioClient.fPutObject('bucketName', 'objectName', file, metaData, function (err, etag) {
        if (err) return console.log(err);
        console.log('文件上传成功.');
      });
    }
    
    upload();

    使用 node --loader @swc-node/register src/index.js 启动任务,如果使用 pm2 启动可以使用以下命令:

    bash 复制代码
    pm2 start npm --name "UPLOAD" -- run "run"
相关推荐
dessler34 分钟前
Docker-run命令详细讲解
linux·运维·后端·docker
陌北v11 小时前
Docker Compose 配置指南
运维·docker·容器·docker-compose
阿里嘎多学长2 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
明 庭3 小时前
Ubuntu下通过Docker部署Caddy服务器
服务器·ubuntu·docker
G_whang4 小时前
windos 安装docker
运维·docker·容器
Mitch3114 小时前
【漏洞复现】CVE-2021-45788 SQL Injection
sql·web安全·docker·prometheus·metersphere
运维小文4 小时前
K8S中的PV、PVC介绍和使用
docker·云原生·容器·kubernetes·存储
CYX_cheng5 小时前
Docker挂载
docker
奉孝8 小时前
docker基础
后端·docker
编程、小哥哥8 小时前
在 Docker 中部署 Jenkins,并完成项目的构建和发布
servlet·docker·jenkins