全部文章
tutorial

Cloudflare R2 实战指南:配置免费10G存储和免费流量的对象存储与 S3兼容 API Key

在现代全栈开发(Vibe Coding)的技术栈中,虽然 Supabase 自带了 Storage 功能、Vercel 也有免费的 Blob 额度,但许多开发者…

在现代全栈开发(Vibe Coding)的技术栈中,虽然 Supabase 自带了 Storage 功能、Vercel 也有免费的 Blob 额度,但许多开发者(包括 HiCyou)还是会更倾向于使用 Cloudflare R2 作为SaaS项目的存储方案。

因为 R2 完美兼容 S3 协议,而且最重要的是:它不收出口流量费(Zero Egress Fee)。这意味着无论用户从你的应用下载多少次图片或文件,你都不用担心收到天价账单(不过对于请求还是有收费的,不过费用是非常少的),这对于 SaaS 项目的扩展性至关重要。

对于早起创始阶段的独立开发者来说,10G的免费存储额度,免费流量,宽裕的免费请求额度,非常利好早期零成本项目启动。

在这篇文章中,我将手把手带你完成:

  1. 创建 R2 存储桶 (Bucket)
  2. 生成兼容 S3 的 API 密钥 (API Keys)
  3. 配置自定义域名访问

第一步:创建你的 R2 Bucket

在开始之前,确保你已经拥有 Cloudflare 账号。

  1. 登录 Cloudflare Dashboard。
  2. 在侧边栏找到并点击 R2。
    • 注意:如果你是第一次使用 R2,系统可能会要求你添加支付方式。R2 提供非常慷慨的免费额度(每月 10GB 存储 + 数百万次请求),但激活服务通常需要绑定信用卡或Paypal。
  3. 点击 “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 的全局控制台中。

  1. 回到 R2 Overview (总览) 页面。
  2. 在右侧边栏,找到 “Account Details” 下面的 {}Manage 按钮并点击。
  3. 点击 “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 文件或密码管理器中:

  1. Access Key ID: (例如 f82b...)
  2. Secret Access Key: (例如 8d9a... – 比较长的那一串)
  3. Endpoint: 这是你的 S3 连接地址。
    • 格式通常是:https://<ACCOUNT_ID>.r2.cloudflarestorage.com

开发者提示: 在配置 S3 客户端(如 AWS SDK 或 MinIO)时,填写的 Endpoint 通常不需要带上 bucket 名称。客户端会在请求时自动将 bucket 名称拼接到 URL 中。


第三步:开启公开访问 (自定义域名)

默认情况下,R2 里的文件是私有的。如果你想让用户通过浏览器查看图片(比如头像、博客封面),你需要开启公开访问。

最佳实践:使用自定义域名

不要在生产环境使用 Cloudflare 提供的 r2.dev 子域名(它有严格的速率限制)。建议绑定你自己的域名。

  1. 进入你刚才创建的 Bucket 页面,点击 Settings (设置) 标签。
  2. 向下滚动找到 Public Access (公开访问) -> Custom Domains (自定义域名)。
  3. 点击 “Connect Domain”。
  4. 输入一个二级域名,例如 cdn.hicyou.com 或 assets.myapp.com。
  5. Cloudflare 会自动为你更新 DNS 记录。

现在,如果你上传了一个名为 logo.png 的文件,用户就可以通过以下地址访问:

https://assets.hicyou.com/logo.png

第四步:配置 CORS (用于前端直传)

如果你计划让前端(例如 React, Next.js, Vue)直接上传文件到 R2,而不是经过后端服务器中转,你必须配置 CORS (跨域资源共享)。

  1. 在 Bucket Settings 页面。
  2. 向下滚动找到 CORS Policy。
  3. 添加以下 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