系列回顾:
ℹ️ 先说一个重要前提: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-images、my-backup。图片和备份分开建桶,后面管理和权限都清爽。
第二步:创建 API Token(密钥)
要让 PicGo、rclone 这些工具访问桶,需要一对密钥。R2 用的是自己的一套(和 Cloudflare 的 API Token 是两回事):
R2 管理页面 → 右下角的账户详情 管理 R2 API 令牌 → 管理

选择 创建 User API 令牌

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

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

⚠️ 只显示这一次,关掉就没了。马上复制保存。
第三步:公开访问(两种方式)
桶默认是私有的,要让人能直接通过 URL 访问图片,需要开启公共访问。两种方式:
方式 A:r2.dev 开发域名(只建议临时用)
在桶的 设置 → 公共开发 URL → 开启,Cloudflare 会分配一个 xxx.r2.dev 的子域名,用 https://xxx.r2.dev/图片名 就能访问了。

方便,但有明确限制:这是给开发测试用的,官方限速(访问频繁会返回 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:
- PicGo 安装 插件,可以搜索关键词 s3、r2、cloudflare 等(我自己装的是 cloudflare-r2-xqv)
- 图传设置里,R2 相关参数填:

配置好之后,拖图进 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 官方页面为准。
系列回顾:
暂无评论