0元冷启动02:Cloudflare R2 免费对象存储实测

0元冷启动02:Cloudflare R2 免费对象存储实测

胖张Dev ·

系列回顾:

ℹ️ 先说一个重要前提:R2 的免费是真的,但有一个短板需要提前了解——Cloudflare 在国内没有 CDN 节点,R2 的国内访问速度不稳定,高峰期图片可能加载慢。如果你做的是面向国内读者的图床,或者对速度要求很高,R2 可能不太适合(国内方案需要备案、通常要花钱);它的主场是备份面向海外用户的场景,或者对速度要求不高的个人博客图片等。想清楚这几个场景对不对路,再决定要不要往下走。相关细节写在文末。

为什么需要"免费"对象存储

独立开发者的图片、文件、备份,总得有个地方放。我遇到过的三种情况:

  • 图床:写博客、写内容,图片得有公网地址。用第三方免费图床(比如微博图床),稳定性没保障,说不定哪天图片就变成死链。
  • 对象存储:又拍云、七牛这类,功能好用,但对个人来说有门槛——绑定自己的域名基本都要备案,还要充值。
  • 备份:服务器数据、数据库要定期备份。放回服务器占空间,放对象存储最合适,可流量费又是个看不见的开销。

一般的对象存储,计费方式大多是"存储便宜、流量偏贵":存 1GB 一个月几毛钱,但用户一访问,下行流量每 GB 收你几毛甚至几块。图床访问多了、备份恢复一次,账单就明显上涨了。

Cloudflare R2 正好反着来:流量这块最容易超支的费用直接免掉,出口流量完全免费,GET 请求 1000 万次/月免费。

别的存储,图片每被访问一次,流出去多少 GB 就按流量算钱——图床一个月传出去 10GB 图片,就是几块到几十块的开销,访问量越大开销越高。

R2 这部分永远为 0,访问再多也只按请求次数计费,而请求次数还有 1000 万次/月的免费额度垫底。存储也不比别家差,照样有 10GB 免费额度。图床、备份这两个场景,最怕的都是流量费,R2 正好把这块免掉了。

免费额度到底有多少

先看官方免费档(截至 2026 年 8 月):

项目免费额度说明
存储10GB/月图床 + 网站备份,个人绰绰有余
Class A 操作(A 类操作)100 万次/月写和列表类操作(上传 PUT、删除、列目录)
Class B 操作(B 类操作)1000 万次/月读类操作(GET,也就是用户访问图片)
出口流量免费下行流量、数据迁移都不收钱,这是 R2 的招牌
删除操作免费Delete 类操作永久免费,不占额度

两个量级的概念:用户访问一张图,花的是两笔钱——一次 GET 请求(Class B 操作),加一次数据下行流量。前者 R2 免费 1000 万次/月,个人站基本用不完;后者更彻底,完全没有额度上限。就算哪个月超出免费额度,超出部分的单价也很便宜(存储约 $0.005/GB/月,约合人民币 4 分钱/GB/月),属于"用超了也就几块钱"的水平。

AWS S3 当然更强,但那是给团队和企业准备的,个人的图床用它的免费档,出流量照收钱。

前提条件:域名托管在 Cloudflare。跟上期邮箱一样,这是唯一的硬性要求,因为公开访问的自定义域名要在 Cloudflare 操作。如果你域名已经托管在 Cloudflare(上期应该已经搞定了),直接往下走。

第一步:创建一个存储桶

登录 Cloudflare 控制台,左侧找到 存储和数据库 -> R2 对象存储 -> 概述,点 创建存储桶

创建存储桶

填存储桶名称,比如 pzdev-images位置选「自动」即可;“提供位置提示”里也有亚太地区可选,但实测下来,选哪个对国内访问速度区别都不大。

设置存储桶

📌 关于"位置"这个选项:官方叫 Data Location,只决定数据物理存储在哪片大区(亚太、北美、欧洲等),用于数据驻留合规,或在数据主要被某个区域访问时把存储放得近一些。它不决定用户从哪个节点访问:访问走的是 Cloudflare 的 CDN 边缘节点,而 Cloudflare 在中国大陆没有自营节点(大陆数据中心由合作方运营,需完成 ICP 备案、面向企业客户,普通账号用不上),国内用户的请求仍然要绕行境外节点。所以把位置选在"亚太"对国内访问速度帮助有限(官方自己也只说这里是大区级的尽力而为),位置主要解决"数据存哪",决定不了"用户从哪取"。位置创建后锁定,删桶重建同名桶也会沿用原位置——个人场景选"自动"即可。

桶名全局唯一,建议用有含义的名字,比如 my-blog-imagesmy-backup。图片和备份分开建桶,后面管理和权限都清爽。

第二步:创建 API Token(密钥)

要让 PicGo、rclone 这些工具访问桶,需要一对密钥。R2 用的是自己的一套(和 Cloudflare 的 API Token 是两回事):

R2 管理页面 → 右下角的账户详情 管理 R2 API 令牌管理

创建 API 令牌

选择 创建 User API 令牌

创建 User API 令牌

API 令牌设置:

  • 令牌名称:根据自己情况进行定义。
  • 权限:对象读和写。别给桶管理的权限——密钥是给各类工具用的,原则是最小权限。
  • 指定存储桶:仅应用于特定的存储桶。建议这样选,令牌万一泄漏也不会波及其它桶。
  • TTL:令牌有效期,自行考虑。这里直接设置永久

令牌设置

创建后会显示 S3 协议的令牌 ID、令牌值和区域地址。

创建成功,信息一定要复制到安全位置

⚠️ 只显示这一次,关掉就没了。马上复制保存。

第三步:公开访问(两种方式)

桶默认是私有的,要让人能直接通过 URL 访问图片,需要开启公共访问。两种方式:

方式 A:r2.dev 开发域名(只建议临时用)

在桶的 设置 → 公共开发 URL开启,Cloudflare 会分配一个 xxx.r2.dev 的子域名,用 https://xxx.r2.dev/图片名 就能访问了。

开启 公共开发 URL

方便,但有明确限制:这是给开发测试用的,官方限速(访问频繁会返回 429),不保证稳定性,而且明确不支持拿自己的域名 CNAME 过去。拿去当正式图床,属于把开发环境当生产用。

方式 B:自定义域名(生产推荐,多花 5 分钟)

把你的子域名(比如 img.pzdev.me)直接绑定到桶上:

打开桶 → 设置自定义域添加

绑定自定义域

输入子域名,比如 img.pzdev.me(前提是 pzdev.me 已经在 Cloudflare 托管)。确认后 Cloudflare 自动写入一条 CNAME 记录,不用手动配。等状态从「初始化中」变「有效」,很快就完成。

配置成功,等待生效

绑完你的图片 URL 就是 https://img.pzdev.me/图片名,好看、稳定,还自动带 HTTPS 证书。

自定义域名还多一个好处:走 Cloudflare 的 CDN 缓存,配合免费的缓存规则,图片访问会更快。默认只缓存部分文件类型,想全量缓存可以配一条"缓存所有内容"的规则。

📌 注意:公开桶有个限制,根路径不能列出目录列表,也就是访问 https://img.pzdev.me/ 不会显示文件清单。这其实是好事——避免整个桶被公开浏览。

到这里,一个 0 元的图床基础设施就搭好了。下面两个场景,图床为主,备份为辅。

场景一:图床(PicGo)

写作的人在 Mac/Windows 上用 https://github.com/Molunerfinn/PicGo 传图很常见,它支持 S3 插件连 R2:

  1. PicGo 安装 插件,可以搜索关键词 s3、r2、cloudflare 等(我自己装的是 cloudflare-r2-xqv)
  2. 图传设置里,R2 相关参数填:

配置插件,把刚才 API Token 的配置填写过来

配置好之后,拖图进 PicGo,自动上传到 R2,剪贴板里就是 https://img.pzdev.me/xxx.png,直接粘到公众号/博客里。帖子里的图片成本:0。

场景二:备份(rclone)

rclone 是大文件备份的标配,官方给了 R2 的标准配置,加到 rclone config 里就行:

[r2]
type = s3
provider = Cloudflare
access_key_id = <你的 Access Key ID>
secret_access_key = <你的 Secret Access Key>
endpoint = https://<账户ID>.r2.cloudflarestorage.com
acl = private
region = auto

实测确认,要注意两点:

  • 如果 API Token 是对象级权限(只勾了对象读/写的那种),要在配置里加一行 no_check_bucket = true(跳过桶存在性检查)。rclone 版本建议 ≥ 1.59。
  • 对象级 Token 没有「列出所有桶」的权限,所以所有 rclone 命令都要写全桶名(r2:my-backup/ 这种)。如果只写 r2: 不带桶名,会报 AccessDenied: Access Denied(403)——第一次验证时容易误以为配置写错了,其实换个带桶名的命令(比如 rclone lsd r2:my-backup/)就通了。

常用的几个命令:

# 把本地目录整个传上去(增量同步:已存在的文件自动跳过,重复跑只传有变化的)
rclone copy /path/to/backup r2:my-backup/server-20260817/

# 看桶里有什么
rclone tree r2:my-backup

# 下载恢复
rclone copy r2:my-backup/server-20260817/ /path/to/restore/

网页上传大文件不太方便,rclone 走命令行,几十 GB 的备份文件传上去很稳妥。再配个 cron,定时把服务器数据备份到 R2:

# 每天凌晨 3 点跑一次(crontab 示例)
0 3 * * * rclone copy /root/backup r2:my-backup/ 2>> /var/log/rclone-backup.log

备份文件访问流量本来就小,rclone 那点 API 调用离免费额度差得远,等于长期免费的异地备份

还有个细节:上传多个小文件时,每一片分片都算一次 Class A 操作。要是几万个 1KB 的小碎文件,建议先打包再传,操作次数少了,传得也快。

几个要注意的坑

说明
国内访问速度不稳大陆没有 CDN 节点,请求绕行香港、日本、新加坡等周边节点,高峰期加载慢、偶尔打不开很正常。社区实测:直链约 1MB/s,走 Cloudflare 代理 25-50MB/s。提速只能靠 CDN 和缓存,位置选亚太帮助有限
低频存储没有免费档Infrequent Access(低频)存储不参与免费额度
r2.dev 只适合开发测试官方限速(超限返回 429)、稳定性不保证,CNAME 指向自己的域名不受官方支持
密钥只显示一次Secret 创建后只展示一次,丢了只能重建
公开桶注意隐私根路径不能列目录(其实是好事),公开桶里的文件任何人都能直接访问
担心访问量超限被收费免费额度按月度重置,个人站离 1000 万次/月很远。绑定付款方式后超限才会进入按量计费,不绑定则不会;打开用量提醒,快超限时邮箱会收到通知
官方没有「超量自动断流」超量是自动计费、不是自动停服,也没有原生的硬配额。想精确熔断只能加一层 Worker 计数器,而 Workers 免费档每天 10 万次请求

总结

0 元成本,R2 给到的是一个「10GB 存储 + 每月 100 万次写 + 1000 万次读 + 出口流量全免」的对象存储:

  • 图床:PicGo + 自定义域名,图片链接稳定、还带 CDN
  • 备份:rclone + cron,服务器数据自动异地备份
  • 超出免费额度也就几块钱,个人用基本用不完
📌 免费政策随时会变,以 Cloudflare 官方页面为准。

系列回顾:

CC BY-NC-SA

知识共享协议

本文采用 CC BY-NC-SA 4.0 许可协议

转载请注明出处,不得用于商业用途,演绎作品需采用相同协议

微信搜一搜 胖张Dev

微信搜一搜「胖张Dev」

暂无评论

添加新评论