前言
本身打算使用MinIO搭建一个类似S3的存储服务用来做图床的,结果几个月前官方对于社区版的支持大幅度削减了,所以决定换成RustFS试一下。
号称是要对标MinIO的,同时也因为处于高速迭代状态,所以目前稳定性稍差。
该项目目前已经开源:https://github.com/rustfs/rustfs
官网:https://rustfs.com/zh/
文档地址:https://docs.rustfs.com/zh/
使用docker compose部署
docker,docker compose的安装这里不讲,若需要可以参考别人的文章或者去看我的另外一篇笔记里面有记录下迁移主机WordPress笔记。
docker部署官方文档:https://docs.rustfs.com/zh/installation/docker/
我自己的yml文件参考如下:
基础环境配置你可以都不写,若不写的话默认登录的账号和密码都是:rustfsadmin。
rustfs和minio的区别是他可以只需要一个端口,这个端口可以直接用作API和控制台的WebUI登录。
当然也可以区分开,但我没有成功,不知道是哪里写的有问题?我又想了想,可能是我地址填写的问题。我将相关配置注释在这里供各位参考。
(2025-10-12)我去issues里看了下,当初设置我在部署的时候API和网页控制台端口分开功能还没有实现。
配置好后,进入yml文件所在地址使用docker compose up -d启动。
(2025-10-16)官方文档还是有一些问题的?我发现每次启动的时候都会给logs创建一个匿名卷,官方写的是- deploy/logs:/app/logs但好像app/logs的路径是错的,我使用/logs后路径正确。可以使用docker inspect rustfs/rustfs:latest --format='{{.Config.Volumes}}'命令查询发现他内部定义的卷如下map[/data:{} /logs:{}]一个数据卷一个日志卷。
# https://rustfs.com/
services:
rustfs:
image: rustfs/rustfs:latest
container_name: rustfs-server
restart: unless-stopped
environment:
# 基础配置
# - RUSTFS_VOLUMES=/data/rustfs0 # 关键:指定数据卷路径
# - RUSTFS_ADDRESS=0.0.0.0:9000
# - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
# - RUSTFS_CONSOLE_ENABLE=true
# - RUSTFS_EXTERNAL_ADDRESS=:9000 # Same as internal since no port mapping
# - RUSTFS_CORS_ALLOWED_ORIGINS=*
# - RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=*
- RUSTFS_ACCESS_KEY=rustfsadmin
- RUSTFS_SECRET_KEY=rustfsadmin
# - RUSTFS_LOG_LEVEL=debug
volumes:
- rustfs_data:/data
- rustfs_logs:/logs
ports:
# 访问和API端口
- "9000:9000"
# Web 控制台端口
# - "9001:9001"
healthcheck:
test:
[
"CMD",
"sh", "-c",
"curl -f http://localhost:9000/health"
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
rustfs_data:
restfs_logs:
Nginx反代设置
我是在主机上安装了Nginx的,如果不需要域名的话也可以直接通过IP+上面设置的端口访问,跳过这一部分即可。域名请自行替换成自己的域名。
反代文件参考如下:
主要看有注释的地方,主要就是关闭缓存,设置超时,调整上传上限,支持WebSocket等。
设置完后放到nginx/conf.d/目录下,nginx -t检查下是否报错,systemctl reload nginx重载
server {
listen 80;
listen [::]:80;
server_name xxx.xxx.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name xxx.xxx.com;
ssl_certificate /etc/fullchain.pem;
ssl_certificate_key /etc/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:!aNULL:!MD5:!DSS;
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 100m;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
初始化RustFS
若没有问题这里就已经搭建好RustFS了。我们登录到后台,输入账号和密码(在你的yml文件中配置的)。
在左侧的文件浏览器选项卡中选择创建存储桶,命名后点击该桶的齿轮 配置桶按钮,我们将访问策略修改为公有。
在左边访问密钥选项卡选择添加访问密钥,选择到期日期,提交。记录下这组Access Key和Secret Key。我们要在PicGo上用。
安装和使用PicGO
官网:https://molunerfinn.com/PicGo/
文档:https://picgo.github.io/PicGo-Doc/zh/guide/
下载地址:https://github.com/Molunerfinn/picgo/releases
最好去上面下载!下面的地址仅作为存档备份!
官方提供的国内可用下载链接:2.4.0-beta.10
博主自己备份版本:2.4.0-beta.10 解压密码:crowsong.xyz 访问密码:crowsong
安装完成后,我们还需要安装一个插件。在插件设置中搜索s3,找到描述为picgo amazon s3 uploader的插件,如下图

插件GitHub地址:https://github.com/wayjam/picgo-plugin-s3
安装完成后,在图床设置中会多出一个Amazon S3的选项。我们新建一个配置文件,保留默认配置,因为可以参考它。
- 图床配置名:随意
- 应用密钥ID:之前记录的
Access Key - 应用密钥:之前记录的
Secret Key - 桶名:刚才你创建的那个桶的名字
- 上传文件路径:这里可以参考那个默认配置,
{year}/{month}/{md5}.{extName}这个就是根据年月创建文件夹,然后使用md5作为文件名。其他参数可以去插件的GitHub地址查看 - 地区:空,自建的这个没用,如果你的软件强制要求你填写你就写
us-east-1 - 自定义节点:填写你反代的域名,这里因为控制台和API都在一个域名。不是的话填你的API域名或者地址
- 代理:根据自己需求
- 拒绝无效TLS证书链接:同上
- ACL访问控制列表:默认(
public-read) - ForcePathStyle(重要):yes
- 后续选项根据个人需求进行设置
点击确认保存,记得点确认保存!
至此设置完毕,你可以尝试上传一张图片,上传完成后会返回给你图片的地址。
使用 docker-volume-backup 为 RustFS 进行备份
这里我使用了docker-volume-backup通过s3协议每周一将内容备份到了我的mega上,最多保存90天的内容。在原有的 yml 文件上额外挂载一个备份容器服务backup:
# https://rustfs.com/
services:
rustfs:
image: rustfs/rustfs:latest
container_name: rustfs-server
restart: unless-stopped
environment:
# 基础配置
# - RUSTFS_VOLUMES=/data/rustfs0 # 关键:指定数据卷路径
# - RUSTFS_ADDRESS=0.0.0.0:9000
# - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
# - RUSTFS_CONSOLE_ENABLE=true
# - RUSTFS_EXTERNAL_ADDRESS=:9000 # Same as internal since no port mapping
# - RUSTFS_CORS_ALLOWED_ORIGINS=*
# - RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=*
- RUSTFS_ACCESS_KEY=rustfsadmin
- RUSTFS_SECRET_KEY=rustfsadmin
# - RUSTFS_LOG_LEVEL=debug
volumes:
- rustfs_data:/data
ports:
# 访问和API端口
- "9000:9000"
# Web 控制台端口
# - "9001:9001"
healthcheck:
test:
[
"CMD",
"sh", "-c",
"curl -f http://localhost:9000/health"
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
backup:
image: offen/docker-volume-backup:v2
environment:
BACKUP_CRON_EXPRESSION: "0 2 * * 1"
AWS_ENDPOINT: s3.filebase.com
AWS_S3_BUCKET_NAME: filebase-bucket
AWS_ACCESS_KEY_ID: FILEBASE-ACCESS-KEY
AWS_SECRET_ACCESS_KEY: FILEBASE-SECRET-KEY
BACKUP_FILENAME: backup-%Y-%m-%dT%H-%M-%S.tar.gz
BACKUP_PRUNING_PREFIX: backup-
BACKUP_RETENTION_DAYS: 90
volumes:
- rustfs_data:/backup/rustfs-backup:ro
volumes:
rustfs_data: