前言
业务开发、内网文件/图片存储经常需要自建对象存储OSS,主流开源方案各有优劣。本文对比四款常用轻量S3兼容OSS,提供MinIO、RustFS标准Docker Compose配置,并以RustFS完整演示:创建桶、业务用户、服务密钥、权限策略、图片公开访问全流程。
一、四款开源轻量OSS横向对比
| 项目 | 开发语言 | Web可视化IAM(用户/密钥) | S3兼容性 | 内存占用 | 开源协议 | 核心优缺点 | 适用场景 |
|---|---|---|---|---|---|---|---|
| MinIO(社区单机新版) | Go | ❌ 单机无Web用户管理,只能命令行mc操作 | 100%完整S3 | 中等 | AGPLv3 | 生态最强、功能齐全;单机Web砍掉用户面板,操作繁琐;商用分发有协议约束 | 能接受命令行、成熟生产集群、海量存储 |
| MinIO(旧版 2025.04) | Go | ✅ 完整可视化用户/策略面板 | 100%完整S3 | 中等 | AGPLv3 | 操作直观,后台直接管理账号;版本老旧缺少安全更新 | 开发测试、不想敲命令临时使用 |
| RustFS | Rust | ✅ 完整Web IAM,单机保留全部用户管理功能 | 100%兼容S3 SDK | 极低(无GC卡顿) | Apache2.0 | 后台可视化管理账号,低配机器流畅,商用无协议限制;新兴项目,大规模集群案例少于MinIO | 中小型业务、图片附件存储、内网私有OSS、讨厌命令行操作 |
| SeaweedFS | Go | ⚠️ 用户权限配置复杂,Web面板简陋 | 完整S3网关 | 低 | Apache2.0 | 海量小文件性能极强;权限体系复杂,上手门槛高 | 日志、千万级图片素材存储 |
选型总结
- 追求可视化后台管理用户、不想敲命令、中小型业务:首选 RustFS
- 必须大规模分布式集群、追求多年成熟生态:选 MinIO
- 海量小文件、日志存储:选 SeaweedFS
二、Docker Compose 部署配置文件(默认端口、默认账号密码)
2.1 MinIO 旧版(带Web用户管理面板)docker-compose.yml
默认端口:9000(S3接口)、9001(后台) 默认管理员账号:admin / Minio@123456
services:
minio:
image: minio/minio:RELEASE.2025-04-22T15-44-28Z
container_name: minio
restart: unless-stopped
ports:
- "9000:9000"
- "9001:9001"
environment:
TZ: Asia/Shanghai
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: Minio@123456
volumes:
- ./minio-data:/data
- /etc/localtime:/etc/localtime:ro
command: server /data --console-address ":9001"
deploy:
resources:
limits:
memory: 1G
启动命令
docker compose down
sudo chmod 777 ./minio-data
docker compose up -d
2.2 RustFS 稳定版 docker-compose.yml(无多余日志报错、默认端口)
默认端口:9000(S3接口)、9001(后台) 默认管理员账号:admin / Rust@123456
services:
rustfs:
image: rustfs/rustfs:latest
container_name: rustfs
restart: unless-stopped
user: root
ports:
- "9000:9000"
- "9001:9001"
environment:
TZ: Asia/Shanghai
RUSTFS_ACCESS_KEY: admin
RUSTFS_SECRET_KEY: Rust@123456
RUSTFS_CONSOLE_ENABLE: "true"
RUSTFS_CONSOLE_ADDRESS: ":9001"
RUSTFS_EC_DISABLE: "true"
RUSTFS_TLS_VERIFY_DISABLE: "true"
volumes:
- ./rustfs-data:/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
deploy:
resources:
limits:
memory: 1G
启动命令
docker compose down
sudo chmod 777 ./rustfs-data
docker compose up -d
# 查看实时日志
docker compose logs -f rustfs
三、RustFS 完整实操教程(默认端口、默认管理员账号)
基础访问信息
- Web管理后台地址:
http://服务器IP:9001 - S3程序调用接口地址:
http://服务器IP:9000 - 管理员账号:admin | 密码:Rust@123456
步骤1:登录管理后台
浏览器打开 http://服务器IP:9001,输入管理员账号密码登录。
步骤2:创建图片专用存储桶(Bucket)
桶等价于oss根目录,S3桶名强制规范:仅小写字母、数字、短横线 -,禁止中文、大写、下划线
- 左侧菜单点击
Buckets - 右上角
Create Bucket - Bucket Name 输入:
img-store - 其余参数保持默认,点击
Create
步骤3:创建权限策略(限制用户仅能操作img-store桶)
最小权限原则,业务用户只允许读写图片桶,无法访问其他存储资源
- 左侧菜单
Identity→Policies - 右上角
Create Policy - Policy Name:
only-img-store - Policy 策略文本完整复制:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::img-store",
"arn:aws:s3:::img-store/*"
]
}
]
}
- 点击保存策略。
步骤4:创建业务普通用户(可登录后台,可作为AK/SK调用接口)
用于后台人工查看文件,同时可直接作为SDK鉴权凭证
- 左侧
Identity→Users - 右上角
Create User - 填写表单:
- Access Key:
img-user - Secret Key:
Img@123654 - Status:Enabled
- Groups:留空
- Policies:勾选刚刚创建的
only-img-store
- Access Key:
- 底部点击
Save
该用户凭证:AK=img-user,SK=Img@123654,仅能操作img-store桶
步骤5:创建Service Account服务密钥(线上业务推荐API Key)
服务密钥无法登录后台,仅用于后端程序上传下载;密钥泄露可单独删除,不影响用户账号,生产环境优先使用。
Identity→Users,点击用户img-user进入详情页- 找到
Service Accounts模块,点击Create Service Account - 名称填写
backend-img-api,无需额外配置策略(继承用户权限) - 点击创建,立刻复制保存 Access Key / Secret Key
关闭弹窗后Secret Key永久无法查看,务必备份
步骤6:配置桶公开只读(图片浏览器直接访问,无需签名)
默认上传文件需要签名URL才能访问,图片业务通常开启匿名只读:
- 左侧
Buckets,点击img-store桶进入详情 - 找到
Bucket Policy选项 - 填入公开只读策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::img-store/*"
}
]
}
- 保存策略。
步骤7:文件访问地址格式
上传文件 avatar/001.jpg 后,直接浏览器访问地址:
http://服务器IP:9000/img-store/avatar/001.jpg
四、基础测试示例(Python SDK验证上传)
安装依赖
pip install minio
测试代码
from minio import Minio
# S3接口地址 9000端口,不要填后台9001
client = Minio(
"你的服务器IP:9000",
access_key="img-user",
secret_key="Img@123654",
secure=False
)
# 上传本地图片到oss
client.fput_object(
bucket_name="img-store",
object_name="avatar/test.jpg",
file_path="./test.jpg"
)
print("图片上传成功")
五、常见踩坑说明
- 端口区分:9000=程序S3接口,9001=网页管理后台,调用接口不要混用端口
- 桶名报错 InvalidBucketName:桶名只能小写、数字、短横线
- 权限不足:创建用户必须绑定自定义单桶策略,不要使用admin全局权限
- 图片无法直接打开:未配置Bucket Policy公开只读策略
- 目录权限报错:启动前执行
sudo chmod 777 ./rustfs-data授权数据卷

评论