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"
相关推荐
川石课堂软件测试36 分钟前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
追风林8 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
城南vision10 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge10 小时前
Docker篇(Docker Compose)
运维·docker·容器
梦魇梦狸º13 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
鬼才血脉14 小时前
docker+mysql配置
mysql·adb·docker
詹姆斯爱研究Java14 小时前
Docker 的基本概念和优势
docker
南猿北者16 小时前
docker镜像仓库常用命令
运维·docker·容器
杨浦老苏16 小时前
Docker可视化管理面板DPanel的安装
运维·docker·群晖
航月18 小时前
FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
nginx·docker·mariadb