rustfs加picgo图床搭建

本文假设读者具有一定的服务器操作知识, 会基本的Docker和命令行操作, 文中仅给出最核心的操作

https以及域名访问部分需要有公网IP和自购域名, 如果只是内网访问, 可以不配置https/域名/cloudflare相关内容

有不清楚的地方可以AI搜索, 或者评论区讨论

rustfs部署

docker-compose.yaml

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

nginx 复制代码
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;
    }
}

保存生效

bash 复制代码
# 配置测试
nginx -t
# 确认配置无误后生效
nginx -s reload
# 使用

部署运行后, 通过9001端口访问控制台, 使用填入的ACCESS和SECRET访问

以下nginx配置非常需要注意, 最好除了关键信息都不要修改, 配置错误非常容易导致难以排查的403错误

nginx 复制代码
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的所有操作

    json 复制代码
    {"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 (github.com/Molunerfinn...)

  • 安装 - 打开

  • 插件设置 - 搜索"s3" - 安装 wayjam/s3 用于支持S3存储

  • PicGo Cloud - 登录, 可使用github登录 用于同步配置

  • 图床设置 - Amazon S3 参考(github.com/wayjam/picg...%25E9%25A1%25B9%25E7%259B%25AE%25E8%25AF%25B4%25E6%2598%258E%25E6%259D%25A5%25E9%2585%258D%25E7%25BD%25AE "https://github.com/wayjam/picgo-plugin-s3)%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E%E6%9D%A5%E9%85%8D%E7%BD%AE")

    • 图床名: 自定义
    • 密钥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也行

最后附上图床截图, 下面这张插图就是图床链接, 这样在不同平台就可以统一插图了, 耶!

相关推荐
蝎子莱莱爱打怪17 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
小p2 天前
docker学习7:docker 容器的通信方式
docker
小p2 天前
docker学习5:提升Dockerfile水平的5个技巧
docker
小p2 天前
docker学习3:docker是怎么实现的?
docker
小p3 天前
docker学习: 2. 构建镜像Dockerfile
docker
小p4 天前
docker学习: 1. docker基本使用
docker
崔小汤呀4 天前
Docker部署Nacos
docker·容器
缓解AI焦虑4 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
1candobetter5 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka