在现代全栈开发(Vibe Coding)的技术栈中,虽然 Supabase 自带了 Storage 功能、Vercel 也有免费的 Blob 额度,但许多开发者(包括 HiCyou)还是会更倾向于使用 Cloudflare R2 作为SaaS项目的存储方案。
因为 R2 完美兼容 S3 协议,而且最重要的是:它不收出口流量费(Zero Egress Fee)。这意味着无论用户从你的应用下载多少次图片或文件,你都不用担心收到天价账单(不过对于请求还是有收费的,不过费用是非常少的),这对于 SaaS 项目的扩展性至关重要。
对于早起创始阶段的独立开发者来说,10G的免费存储额度,免费流量,宽裕的免费请求额度,非常利好早期零成本项目启动。
在这篇文章中,我将手把手带你完成:
- 创建 R2 存储桶 (Bucket)
- 生成兼容 S3 的 API 密钥 (API Keys)
- 配置自定义域名访问
第一步:创建你的 R2 Bucket

在开始之前,确保你已经拥有 Cloudflare 账号。
- 登录 Cloudflare Dashboard。
- 在侧边栏找到并点击 R2。
- 注意:如果你是第一次使用 R2,系统可能会要求你添加支付方式。R2 提供非常慷慨的免费额度(每月 10GB 存储 + 数百万次请求),但激活服务通常需要绑定信用卡或Paypal。
- 点击 “Create bucket” (创建存储桶) 按钮。
配置存储桶

- Bucket Name (名称): 输入一个唯一的名称(例如
hicyou-assets或my-saas-uploads)。- 提示:只能使用小写字母和短横线。
- Location (位置): 保持默认的
Automatic即可。Cloudflare 强大的全球网络会自动处理节点优化。 - 点击 “Create Bucket”。
现在你已经拥有了一个R2的Buckeet了,但它目前是私有的,你的代码和用户都还无法访问它。
第二步:生成 API Keys (S3 凭证)
为了让你的应用(Node.js, Python, Go 等)能够上传文件,你需要获取凭证。由于 R2 兼容 S3 标准,所以我们需要 Access Key ID 和 Secret Access Key。
重要提示: 不要去刚刚创建的 Bucket 内部找这些设置,它们位于 R2 的全局控制台中。

- 回到 R2 Overview (总览) 页面。
- 在右侧边栏,找到 “Account Details” 下面的
{}Manage按钮并点击。 - 点击 “Create User API Token” (创建用户级API 令牌)。
Token权限向导
为了确保你的应用能正常读写,请按照以下配置:

- Token Name: 起个有描述性的名字(例如
Production App Read/Write)。 - Permissions (权限): 选择 Object Read & Write (对象读写)。
- 安全提示: 给应用程序用的 Key,尽量避免选 “Admin” 权限,”Object Read & Write” 更安全。
- Specific Bucket(s): 选择 “Apply to specific buckets only”,然后勾选你刚才创建的 Bucket(例如
hicyou-assets)。 - TTL (有效期): 选择 “Forever” (永久)(除非你有特定的密钥轮换策略)。
点击 “Create User API Token”。
⚠️ 注意: 立即保存你的 AK!
Cloudflare 只会显示一次 Secret Key。如果你关掉页面,就再也看不到了。
请将以下信息复制并保存到你的 .env 文件或密码管理器中:
- Access Key ID: (例如
f82b...) - Secret Access Key: (例如
8d9a...– 比较长的那一串) - Endpoint: 这是你的 S3 连接地址。
- 格式通常是:
https://<ACCOUNT_ID>.r2.cloudflarestorage.com
- 格式通常是:
开发者提示: 在配置 S3 客户端(如 AWS SDK 或 MinIO)时,填写的 Endpoint 通常不需要带上 bucket 名称。客户端会在请求时自动将 bucket 名称拼接到 URL 中。
第三步:开启公开访问 (自定义域名)
默认情况下,R2 里的文件是私有的。如果你想让用户通过浏览器查看图片(比如头像、博客封面),你需要开启公开访问。
最佳实践:使用自定义域名
不要在生产环境使用 Cloudflare 提供的 r2.dev 子域名(它有严格的速率限制)。建议绑定你自己的域名。

- 进入你刚才创建的 Bucket 页面,点击 Settings (设置) 标签。
- 向下滚动找到 Public Access (公开访问) -> Custom Domains (自定义域名)。
- 点击 “Connect Domain”。
- 输入一个二级域名,例如
cdn.hicyou.com或assets.myapp.com。 - Cloudflare 会自动为你更新 DNS 记录。
现在,如果你上传了一个名为 logo.png 的文件,用户就可以通过以下地址访问:
https://assets.hicyou.com/logo.png
第四步:配置 CORS (用于前端直传)
如果你计划让前端(例如 React, Next.js, Vue)直接上传文件到 R2,而不是经过后端服务器中转,你必须配置 CORS (跨域资源共享)。
- 在 Bucket Settings 页面。
- 向下滚动找到 CORS Policy。
- 添加以下 JSON 配置,允许本地开发环境和你的生产环境域名进行跨域访问:
JSON
[
{
"AllowedOrigins": [
"http://localhost:3000",
"https://hicyou.com",
"https://www.hicyou.com"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE",
"HEAD"
],
"AllowedHeaders": [
"*"
],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]
结语
现在,配合上一篇 Supabase 指南,你的数据库(Postgres)和对象存储(R2)这两大基础设施已经搭建完毕,且都是业内成本效益极高的方案。
欢迎大家使用 https://github.com/hicyoucom/hicyou 创建属于自己的AI网址导航网站。
Demo: https://hicyou.com
0