0.前言

几年前,当我第一次把域名扔进Cloudflare的怀抱时,仿佛打开了新世界的大门——高效DNS解析、免费的SSL证书、免费安全的CDN加速…

前不久,我用Cloudflare免费提供的Pages服务部署Hexo博客后,又再次感叹于Cloudflare的慷慨大方和高效优雅的网站托管服务。

而今天,当Cloudflare R2对象存储提供的大容量免费额度成为了我博客的图床服务,我终于体验到Cloudflare全站式托管的终极优雅。

1.Cloudflare R2定价解析

官方定价说明
官方费用计算器 - R2 Calculator
下面是Cloudflare R2提供的免费额度以及超额部分的收费表,对比我之前介绍的Backblaze云存储方案以及其它云存储服务商,Cloudflare R2在免费额度和出口流量政策上更具竞争力。

类型 免费额度 超额付费
存储 10 GB-月/月 $0.015/GB/月
A 类操作 100 万个请求 / 月 $4.50/100万个请求
B 类操作 1000 万个请求 / 月 $0.36/100万个请求
出口流量 全球免费① 全球免费①

注解①
通过以下方式访问R2时,不收取数据传输(出口)费用:

  • 通过Workers API直接访问
  • 通过S3兼容API访问
  • 通过r2.dev子域名访问

    API有不同操作,这里指的是下载/获取(GET操作)数据,为出口流量;上传(PUT操作)数据,为入口流量(不收费),计入A 类操作。

出口流量(Egress):数据从R2存储桶传输到公共互联网产生的流量。

在大多数云服务中,比如AWS S3或腾讯云COS,当用户下载文件时,数据从存储服务传输到用户的设备,通常会涉及到出口流量费用。而Cloudflare R2的特殊之处在于,如果通过其特定的方式访问数据(比如通过Workers、S3 API或r2.dev域名),出口流量是免费的。

  • 传统云存储计费模式(如AWS S3):
    当用户请求资源(如图片)时 → 数据经云厂商网络出口到公网 → 按GB收费
  • Cloudflare R2的革新模式
    当用户请求资源(如图片)时 → 数据经Cloudflare全球网络内部路由 → 零费用

目前我的Cloudflare R2图床存储桶已经有2.43k张图片,空间才用了不到500M,而且我的图片全都是没经过压缩直接上传的。
10G容量看起来貌似挺小的,但作为个人图床的话完全够用了。

2.R2账户配置

登录Cloudflare账号,点击R2对象存储,这里需要添加一个付款方式才能使用,支持信用卡或PayPal,添加完成后,点击 将R2订阅添加到我的帐户 即可。

  • 实测支持国内银联信用卡,没有信用卡也可以用PayPal账户(可绑定普通银行卡)
  • 只有当你使用量超过每月限额时,超额部分才会收费。

3.存储桶创建

点击创建存储桶

存储桶名称设置一个简单好记的(比如blog),存储桶类型选择标准,如果要兼顾国内访问,存储桶地区最好选择亚太地区

4.通过后台上传文件

后台支持文件和文件夹上传

直接拖拽上传即可

5.通过r2.dev子域名访问

上传图片到存储桶后,存储桶需要开启公共URL访问(也就是Cloudflare R2提供的r2.dev子域名访问),这样我们才能通过链接访问图片

在存储桶页面,点击设置

往下拉,找到R2.dev 子域选项,点击允许访问

确认允许

在存储桶中点击刚上传的图片,可以看到图片已经有对应的链接了,浏览器访问这个URL就可以查看图片

6.使用自定义域访问

前面我们为存储桶开启公共URL访问时,官方已经明确提示:公共存储桶 URL 有速率限制。请将自定义域连接到存储桶来支持生产工作负载。

根据官方文档Public buckets · Cloudflare R2 docs的说明,通过自定义域访问域有一个很重要的好处,就是允许使用Cloudflare Cache来加速对 R2 存储桶的访问,这样能显著提高我们图片的加载速度。

Cloudflare的核心优势在于其全球分布的边缘节点网络,系统会根据用户的地理位置,通过智能路由自动从最近的节点提供数据,这种动态分发机制能显著降低延迟,提升访问速度与稳定性。

要想使用自定义域访问,这里我们需要有一个自己的域名,没有的话可以到这个比较实惠的服务商购买:
2025年NameSilo域名购买与使用全流程 | 晚阳Crown
域名买好后,要将域名托管到Cloudflare:
Cloudflare托管域名| 晚阳Crown

注意,要将你买的域名托管到Cloudflare后,才能进入下文的操作。

在存储桶页面,点击设置

往下拉,找到添加自定义域,设置访问链接,可以设置成img开头,比如我设置的就是img.oneyangcrown.top,然后点击继续

因为这个链接指向的都是我们的图床资源,设置一个特定的名字比较好区分,当然你也可以根据喜好自己设定一个。

Cloudflare会自动为我们已经托管在其上的域名添加DNS记录,点击连接域

这里需要等待生效

在域名的DNS记录中可以看到刚才自动添加的记录

状态变为活动后就可以正常使用了

查看我们刚上传的图片,访问链接已经变成我们自定义的链接了

有了自定义域后,前面通过R2.dev子域访问的方式我们就不需要了,可以把它关了。

7.通过rclone+S3 API便捷操作云文件

Rclone是一个命令行程序,用于管理云存储上的文件,支持 70 多种云存储产品,通过使用rclone+S3 API的方式,我们可以更方便地对存储桶中的文件进行增删改查等操作。

7.1 配置rclone

安装rclone后,可以在命令行输入rclone查看是否已安装。

接下来要对rclone进行配置,首先到Cloudflare R2后台创建一个API令牌,如下图所示,点击API>管理API令牌

点击创建API令牌

设置令牌名称,权限设置为对象读和写,其它的安全配置按需设置或者保持默认,然后点击创建API令牌

API令牌创建成功后,会显示凭据信息,将内容填入后文rclone的配置文件中即可

❗注意:API令牌凭据信息要保管好,避免暴露给其他人,导致数据丢失和存储桶被盗刷的风险。

这里访问密钥只会显示一次,如果忘了,可以重新更新一下:点击轮转或在编辑页面里点击更新

rclone配置文件本地位置:如果没有该文件的话自行创建一个

1
C:\Users\你的用户名\AppData\Roaming\rclone\rclone.conf

配置内容格式如下:provider提供商要设置为Cloudflare,access_key_id、secret_access_key、endpoint填入前面申请的API令牌对应的凭据信息即可

1
2
3
4
5
6
7
[cf]
type = s3
provider = Cloudflare
access_key_id = xxxxxx
secret_access_key = xxxxxx
endpoint = https://xxx.r2.cloudflarestorage.com
acl = private

配置文件可以添加多个配置,如下图所示:
其中方括号中自定义的名字就是每个配置的别名,通过命令行访问云存储时,需要指定一个配置(也就是输入对应的别名)

通过rclone config命令也可以查看和操作我们的配置:

7.2 文件查询

查看云端目录树结构:

1
rclone tree <配置文件中自定义的别名>:<你的存储桶名>

例:

列出指定路径所有对象的大小和文件名:

1
2
rclone ls <配置别名>:<存储桶名>/路径
如果文件不存在,那么没有任何输出

例:

7.3 文件上传

1
2
3
4
rclone copy <本地路径> <配置别名>:<存储桶名>/云端路径

可选参数:
+ 查看实时传输统计信息:-P(注意是大写P) 或 --progress

注意:如果路径有空格的话要用引号””包起来

7.3.1 批量上传

比如我们要将桌面bg文件夹中所有图片上传到云端存储桶根目录

那么命令就如下图所示:加上-P参数可以实时查看上传进度

❗注意:这里你指定的本地路径下所有的文件(不限格式)和文件夹都会被上传,所以要确保你指定本地路径下都是你要上传的文件,避免错误上传其它文件从而白白消耗了存储桶的免费容量和额度。

通过前面的tree命令可以查看到文件全部上传成功了

回到Cloudflare R2后台,也可以看到刚才上传的文件

7.3.2 上传到指定路径

当然,我们也可以上传到存储桶的指定目录下

  • 比如,这里我指定的云端路径是blog\mybg
  • 也就是上传到我的blog存储桶的mybg文件夹下
  • 如果云端目录不存在则会自动创建

Cloudflare R2后台可以看到对应目录

7.4 文件删除

1
2
3
4
5
6
7
rclone delete <配置别名>:<存储桶名>/云端路径

可选参数:
测试模式(进行无永久性更改的试运行)
-n, --dry-run
交互模式(会以问答模式和你确认要执行的操作)
-i, --interactive

测试模式,顾名思义就是仅供测试,不会真的执行删除操作

  • 使用这个参数可以先测试删除操作是否能够执行成功,同时会返回如下图所示的测试删除文件列表提示
  • 通过返回的测试删除文件列表,我们也可以查看这些文件是不是我们要删除的
  • 如果返回空,说明要删除的云端文件不存在

交互模式,如下图所示,会给你几个操作选项,输入选择后按回车即可

1
2
3
4
5
y) 是,删除这个文件
n) 否,跳过这个文件
s) 跳过所有删除操作且不再询问
!) 执行所有删除操作且不再询问
q) 现在退出rclone

如果你指定的路径下有多个文件,那么在对每个文件执行删除操作前都会先和你确认操作

如果我们没有指定具体路径,那么删除操作就是清空整个存储桶,如下图所示:存储桶中的文件都被清空了

所以执行删除操作要谨慎,在进行批量删除时,可以先用测试模式检查要删除的文件列表,防止误删。
更保险点的话,可以在执行真删除操作时,开启交互模式,对每个删除操作进行手动确认。

7.5 查看文件或文件夹大小

通过rclone查看文件夹大小:

1
rclone size 云存储名称:文件or文件夹路径
  • --human-readable:将文件大小转换为易读的单位(如 KB/MB/GB),而不是直接显示原始字节数。此参数为全局参数,rclone size命令默认会启用此转换功能,其它rclone命令(如 copy/sync/ls 等)需要手动启用。

输出效果示例:

1
2
3
4
rclone size cloudflare_r2:my-bucket /path/to/local
// 输出如下
Total objects: 127
Total size: 10.062 MiB (10550974 Byte)

7.6 备份数据

前面已经介绍了Rclone的一些常用操作,这里我们还可以使用 Rclone 来将 R2 存储桶的数据备份到本地硬盘。

使用rclone sync同步存储桶数据:同步操作会确保存储桶数据和备份数据保持一致

1
rclone sync cloudflare_r2:my-bucket /path/to/local/backup

需要注意的是,rclone sync是一个 一次性的同步操作,它只会在你执行命令时同步一次文件,而不是像实时同步工具那样持续运行并自动检测变化。

使用rclone copy增量备份存储桶数据:这条命令只会复制新文件或者修改过的文件,不会删除本地文件。

1
rclone copy cloudflare_r2:my-bucket /path/to/local/backup

使用rclone check命令来验证备份是否完整:

1
rclone check cloudflare_r2:my-bucket /path/to/local/backup

如果你希望定期自动备份 R2 数据到本地,可以将 Rclone 命令添加到定时任务中,比如Linux/Mac/Windows/NAS等设备都有相关的定时任务功能。

另外,我们可以将OneDrive、坚果云、百度云或者你自己的NAS等同步文件夹作为备份目的地,这样可以多一份云存储备份,从而保障数据安全。

8.PicGo设置

PicGo,软件安装完成后在图床设置中选择Amazon S3,点击+号添加一个配置。

图中红字标识的项目,对应前面在Cloudflare R2后台创建API令牌的凭据信息

文件路径,就是云端路径,这里我设置的是根目录,如果你想指定目录,比如img目录下,那么可以设置为img/{fullName}

最后,在PicGo设置中,开启时间戳重命名,这样能够确保上传的每一张图片名字都是唯一的:

9.使用经验补充分享

建议将图片压缩后上传,既能节省存储空间,又能提升网站加载速度。可以使用TinyPNG这个工具,压缩后,画质几乎看不出损失。

在 管理账户>账单>订阅 中,可以查看到每月的收费账单,其中R2 Paid就是R2云存储服务的账单

只要总存储容量不超过10GB就可以一直免费使用,只存图片的话10G可以用非常久,其它的这些A、B类操作每月正常使用几乎不可能超过免费额度,除非你的存储桶被人盗刷了

10.后记

至此,我的博客完全实现了Cloudflare全站式托管:

[Cloudflare全站托管体系]
├── 应用层
│ └── Cloudflare Pages(网站托管 — Hexo静态博客)
├── 存储层
│ └── Cloudflare R2(对象存储引擎 — 图床)
└── 网络基础设施层
├── Cloudflare DNS(智能域名解析)
├── Cloudflare CDN(全球加速+安全防护)
└── Cloudflare SSL/TLS(全域加密 — 自动化证书管理)

最后,请允许我用程序员的方式致谢:console.log('Cloudflare, 我亲爱的赛博房东')


✨ 感谢阅读!因不同平台审核机制限制,本文将只在我的个人博客保持更新优化,欢迎收藏获取最新内容及独家资料:晚阳Crown的博客