还在用MinIO?这款6k+Star的RustFS开源文件系统到底有多强大
作者:佚名 时间:2025-11-16 06:22
在开发项目的时候,我们经常会遇到需要文件存储的场景,比较流行的解决方案有OSS、MinIO、FastDFS这些。最近有小伙伴反馈MinIO的控制台屏蔽了很多之前已有的功能,就剩下查看的功能。今天给大家分享一款最近刚开源的分布式文件系统RustFS,自带管理控制台,功能很强大!
简介
RustFS是一个基于Rust语言开发的高性能分布式对象存储软件,开源不到一个月就收获了6k+star。与MinIO一样,它具有使用简单、兼容AWS S3协议、开源等优势,它采用Apache开源协议。
RustFS的主要特效如下:
下面是RustFS使用过程中的效果图,功能还是很强大的!

安装
使用Docker来安装RustFS是非常方便的,我们将采用此种方式来安装。
docker pull rustfs/rustfs
docker run -p 9000:9000 --name rustfs \
-e RUSTFS_ACCESS_KEY=rustfsadmin \
-e RUSTFS_SECRET_KEY=rustfsadmin \
-v /mydata/rustfs/data:/data \
-v /etc/localtime:/etc/localtime \
-d rustfs/rustfs

这或许是一个对你有用的开源项目,mall项目是一套基于
SpringBoot3+ Vue 的电商系统(Github标星60K),后端支持多模块和2024最新微服务架构,采用Docker和K8S部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!项目演示:
控制台使用
接下来讲解下RustFS管理控制台的使用,用户界面还是挺友好的!







结合SpringBoot实现文件上传
下面我们就创建一个SpringBoot应用,来实现RustFS的文件上传和文件删除功能。
<dependency>
<groupId>software.amazon.awssdkgroupId>
<artifactId>s3artifactId>
<version>${aws-s3-sdk.version}version>
dependency>
rustfs:
endpoint: http://192.168.3.101:9000
bucketName: simple
accessKey: rustfsadmin
secretKey: rustfsadmin
/**
* @auther macrozheng
* @description RustFS配置类
* @date 2025/7/23
* @github https://github.com/macrozheng
*/
@Configuration
public class RustFSConfig {
@Value("${rustfs.endpoint}")
private String ENDPOINT;
@Value("${rustfs.accessKey}")
private String ACCESS_KEY;
@Value("${rustfs.secretKey}")
private String SECRET_KEY;
@Bean
public S3Client s3Client(){
// 初始化 S3 客户端
return S3Client.builder()
.endpointOverride(URI.create(ENDPOINT)) // RustFS 地址
.region(Region.US_EAST_1) // 可写死,RustFS 不校验 region
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(ACCESS_KEY, SECRET_KEY)))
.forcePathStyle(true) // 关键配置!RustFS 需启用 Path-Style
.build();
}
}
/**
* @auther macrozheng
* @description RustFS对象存储管理Controller
* @date 2025/7/22
* @github https://github.com/macrozheng
*/
@Slf4j
@Controller
@Tag(name = "RustFSController", description = "RustFS对象存储管理")
@RequestMapping("/rustfs")
public class RustFSController {
@Autowired
private S3Client s3Client;
@Value("${rustfs.bucketName}")
private String BUCKET_NAME;
@Value("${rustfs.endpoint}")
private String ENDPOINT;
@Operation(summary = "文件上传")
@RequestMapping(value = "/upload", method = RequestMethod.POST,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseBody
public CommonResult upload(@RequestPart("file") MultipartFile file) {
// 判断Bucket是否存在
if(!bucketExists(BUCKET_NAME)){
// 创建Bucket
s3Client.createBucket(CreateBucketRequest.builder()
.bucket(BUCKET_NAME)
.build());
log.info("Bucket created: {}",BUCKET_NAME);
// 添加Bucket的访问策略
String policy = JSONUtil.toJsonStr(createBucketPolicyConfigDto(BUCKET_NAME));
log.info(policy);
PutBucketPolicyRequest policyReq = PutBucketPolicyRequest.builder()
.bucket(BUCKET_NAME)
.policy(policy)
.build();
s3Client.putBucketPolicy(policyReq);
}else{
log.info("Bucket already exists.");
}
// 上传文件
try {
s3Client.putObject(PutObjectRequest.builder()
.bucket(BUCKET_NAME)
.key(file.getOriginalFilename())
.contentType(file.getContentType())
.build(), RequestBody.fromInputStream(file.getInputStream(),file.getSize()));
RustFSUploadResult uploadResult = new RustFSUploadResult();
uploadResult.setName(file.getOriginalFilename());
uploadResult.setUrl(ENDPOINT + "/" + BUCKET_NAME + "/" + file.getOriginalFilename());
return CommonResult.success(uploadResult);
} catch (IOException e) {
e.printStackTrace();
}
return CommonResult.failed();
}
@Operation(summary = "文件删除")
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public CommonResult delete(@RequestParam("objectName") String objectName) {
// 删除对象
s3Client.deleteObject(DeleteObjectRequest.builder()
.bucket(BUCKET_NAME)
.key(objectName)
.build());
return CommonResult.success(null);
}
/**
* 判断Bucket是否存在
*/
private boolean bucketExists(String bucketName) {
try {
s3Client.headBucket(request -> request.bucket(bucketName));
return true;
}
catch (NoSuchBucketException exception) {
return false;
}
}
/**
* 创建存储桶的访问策略,设置为只读权限
*/
private BucketPolicyConfigDto createBucketPolicyConfigDto(String bucketName) {
BucketPolicyConfigDto.Statement statement = BucketPolicyConfigDto.Statement.builder()
.Effect("Allow")
.Principal(BucketPolicyConfigDto.Principal.builder().AWS(new String[]{"*"}).build())
.Action(new String[]{"s3:GetObject"})
.Resource(new String[]{"arn:aws:s3:::"+bucketName+"/*"}).build();
return BucketPolicyConfigDto.builder()
.Version("2012-10-17")
.Statement(CollUtil.toList(statement))
.build();
}
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::simple/*"
]
}
]
}



总结
今天给大家分享了RustFS的控制台使用和结合SpringBoot的使用,对比MinIO它的控制台功能确实更强大,感兴趣的小伙伴可以尝试下它!




