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"
相关推荐
THMAIL1 小时前
mac M芯片运行docker-desktop异常问题
macos·docker·容器
两点王爷3 小时前
IDEA中springboot项目中连接docker
spring boot·docker·intellij-idea
家庭云计算专家3 小时前
还没用过智能文档编辑器吗?带有AI插件的ONLYOFFICE介绍
服务器·人工智能·docker·容器·编辑器
孤的心了不冷5 小时前
【Docker】CentOS 8.2 安装Docker教程
linux·运维·docker·容器·eureka·centos
头疼的程序员6 小时前
docker学习与使用(概念、镜像、容器、数据卷、dockerfile等)
学习·docker·容器
IT小郭.6 小时前
使用 Docker Desktop 安装 Neo4j 知识图谱
windows·python·sql·docker·知识图谱·database·neo4j
淡水猫.6 小时前
hbit资产收集工具Docker(笔记版)
运维·docker·容器
旧故新长15 小时前
访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
运维·docker·容器
white.tie15 小时前
Docker部署单节点Elasticsearch
elasticsearch·docker·jenkins
haven-85220 小时前
win11安装Joplin Server私有化部署(docker)
运维·docker·容器