本文假设读者具有一定的服务器操作知识, 会基本的 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 登录

  1. domins - 添加自己的域名 (xx.xxx)

  2. 按照提示一步步向下设置

  3. 最重要一步: 在域名供应商网站将 DNS 解析服务器设置为 cf 提供的 dns 服务器, 注意, 不是修改解析记录, 而是更改 DNS 服务器

  4. 等待 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

  5. 设置缓存, 找到 Caching - Rules, 添加规则, deploy 生效

    匹配图床图片的访问地址即可, 比如 Full URL 匹配 https://img.example.com/bucket/*

  6. SSL/TLS - Edge Certificates, 查看 Edge Certificates 状态, 如果是 "Pending Validation", 则需要等待证书处理完成, 这里不需要操作

    证书自动处理完成之前, 无法正常使用 https 访问

    等待时间可能比较久, 15 分钟 - 24 小时, 因为 DNS 解析可能未完全同步

    处理完成之后是 "Active" 状态

使用

在配置 Cloudflare 之后我碰到一个问题: PicGo 无法正常上传, 但是使用 aws cli 可以上传, PicGo 上传一直提示 ECONNRESET 错误, 在 CF 安全模式中设置 Skip 规则也不行, 后面在本机电脑上加了个 hosts 规则, 直接指向真实 IP 才可以用, 暂时没弄明白

如果不怕被刷流量, 不套 CF 也行