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"
相关推荐
工业3D_大熊24 分钟前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc176727 分钟前
docker 相关命令
java·docker·jenkins
CP-DD32 分钟前
Docker 容器化开发 应用
运维·docker·容器
Stark-C35 分钟前
万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统
macos·docker·策略模式
微信-since811921 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
吴半杯3 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
今天我刷leetcode了吗3 小时前
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
tcp/ip·docker·电脑
lwprain4 小时前
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
mysql·docker·tomcat
Code_Artist5 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
mengao12345 小时前
centos 服务器 docker 使用代理
服务器·docker·centos