Skip to content

使用 minio

Docker 运行 MinIO

1. 前置条件

  • 已经安装 Docker
  • 服务器/电脑上有空余端口(默认 MinIO 用 9000 和 9001)

2. 拉取 MinIO 镜像

推荐使用官方镜像:

bash
docker pull minio/minio

3. 启动 MinIO 容器

运行一个 MinIO 容器并映射端口:

bash
docker run -d --name minio -p 9000:9000 -p 9001:9001 \
    -e "MINIO_ROOT_USER=admin" \
    -e "MINIO_ROOT_PASSWORD=admin123" \
    -e "MINIO_SERVER_URL=http://<你的公网IP或域名>:9000" \
    -v /home/minio/data:/data \
    -v /home/minio/config:/root/.minio \
    minio/minio server /data --console-address ":9001"

参数说明

  • --name minio: 容器名
  • -p 9000:9000: API端口(存储服务)
  • -p 9001:9001: Web 控制台端口
  • -e MINIO_ROOT_USER=admin: 登录用户名(自己设定)
  • -e MINIO_ROOT_PASSWORD=admin123: 登录密码(至少8位)
  • -e MINIO_SERVER_URL=http://<你的公网IP或域名>:9000: 分享的链接的网址
  • -v /home/minio/data:/data: 持久化存储路径
  • -v /home/minio/config:/root/.mino: 配置持久化
  • -v server /data --console-address ":9001": 指定数据目录和控制台端口

4. 访问 MinIO

启动成功后:

  • API 地址: http://localhost:9000
  • Web 控制台: http://localhost:9001

admin / admin123 登录

5. 创建存储桶(bucket)

登录 Web 控制台 -> Buckets -> Create bucket -> 输入名称 -> 创建。 之后就可以通过 API 或 SDK 上传下载文件了。

6. docker-compose 方式

yaml
version: '3.8'
services:
  minio:
    image: minio/minio
    container_name: minio
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: admin123
      MINIO_SERVER_URL: http://<你的公网IP或域名>:9000
    volumes:
      - ./data:/data
      - ./config:/root/.minio
    command: server /data --console-address ":9001"

运行:

bash
docker-compose up -d

7. Nginx 反向代理

在生成环境,不建议直接用 IP:9000,而是配域名:

  1. 在云服务器买个域名,比如 minio.yourdomain.com
  2. 用 Nginx 做反向代理:
nginx
server {
    listen 80;
    server_name minio.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}
  1. 这样访问 http://minio.yourdomain.com 就能用域名

安全提示

  • MinIO 默认生成的公开链接, 如果 bucket 是 public,任何人都能下载;如果 bucket 是 private,就需要临时签名 URL 才能访问。

  • 如果你打算分享文件,最好用 Presigned URL, 比如 Node.js SDK 里可用生成带时效的链接。

🔑 MinIO 常用环境变量清单

1. 用户认证

变量说明示例是否必需
MINIO_ROOT_USER管理员账号(原 Access Keyadmin✅ 必须
MINIO_ROOT_PASSWORD管理员密码(原 Secret Key,≥8位)admin123✅ 必须

2. 服务地址

变量说明示例是否必需
MINIO_SERVER_URL对外暴露地址,用于生成分享链接http://example.com:9000可选
MINIO_BROWSER是否启用 Web 控制台(默认 on)on / off可选

3. 存储设置

变量说明示例是否必需
MINIO_VOLUMES数据目录(等价于命令行参数 server /data/data可选(推荐命令行指定)
MINIO_PROMETHEUS_AUTH_TYPEPrometheus 监控认证方式public / jwt可选

4. TLS/安全

变量说明示例
MINIO_CERT_PASSWDTLS 私钥密码yourpassword
MINIO_UPDATE自动更新设置off

📌 docker-compose 示例

yaml
version: '3.8'
services:
  minio:
    image: minio/minio
    container_name: minio
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: admin123
      MINIO_SERVER_URL: http://your-domain.com:9000
      MINIO_BROWSER: "on"
    volumes:
      - ./data:/data
      - ./config:/root/.minio
    command: server /data --console-address ":9001"

👉 这样配置好后:

  • 登录账号密码:admin / admin123
  • Web 控制台:http://your-domain.com:9001
  • 文件分享链接:会自动用 http://your-domain.com:9000

Node.js 上传到 MinIO

1. 安装

bash
npm install minio

2. 代码示例

js
const Minio = require('minio')
const fs = require('fs')

// 1. 创建客户端
const minioClient = new Minio.Client({
  endPoint: '127.0.0.1',   // MinIO 地址
  port: 9000,              // MinIO 端口
  useSSL: false,           // 如果用了 https 就 true
  accessKey: 'minioadmin', // 账号
  secretKey: 'minioadmin'  // 密码
})

// 2. 上传文件
async function uploadFile() {
  const bucketName = 'mybucket'
  const objectName = 'test.jpg'
  const filePath = './test.jpg'

  try {
    // 检查桶是否存在
    const exists = await minioClient.bucketExists(bucketName).catch(() => false)
    if (!exists) {
      await minioClient.makeBucket(bucketName, 'us-east-1')
      console.log(`Bucket '${bucketName}' created.`)
    }

    // 上传文件
    await minioClient.fPutObject(bucketName, objectName, filePath, {
      'Content-Type': 'image/jpeg'
    })
    console.log('上传成功:', objectName)
  } catch (err) {
    console.error('上传失败:', err)
  }
}

uploadFile()

前端上传文件思路

👌 明白了,你要做的是:

👉 前端(浏览器/小程序等)直接上传文件到 MinIO,而不是先传到 Node.js 服务器再转存。

这种场景推荐用 预签名 URL(Presigned URL),流程是:

  1. 前端请求你的 Node.js 后端,告诉它“我要上传一个文件,比如 test.jpg”。
  2. 后端用 MinIO SDK 生成一个带签名的上传 URL(有效期几分钟)。
  3. 前端拿到这个 URL,直接用 fetch / axios / uni.uploadFile 等方式上传文件到 MinIO。

这样好处:

  • 文件不走你的服务器,直接进 MinIO,更省流量。
  • 你可以控制上传权限和时间。

🔹后端(Node.js + Express 示例)

先装依赖:

bash
npm install minio express

代码 server.js

js
const express = require('express')
const Minio = require('minio')

const app = express()
app.use(express.json())

// 创建 MinIO 客户端
const minioClient = new Minio.Client({
  endPoint: '你的公网IP或域名', // 比如 123.45.67.89
  port: 9000,
  useSSL: false,              // 如果用 https 就 true
  accessKey: 'minioadmin',
  secretKey: 'minioadmin'
})

// 获取上传 URL
app.post('/get-upload-url', async (req, res) => {
  const { bucketName, objectName } = req.body

  try {
    // 确保桶存在
    const exists = await minioClient.bucketExists(bucketName).catch(() => false)
    if (!exists) {
      await minioClient.makeBucket(bucketName, 'us-east-1')
    }

    // 生成预签名 URL(PUT 上传)
    const url = await minioClient.presignedPutObject(bucketName, objectName, 60 * 5) // 5分钟有效
    res.json({ success: true, url })
  } catch (err) {
    console.error(err)
    res.status(500).json({ success: false, error: err.message })
  }
})

app.listen(3000, () => {
  console.log('Server running at http://localhost:3000')
})

🔹前端(以 Vue/uniapp 为例)

调用后端接口拿 URL:

js
// 获取预签名 URL
const res = await fetch('http://你的后端:3000/get-upload-url', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    bucketName: 'mybucket',
    objectName: 'test.jpg'
  })
})
const { url } = await res.json()

// 直接上传文件到 MinIO
await fetch(url, {
  method: 'PUT',
  body: file, // file = 浏览器里 <input type="file"> 选中的文件
  headers: {
    'Content-Type': file.type
  }
})

console.log('上传成功!')

这样前端直接传到 MinIO,不占用你 Node.js 的带宽。 ✔️ 适合 Web、uniapp、小程序。 ✔️ 链接是临时的,不怕乱传。