使用 MinIO + Cloudflare + Caddy 构建 HTTPS 私有对象存储服务

使用 MinIO + Cloudflare + Caddy 构建 HTTPS 私有对象存储服务
未分类

使用 MinIO + Cloudflare + Caddy 构建 HTTPS 私有对象存储服务


最近我成功部署了一套稳定、安全、高性能的对象存储服务,基于开源的 MinIO,结合 Caddy 自动反向代理和 Let's Encrypt 证书,再借助 Cloudflare CDN 提供全球访问加速和隐藏真实 IP。这个方案特别适合需要私有音视频文件托管、外链直连、兼容 S3 API 的场景。

这篇文章记录一下整个部署过程,供有类似需求的朋友参考。


💡 项目背景

我需要一个支持以下功能的存储服务:

  • 支持上传和访问音频、视频等大文件

  • 能通过 HTTPS 域名访问,避免暴露服务器 IP

  • 能用 Markdown 外链引用(适用于博客、视频项目)

  • 兼容 S3 协议,支持 CLI 工具和程序化上传

  • 尽可能低成本,便于自己掌控

最终选择的方案:

  • MinIO:作为对象存储引擎,S3 兼容

  • Caddy:自动 HTTPS,反向代理 MinIO 控制台/API

  • Cloudflare:做 DNS + CDN,加速访问 + 隐藏 IP

  • Docker:部署方便、易维护


🌐 域名结构设计

为了更清晰地管理服务,我将控制台和 API 拆分为两个子域名:

|子域名|功能|映射端口|
|---|---|---|
|us.saypt.com|MinIO 控制台|9090|
|s3.saypt.com|S3 API 接口|9000|

这样可以:

  • 让用户通过 us.saypt.com 访问 Web 控制台

  • 程序使用 s3.saypt.com 上传和下载文件

  • 两者都通过 Cloudflare 提供的 HTTPS 和防护服务访问,无需暴露端口


🐳 MinIO Docker 启动命令

docker run -d --name minio \
  -p 9000:9000 \
  -p 9090:9090 \
  -e MINIO_SERVER_URL=https://s3.saypt.com \
  -e MINIO_BROWSER_REDIRECT_URL=https://us.saypt.com \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=admin" \
  -v /mnt/storage/minio-data:/data \
  quay.io/minio/minio server /data --console-address ":9090"

✅ 参数说明:

  • MINIO_SERVER_URL:MinIO 用来生成 API 外链的域名

  • MINIO_BROWSER_REDIRECT_URL:登录后跳转到控制台的域名

  • --console-address :9090:将控制台绑定在 9090,而非默认的 9001/随机端口

  • -v:挂载本地 1TB 存储作为数据目录


🔧 Caddy 配置(自动 HTTPS + 反代)

我使用了 Caddy 来管理反向代理,并启用自动 HTTPS,配置如下:

us.saypt.com {
    encode gzip
    reverse_proxy http://localhost:9090
}

s3.saypt.com {
    encode gzip
    reverse_proxy http://localhost:9000
}
  • 所有访问都走 443 端口

  • Cloudflare 橙色云朵代理生效,隐藏了服务器真实 IP

  • MinIO 控制台和 API 各自独立、安全可靠


🧪 上传和访问测试

使用 MinIO 命令行工具 mc

# 设置连接别名
mc alias set s3 https://s3.saypt.com admin admin

# 创建一个公开 bucket
mc mb s3/media
mc anonymous set download s3/media

# 上传文件
mc cp test.mp3 s3/media/

外链访问效果:

文件地址:

https://s3.saypt.com/media/test.mp3

可直接用于:

[🎵 播放音频](https://s3.saypt.com/media/test.mp3)

或:

<audio src="https://s3.saypt.com/media/test.mp3" controls></audio>

🔐 Cloudflare 设置

在 Cloudflare 控制面板中:

|类型|名称|内容|代理状态|
|---|---|---|---|
|A|us|VPS IP|✅ 已代理|
|A|s3|VPS IP|✅ 已代理|

确保开启了 CDN 加速(橙色云朵),并将 SSL 模式设置为“Full”或“Full(strict)”以保证 HTTPS 安全通信。


✅ 最终效果总结

我现在已经拥有了这样一个完整的对象存储服务:

  • 🔐 使用 Cloudflare + Caddy 提供全程 HTTPS 安全访问

  • 🌐 控制台与 API 分离,管理更清晰

  • ⚙️ 兼容标准 S3 协议,支持程序自动上传

  • 📦 支持 Markdown 音视频资源引用,完美适配博客或视频项目

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Back To Top