图片存储从七牛云迁移到 Cloudflare R2 全记录
最近把博客的图片存储从七牛云迁移到了 Cloudflare R2,也踩了几个坑,详细记录一下。
先说一下背景。我的域名是在 name.com 购买的,之前托管在腾讯云 DNSPod,图片存储用的是七牛云,七牛云我用好多年了,现在决定迁移到 Cloudflare R2,主要有几个原因:
七牛云的免费 SSL 证书每三个月就要手动更新一次,太麻烦了,容易搞忘。另外七牛云现在对 HTTPS 开始收费了,既然有免费的更好的替代方案,那肯定要试试。
Cloudflare 作为全球最大的 CDN 服务商之一,稳定性和安全性都更有保障,而且 R2 存储每个月有 10GB 的免费额度,完全够用了,后续不够再花钱嘛。
值得一提的是,Cloudflare R2 最大的优势是不收取出站带宽费用。传统云存储服务商的流量费用往往是大头,而 R2 只收存储费用,这对于图片访问量大的网站来说是个很大的利好。

潜在的问题:国内访问速度
迁移前需要考虑一个问题,Cloudflare 的节点主要在境外,国内用户访问可能不如七牛云那么快。
但都是毫秒级的差别,肉眼基本感知不到。我实际体验下来,加载还是很快的,基本无感。如果你的用户主要在海外,那 Cloudflare 绝对是首选。
第一阶段:在 Cloudflare 创建 R2 存储桶
如果你没有账号,点击 Sign Up 注册;如果有,直接 Log In。

首先需要在 Cloudflare 创建一个 R2 存储桶(Bucket)来存放图片。这一步只是创建一个新的存储空间,不会影响现有的图片访问。
登录 Cloudflare 控制台后,在左侧菜单找到「Storage & Databases」,点击下面的「R2 Object Storage」,再点击「Overview」。

这里有个前置条件:R2 每个月有 10GB 的免费存储额度,但需要先绑定支付方式才能使用。可以绑定一张信用卡(VISA 或 MasterCard)或者 PayPal 账户。只要不超过免费额度就不会扣费,只是用来验证身份的。

绑定支付方式后,点击「Create Bucket」创建存储桶:

- Bucket name:输入一个好记的名字
- Location:保持默认的「Automatic」即可,Cloudflare 会自动选择最优的存储位置
点击「Create Bucket」完成创建。

获取 API 密钥
这一步非常重要。回到 R2 的主界面,在右侧找到 API Token,有个「Manage 」

然后点击「Create Account API token」。

配置 API Token:
- Token name:随便填一个便于识别的名字
- Permissions:选择「Admin Read & Write」,这样才能进行文件的上传和管理操作


创建成功后,页面有三个重要参数,保存下来,关闭页面后就看不到了
- Access Key ID
- Secret Access Key
- Endpoint
这三个参数后面配置 PicGo / ipic 等上传工具会用到。
第二阶段:迁移七牛云的图片
接下来要把七牛云里现有的图片迁移到 Cloudflare R2。有好几种方法,我用的是工具可视化搬运。
从七牛云下载图片
首先用七牛云官方的图形化工具 Kodo Browser 下载图片。下载地址:https://developer.qiniu.com/kodo/5972/kodo-browser

安装后登录需要输入七牛云的 AccessKey 和 SecretKey,这两个参数在七牛云后台的密钥管理里可以找到。

登录后可以看到所有的存储桶,进入存放图片的那个桶,选中需要下载的文件。

如果文件比较多,一定要拉到最后一页再点「全选」,否则只会选中当前页显示的文件(不要问我怎么知道的,都是坑)。

上传到 Cloudflare R2
本来 Gemini 给我的方案是直接在 Cloudflare 控制台上传,页面上确实有个 Upload 按钮,把文件拖进去就行。
但发现一个问题:它每次只能上传 100 个文件,我有上千张图片,分批拖进去太麻烦了,肯定不现实。文件少的可以考虑这种方法。

后来Gemini给我推荐了一个工具:Cyberduck。一个免费的文件管理器,支持各种云存储协议,没有文件数量限制。下载地址:https://cyberduck.io/
打开 Cyberduck 后,点击右上角「新建连接」:
- 在顶部下拉菜单中选择「Amazon S3」(R2 兼容 S3 协议)
- 服务器:填写之前保存的 Endpoint,但要去掉
https://前缀,只填域名部分 - 访问密钥:填写之前保存的 Access Key ID
- 访问私钥:填写之前保存的 Secret Access Key

连接成功后就能看到刚才创建的存储桶了。进入存储桶,然后把本地下载的图片文件直接拖进去,所有文件会自动排队上传。


补充说明:两边存储桶的名字不需要一致。只要保证子域名和文件路径一致,就能实现无缝切换。可以理解为用户通过子域名(相当于电话号码)来访问你的图片,你只是把仓库换了个地方,电话号码不变,用户照样能找到。
第三阶段:绑定自定义域名
图片上传完成后,需要把子域名绑定到 R2 存储桶,这样才能通过原来的地址访问图片。
在 R2 控制台找到刚才创建的存储桶,进入「Settings」标签页,找到「Custom Domains」,点击右边的加号,输入要绑定的子域名。

遇到的坑:域名必须托管在 Cloudflare
到这一步,我点击确认是无法成功的,这又是另一个坑。
That domain was not found on your account. Public bucket access supports only domains on your account and managed through Cloudflare DNS.
这是因为 Cloudflare R2 的自定义域名功能要求域名必须托管在 Cloudflare 才能使用。也就是说,整个域名的 DNS 解析服务需要放到 Cloudflare,它才能验证域名所有权并自动颁发 SSL 证书。
我的域名之前托管在腾讯云 DNSPod,所以需要把域名"搬家"到 Cloudflare。
第四阶段:域名托管迁移到 Cloudflare
把域名托管迁移到 Cloudflare 其实也有好处,可以享受免费的 CDN 加速和 DDoS 防护。
关于 ICP 备案的问题
迁移前我比较担心一个问题,域名是在国内备案的,换到 Cloudflare 会不会影响备案?
查了一下资料,工信部主要检查的是主域名解析出来的 IP 地址是否在中国大陆的服务器上。所以关键在于 Cloudflare 的代理设置:
- 灰云(DNS only):只做 DNS 解析,流量直连源服务器,IP 还是国内的 → 备案不受影响
- 橙云(Proxied):流量走 Cloudflare 代理,用于 CDN 加速
所以迁移的时候需要注意,主域名和需要备案检查的子域名要设置成灰云,只有图片等静态资源的子域名才设置成橙云走代理。
另外,邮件相关的记录(MX 记录)也必须设置成灰云,否则邮件收发会出问题。

迁移步骤
- 在 Cloudflare 添加域名
登录 Cloudflare 控制台,点击「Add a Site」,输入你的根域名。选择最下面的 Free 套餐,点击 Continue。

- 检查 DNS 记录
Cloudflare 会自动扫描你现有的 DNS 记录并导入。这一步要仔细检查:
- 主网站域名(www 或 @)→ 关闭代理(灰云)
- 图片子域名 → 开启代理(橙云)
- MX 记录 → 关闭代理(灰云)
Ps:如果不考虑国内备案的情况就不需要关闭主域名的代理。

- 修改域名的 DNS 服务器
Cloudflare 会给你两个新的 DNS 服务器地址,类似:
xxxx.ns.cloudflare.com
yyyy.ns.cloudflare.com
去域名购买商那里修改 DNS 服务器。以 name.com 为例:
- 在域名管理列表找到对应域名,点击「管理」
- 找到「DNS 服务器」选项,点击「修改」
- 选择「自定义 DNS」
- 删掉原来腾讯云的 DNS 地址
- 填入 Cloudflare 给的两个新地址
- 等待激活
通常几分钟到几小时就能完成,最长可能需要 24 小时。Cloudflare 会发邮件通知你域名已激活,控制台状态也会变成绿色的「Active」。

重新绑定自定义域名
域名状态变成 Active 后,再次进入 R2 存储桶的 Settings → Custom Domains → Connect Domain,输入图片子域名。这次就不会报错了,Cloudflare 会自动配置好 DNS 记录并颁发 SSL 证书。
状态会先显示「Initializing」,几分钟后变成「Active」就表示配置成功了。

如何验证迁移是否成功
测试一下,打开一张旧图片链接,按 F12 打开开发者工具,切换到 Network 标签页,点击图片请求,查看 Headers:
如果看到:
Server: openresty
X-Qnm-Cache: Hit
说明还是在走七牛云,可能是本地 DNS 缓存了旧记录,等几分钟或者清一下缓存就好。
如果看到:
Server: cloudflare
迁移成功!

看了一下我博客的内容都能正常显示,图片加载速度也不慢。
PicGo 配置
迁移完成后,如果你用 PicGo 或者 ipic 这种作为图床上传工具,也需要更新配置。
首先安装 S3 插件:在 PicGo 的插件设置中搜索「s3」,安装 picgo-plugin-s3(版本 1.5.1)。
然后在图床设置中选择「Amazon S3」,配置参数:
| 参数 | 值 |
|---|---|
| Access Key ID | 之前保存的 Access Key ID |
| Secret Access Key | 之前保存的 Secret Access Key |
| Bucket | 存储桶名称 |
| Region | auto |
| Endpoint | https://xxxx.r2.cloudflarestorage.com |
| URL Prefix | 自定义域名 |
| Path Style Access | 关闭 |
| Disable Bucket Prefix | 开启 |
注意:Cloudflare R2 不支持 ACL 设置,如果配置中有 ACL 相关选项,需要留空或删除,否则会报错。

七牛云那边需要处理吗
不需要。DNS 解析已经指向 Cloudflare R2 了,七牛云那边就没有流量了。可以保留一段时间观察,确认没问题后再考虑是否清理。判断访问指向哪个服务,完全是由 DNS 解析决定的。
总结
整个迁移过程的关键步骤:
- 在 Cloudflare 创建 R2 存储桶,获取 API 密钥
- 用 Kodo Browser 从七牛云下载图片
- 用 Cyberduck 批量上传到 R2
- 把域名托管迁移到 Cloudflare(这是使用自定义域名的前提)
- 绑定自定义域名到 R2 存储桶
- 更新 PicGo 等上传工具的配置
最大的坑是 R2 的自定义域名必须域名托管在 Cloudflare 才能用,。另外迁移域名托管时要注意 ICP 备案的问题,主站记录一定要设成灰云。
整体来说,Cloudflare R2 作为免费图床方案还是很香的,10GB 免费存储 + 无出站流量费用。
💡 AI 工具的爆发,让普通人也能快速做出产品。
但如何做?如何变现?如何真正走向海外市场?
👇 想了解更多 AI 编程 & 出海实战信息,扫码添加好友了解更多
🔗 更多教程请访问 ipengtao.com
文章评论