使用 minio
Docker 运行 MinIO
1. 前置条件
- 已经安装 Docker
- 服务器/电脑上有空余端口(默认 MinIO 用 9000 和 9001)
2. 拉取 MinIO 镜像
推荐使用官方镜像:
bash
docker pull minio/minio3. 启动 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 -d7. Nginx 反向代理
在生成环境,不建议直接用 IP:9000,而是配域名:
- 在云服务器买个域名,比如
minio.yourdomain.com - 用 Nginx 做反向代理:
nginx
server {
listen 80;
server_name minio.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:9000;
}
}- 这样访问
http://minio.yourdomain.com就能用域名
安全提示
MinIO 默认生成的公开链接, 如果 bucket 是 public,任何人都能下载;如果 bucket 是 private,就需要临时签名 URL 才能访问。
如果你打算分享文件,最好用 Presigned URL, 比如 Node.js SDK 里可用生成带时效的链接。
🔑 MinIO 常用环境变量清单
1. 用户认证
| 变量 | 说明 | 示例 | 是否必需 |
|---|---|---|---|
MINIO_ROOT_USER | 管理员账号(原 Access Key) | admin | ✅ 必须 |
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_TYPE | Prometheus 监控认证方式 | public / jwt | 可选 |
4. TLS/安全
| 变量 | 说明 | 示例 |
|---|---|---|
MINIO_CERT_PASSWD | TLS 私钥密码 | 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 minio2. 代码示例
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),流程是:
- 前端请求你的 Node.js 后端,告诉它“我要上传一个文件,比如
test.jpg”。 - 后端用 MinIO SDK 生成一个带签名的上传 URL(有效期几分钟)。
- 前端拿到这个 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、小程序。 ✔️ 链接是临时的,不怕乱传。