本文假设读者具有一定的服务器操作知识, 会基本的 Docker 和命令行操作, 文中仅给出最核心的操作
https 以及域名访问部分需要有公网 IP 和自购域名, 如果只是内网访问, 可以不配置 https/ 域名 /cloudflare 相关内容
有不清楚的地方可以 AI 搜索, 或者评论区讨论
rustfs 部署
docker-compose.yaml
services:
rustfs:
image: rustfs/rustfs:latest
container_name: rustfs
#user: "1000:1001"
user: "0:0"
ports:
- 127.0.0.1:9001:9001 # ui 端口
- 127.0.0.1:9000:9000 # api 端口
volumes:
- ./data:/data # 数据存储
environment:
- RUSTFS_ACCESS_KEY=yourkey
- RUSTFS_SECRET_KEY=yoursecret
restart: unless-stopped
这里 docker 配置映射端口到本地 IP:Port 上了, 无法直接访问, 必须通过 nginx 反向代理
nginx 反向代理与 HTTPS 配置
假设已经有自己的域名 example.com
9001 的 Web 控制台端口代理比较简单
/etc/nginx/conf.d/s3console.conf
server {
server_name s3console.example.com;
location / {
proxy_pass http://127.0.0.1:9001;
proxy_http_version 1.1;
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;
}
}
保存生效
# 配置测试
nginx -t
# 确认配置无误后生效
nginx -s reload
# 使用
部署运行后, 通过 9001 端口访问控制台, 使用填入的 ACCESS 和 SECRET 访问
以下 nginx 配置非常需要注意, 最好除了关键信息都不要修改, 配置错误非常容易导致难以排查的 403 错误
server {
server_name s3.example.com;
client_max_body_size 5G;
location / {
proxy_pass http://127.0.0.1:9000;
# --- 核心修复:禁用请求缓冲 ---
proxy_request_buffering off;
proxy_buffering off;
# --- 修正头部信息 ---
proxy_http_version 1.1;
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 600s;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
# --- 支持分块传输 ---
chunked_transfer_encoding on;
}
}
使用 certbot 配置 https, 命令: certbot --nginx -d s3.example.com (需要有自己的域名, 服务器上安装 certbot)
S3 存储桶创建与访问配置
访问 Web 控制台 (9001 端口), 使用 docker compose 中填写的访问信息登录
存储桶创建
-
对象浏览
-
创建存储桶
-
输入名称, 其余保持默认 (不开启), 创建
-
存储桶 - 设置 - 访问策略 - 修改为公有 (public) (重要)
访问密钥
-
添加访问密钥
-
输入名称
-
提交
-
保存 key 和密钥 ( 一定要先记下, 密钥只显示一次 )
-
修改密钥策略, 允许对 img-bed 的所有操作
{"ID":"","Version":"2012-10-17","Statement":[{"Sid":"","Effect":"Allow","Action":["s3:*"],"NotAction":[],"Resource":["arn:aws:s3:::img-bed","arn:aws:s3:::img-bed/*"],"NotResource":[],"Condition":{}}]}
PicGo 安装与配置
下载 PicGo (https://github.com/Molunerfinn/PicGo)
-
安装 - 打开
-
插件设置 - 搜索 "s3" - 安装 wayjam/s3 用于支持 S3 存储
-
PicGo Cloud - 登录, 可使用 github 登录 用于同步配置
-
图床设置 - Amazon S3 参考 (https://github.com/wayjam/picgo-plugin-s3) 项目说明来配置
-
图床名: 自定义
-
密钥 ID: access key
-
密钥: secret
-
桶名: img-bed (之前创建的桶名)
-
上传路径:
{year}/{month}/{sha256}.{extName} -
地区:
us-east-1 -
自定义节点:
https://s3.example.com(不要加斜杠或者任何多余内容) -
拒绝无效 TLS 证书: 看情况, 先不勾选, 保证能正常使用后再勾选测试
-
ACL: 留空
-
ForcePathStyle: true
-
自定义输出 URL 路径:
{protocol}://{host}:{port}/{path}
-
在 PicGo 主页, 测试上传, 查看相册, 复制 Markdown 链接试用
Cloudflare 中转
套一层 cloudflare, 主要有以下作用
-
隐藏真实 IP
-
缓存资源, 减小服务器流量和压力
-
还可以配置防止盗刷
打开 Cloudflare 主页: cloudflare.com
可以选择 github 登录
-
domins - 添加自己的域名 (xx.xxx)
-
按照提示一步步向下设置
-
最重要一步: 在域名供应商网站将 DNS 解析服务器设置为 cf 提供的 dns 服务器, 注意, 不是修改解析记录, 而是更改 DNS 服务器
-
等待 DNS 服务器修改生效: 当 ping 自己的域名, 显示的 IP 不再是 VPS 真实 IP 时, 说明生效了 (可能需要 15 分钟 - 24 小时)
DNS management for example.com:
Proxied: 说明已经被 CF 代理, 真实 IP 会被隐藏
DNS only: 说明未被 CF 代理
生效后在主页的 domains 下应当看到自己的域名对应状态为
Active, 点进去 Overview 应该会提示:Your domain is now protected by Cloudflare -
设置缓存, 找到 Caching - Rules, 添加规则, deploy 生效
匹配图床图片的访问地址即可, 比如 Full URL 匹配
https://img.example.com/bucket/* -
SSL/TLS - Edge Certificates, 查看 Edge Certificates 状态, 如果是 "Pending Validation", 则需要等待证书处理完成, 这里不需要操作
证书自动处理完成之前, 无法正常使用 https 访问
等待时间可能比较久, 15 分钟 - 24 小时, 因为 DNS 解析可能未完全同步
处理完成之后是 "Active" 状态
使用
在配置 Cloudflare 之后我碰到一个问题: PicGo 无法正常上传, 但是使用 aws cli 可以上传, PicGo 上传一直提示 ECONNRESET 错误, 在 CF 安全模式中设置 Skip 规则也不行, 后面在本机电脑上加了个 hosts 规则, 直接指向真实 IP 才可以用, 暂时没弄明白
如果不怕被刷流量, 不套 CF 也行