简介
minio 是一款基于Go语言的高性能对象存储服务,可以方便的私有化部署。虽然现在诸如亚马逊 S3、阿里云 OSS 等使用很方便,但是在应对一些大量文件数据的本地化处理时使用私有化的对象存储无疑是一个更好的选择(这里需要注意的是 minio 的许可是基于GNU AGPLv3 如果商用需要注意)。 这里我们将使用单机 Docker 化来部署一个 minio 服务。
部署流程
前置条件
- pve 环境
- Docker 环境
- Treafik
- Portainer
- nps 内网穿透(如无可以忽略)
操作步骤
-
在 docker 所在 VM 创建新的挂载点(挂载新的磁盘)
-
磁盘挂载成功后创建 minio 相关目录(配置目录和数据目录)
bashcd /mnt/sda2 mkdir minio cd minio # 创建配置目录 mkdir config # 创建数据目录 mkdir data
-
使用 Portainer 或者 docker-compose 部署, yml 配置如下:
关于 api 和 console 地址不一致问题,最初尝试过添加
content path
的方式,比如 console 的 host 配置为:yml"traefik.http.routers.minioc.rule=Host(`minioc.xxx.com`) && PathPrefix(`/console`)"
但是无法访问,报错信息如下:
bashERROR 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 的端口)
yamlversion: "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"
-
部署完成后访问
https://minioc.xxx.com
,默认登录名密码为minioadmin
/minioadmin
注意如果访问
https://minio.xxx.com
默认会重定向到https://minioc.xxx.com:9001
,这里我们需要配置环境变量MINIO_BROWSER_REDIRECT_URL
来指定我们真正的 console 的路径 -
修改默认登录名和密码
需要配置环境变量如下
yamlenvironment: - "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
上传
-
上传文件夹(需要先创建存储桶)
bashmc cp --recursive /root/data/ minio/temp/
-
上传文件
bashmc cp ~/mydata/object.txt minio/temp/object.txt
-
使用 node sdk 操作
bashimport * 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 启动可以使用以下命令:bashpm2 start npm --name "UPLOAD" -- run "run"