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"
相关推荐
CodeDevMaster12 小时前
关于PaddleOCR-VL部署与使用说明
docker·llm
Ghost Face...14 小时前
龙芯Docker全流程:安装到离线迁移实战
java·docker·eureka
程序员黑豆15 小时前
深入解析Java数据类型:基本类型与引用类型的本质区别与实战选择
前端·ai编程·全栈
JavaPub-rodert17 小时前
我又把自己的 Go 后台管理系统升级了一遍:文件管理、2GB 上传、私有文件预览、Docker 镜像全安排上了
开发语言·docker·golang·shiyuadmin
爱码少年17 小时前
嗯,腾讯云个人小站Docker镜像下载功能已下线,压力给到阿里云镜像站
docker
Zhu75817 小时前
在docker环境部署frp
运维·docker·容器
前端双越老师19 小时前
前端学习 Java 其实很容易:TS 和 Java 语法的 N 个相同点
java·全栈
燐妤20 小时前
腾讯云 Ubuntu 24.04 + Docker 同时部署多个 Python Web 项目:没有域名也能用 IP 访问
ubuntu·docker·腾讯云
承渊政道21 小时前
飞牛NAS部署Immich:搭建家庭相册并实现远程访问
运维·服务器·docker·内网穿透·cpolar·nas·immich
ruofu3321 小时前
如何让docker使用提前下载好的镜像,而不是在线拉取
java·spring cloud·docker