找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2860

积分

0

好友

366

主题
发表于 昨天 13:22 | 查看: 4| 回复: 0

最近将个人博客的图片存储从使用了十多年的七牛云迁移到了 Cloudflare R2,过程中遇到了不少预料之外的“坑”。如果你也在考虑类似的迁移,或者对 Cloudflare R2 的免费存储方案感兴趣,这篇实战记录或许能帮你少走弯路。

迁移背景与动机
我的域名是在 name.com 购买的,DNS 托管在腾讯云 DNSPod,而博客图片则一直存放在七牛云。从大学开始使用七牛云,算下来已有十多年。早期其价格还算亲民,但如今成本感觉上涨了不少,并且需要进行视频认证,流程略显繁琐。

另外,七牛云提供的免费 SSL 证书每三个月就需要手动更新一次,极易遗忘,导致网站出现安全警告。加之目前业务有出海需求,接触 Cloudflare 较多,其 R2 对象存储每月提供 10GB 的免费额度(包含免费存储空间与无出口流量费用),对于个人博客来说完全够用,后续即使超出免费额度,成本也相对透明。于是,迁移计划便提上了日程。

七牛云 Kodo 与 Cloudflare R2 免费额度对比图

潜在问题:国内访问速度
迁移前,一个首要的顾虑是访问速度。Cloudflare 的节点主要分布在海外,国内用户访问其存储的资源,理论上可能不如使用国内 CDN 优化的七牛云快。

不过,实际体验下来,这种延迟差异在毫秒级,对于图片加载这种场景,肉眼基本感知不到。我的博客图片加载速度依然很快。如果你的用户群体主要在海外,那么 Cloudflare 无疑是更优的选择。

第一阶段:在 Cloudflare 创建 R2 存储桶

如果你还没有 Cloudflare 账号,需要先注册;已有账号则直接登录。

Cloudflare 注册/登录界面

登录 Cloudflare 控制台后,我们需要先创建一个 R2 存储桶(Bucket)。这一步仅仅是新建一个存储空间,不会影响现有图片的访问。

在左侧菜单找到 Storage & Databases,点击其下的 R2 Object Storage,然后进入 Overview 概览页。

Cloudflare R2 概览与定价页面

重要前置步骤:绑定支付方式
R2 虽然提供免费额度,但需要先绑定支付方式(信用卡 VISA/MasterCard 或 PayPal)才能激活使用。这只是用于身份验证和超出免费额度后的扣费,只要不超额就不会产生费用。

Cloudflare R2 绑定支付方式界面

支付方式绑定成功后,点击 Create Bucket 按钮开始创建存储桶。

Cloudflare R2 创建存储桶入口

  • Bucket name:输入一个易于识别的名称,例如 my-blog-images
  • Location:保持默认的 Automatic 即可,Cloudflare 会自动选择最优的存储区域。

配置完成后,点击 Create Bucket

创建 R2 存储桶的具体配置界面

获取 API 访问密钥

这是后续用工具管理文件的关键。回到 R2 的主界面,在右侧的 Account Details 区域找到 API Tokens,点击旁边的 Manage 按钮。

R2 存储桶管理主界面

进入 API Tokens 管理页面后,点击 Create Account API token。账户级令牌更适合生产环境,因为它不会因用户离开组织而失效。

R2 API Tokens 管理页面

配置 API Token:

  • Token name:填写一个便于记忆的名字,例如 PicGo-Write
  • Permissions:选择 Admin Read & Write,以便拥有完整的存储桶和文件管理权限。

创建账户API令牌的权限配置界面

点击创建后,页面会显示三个至关重要的参数,务必立即保存,关闭页面后将无法再次查看完整的 Secret Key。

  • Access Key ID
  • Secret Access Key
  • Endpoint

API令牌创建成功后的详细信息展示

这三个参数在后续配置图床上传工具(如 PicGo)时必不可少。你可以在 API Tokens 列表页看到已创建的令牌。

R2 账户API令牌列表

第二阶段:迁移七牛云的历史图片

接下来需要把七牛云上已有的图片文件搬运到新的 Cloudflare R2 存储桶中。我采用了下载后上传的可视化方案。

从七牛云下载图片
首先使用七牛云官方的图形化工具 Kodo Browser 来下载文件。你可以从其官方下载页面获取对应系统的版本。

Kodo Browser 下载页面

安装后启动,选择 Access Key 登录,需要输入七牛云后台获取的 AccessKey 和 SecretKey。

Kodo Browser 登录界面

登录后,在左侧选择存放博客图片的存储桶,进入文件列表。

Kodo Browser 文件管理界面

重点提醒:如果文件数量众多,务必先翻到最后一页,再点击“全选”按钮。否则,工具默认只选中当前页显示的文件,会导致漏选。

Kodo Browser 批量选择文件界面

选中所有需要迁移的文件后,点击“下载”按钮,将它们保存到本地。

上传到 Cloudflare R2
最初我尝试直接在 Cloudflare 控制台界面上传,但很快发现限制:网页端每次最多只能上传 100 个文件。对于拥有上千张图片的博客来说,这显然不现实。

于是,我转向了更专业的桌面工具—— Cyberduck。这是一款免费且支持多种云存储协议(包括 S3)的文件管理器,没有文件数量限制。你可以从其官网下载。

打开 Cyberduck 后,点击右上角的 新建连接 按钮:

  1. 在协议下拉菜单中选择 Amazon S3(因为 Cloudflare R2 兼容 S3 协议)。
  2. 服务器:填写之前保存的 Endpoint,但需要去掉 https:// 前缀,只保留域名部分(例如 xxxx.r2.cloudflarestorage.com)。
  3. 访问密钥 ID:填写之前保存的 Access Key ID。
  4. 访问私钥:填写之前保存的 Secret Access Key。

Cyberduck 新建 S3 连接配置界面

连接成功后,就能看到在 Cloudflare 创建的存储桶了。双击进入存储桶,然后将之前从七牛云下载到本地的整个图片文件夹直接拖入 Cyberduck 窗口。软件会自动排队上传所有文件。

Cyberduck 文件上传过程界面

Cyberduck 文件上传完成界面

重要补充:两边的存储桶名称不需要一致。只要保证最终用于访问图片的自定义域名和文件在存储桶内的路径保持一致,即可实现无缝切换。这类似于你换了个仓库存放货物,但客户的收货地址(自定义域名)没变,他们依然能拿到东西。这类文件迁移和同步操作,常常是运维/DevOps/SRE工作中的一部分。

第三阶段:绑定自定义域名

图片上传完毕后,需要将你博客原来用于访问图片的子域名(例如 img.yourdomain.com)绑定到这个 R2 存储桶,这样原有的图片链接才会生效。

在 R2 控制台,进入你创建的存储桶,切换到 Settings 标签页,找到 Custom Domains 选项,点击右侧的加号,输入你要绑定的子域名。

R2 存储桶自定义域名设置界面

遇到的第一个大坑:域名必须托管在 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,因此需要先进行域名托管的迁移。

第四阶段:将域名 DNS 托管迁移至 Cloudflare

将域名 DNS 迁移到 Cloudflare 并非坏事,你可以顺便享受到其免费的全球 CDN 加速和 DDoS 防护。

关于国内 ICP 备案的注意事项
迁移前,我担心一个关键问题:域名是在国内备案的,更换 DNS 服务商到 Cloudflare 会影响备案吗?

查阅资料后了解到,工信部备案检查主要关注的是主域名解析出的 IP 地址是否位于中国大陆的服务器。关键在于 Cloudflare 的代理设置:

  • DNS only(灰云):仅做 DNS 解析,流量直连你的源服务器。如果源服务器 IP 在国内,备案不受影响。
  • Proxied(橙云):流量经过 Cloudflare 全球网络代理,常用于加速和安全防护。

因此,在迁移时需注意:主域名(@ 记录)和用于备案检查的 www 子域名,必须设置为“DNS only”(灰云)。只有像图片这类静态资源使用的子域名,才开启代理(橙云)。另外,邮件相关的 MX 记录也必须设置为“DNS only”,否则可能导致邮件无法正常收发。

Cloudflare DNS 代理状态说明图

迁移步骤

  1. 在 Cloudflare 添加站点:登录控制台,点击 Add a Site,输入你的根域名(例如 yourdomain.com)。选择 Free 免费套餐,点击 Continue。
    Cloudflare 添加站点界面
  2. 检查并配置 DNS 记录:Cloudflare 会自动扫描并导入你现有的 DNS 记录。这一步需要仔细核对和修改:
    • 主站域名记录(@www) → 关闭代理(设为 DNS only)。
    • 图片子域名记录(如 img) → 开启代理(设为 Proxied)。
    • MX 等邮件记录 → 关闭代理(设为 DNS only)。
      Cloudflare DNS 记录管理界面
  3. 修改域名 DNS 服务器:Cloudflare 会提供两个新的 DNS 服务器地址(形如 xxx.ns.cloudflare.comyyy.ns.cloudflare.com)。你需要登录到你的域名注册商后台(例如 name.com),找到域名管理中的 DNS 服务器设置,将原有的 DNS 服务器替换为 Cloudflare 提供的这两个地址。
  4. 等待 DNS 生效:更改通常需要几分钟到几小时生效,最长可能达 24 小时。生效后,Cloudflare 会邮件通知,且控制台域名状态会变为绿色的 Active
    Cloudflare 站点激活成功页面

重新绑定自定义域名
域名状态变为 Active 后,再次回到 R2 存储桶的 Settings → Custom Domains,输入你的图片子域名。这次应该可以成功绑定了。状态会先从 Initializing 变为 Active,表示配置完成,SSL 证书也已自动部署。

R2 存储桶自定义域名配置成功界面

如何验证迁移是否成功?

打开你博客中任意一张旧图片的链接,按 F12 打开浏览器开发者工具,切换到 Network(网络)标签页,刷新后点击该图片的请求,查看响应头(Headers)。

如果看到:

Server: openresty
X-Qnm-Cache: Hit

说明请求仍在走七牛云,可能是本地或运营商 DNS 缓存未更新,等待一段时间或清除 DNS 缓存即可。

如果看到:

Server: cloudflare

那么恭喜你,迁移成功了!所有的请求都已指向新的 Cloudflare R2 存储。

验证迁移成功的HTTP响应头截图

检查你的博客,所有图片应该都能正常显示,且加载速度无明显下降。

更新 PicGo 配置

迁移完成后,如果你使用 PicGo、iPic 等工具进行图床上传,也需要更新配置。

以 PicGo 为例:

  1. 安装 S3 插件:在 PicGo 的插件设置中搜索 s3,安装 picgo-plugin-s3(作者 wayjam,版本 1.5.1)。
    PicGo 插件搜索与安装界面
  2. 在图床设置中选择 Amazon S3,并填写以下参数:
参数
Access Key ID 之前保存的 Access Key ID
Secret Access Key 之前保存的 Secret Access Key
Bucket 你的 R2 存储桶名称
Region auto
Endpoint https://xxxx.r2.cloudflarestorage.com (你的完整 Endpoint)
URL Prefix https://img.yourdomain.com (你的自定义域名)
Path Style Access 关闭
Disable Bucket Prefix 开启

特别注意:Cloudflare R2 不支持 ACL(访问控制列表)设置。如果配置中有 ACL 相关选项(如“设置存储桶/对象的访问权限”),请留空或删除该配置项,否则可能导致上传失败。

七牛云那边需要处理吗?

不需要立即处理。因为 DNS 解析记录已经修改并指向了 Cloudflare,七牛云那边的存储桶将不再有访问流量。你可以保留七牛云的存储桶和文件观察一段时间,确认一切稳定后,再根据自身需求决定是否清理。访问流向完全由 DNS 解析控制。

总结与关键点回顾

整个从七牛云到 Cloudflare R2 的迁移流程,可以概括为以下几个关键步骤:

  1. 准备阶段:在 Cloudflare 创建 R2 存储桶,获取至关重要的 API 密钥 (Access Key ID, Secret Access Key, Endpoint)。
  2. 数据迁移:使用七牛云 Kodo Browser 下载历史图片文件,然后通过支持 S3 协议的桌面工具(如 Cyberduck)批量上传至 R2。
  3. 域名迁移这是使用 R2 自定义域名功能的前提。将域名的 DNS 托管迁移至 Cloudflare,并注意区分记录代理状态以符合国内备案要求。
  4. 域名绑定:在 R2 存储桶设置中绑定你的图片子域名。
  5. 工具更新:更新 PicGo 等图床上传工具的配置,指向新的 R2 存储。

本次迁移最大的“坑”在于 R2 的自定义域名必须要求域名托管在 Cloudflare,这间接导致了 DNS 服务的迁移。另外,在迁移 DNS 时需格外留意 ICP 备案邮件记录 的代理设置。

整体而言,Cloudflare R2 每月 10GB 免费存储 + 零出口流量费的策略,对于个人开发者、博客作者来说极具吸引力,其与 S3 协议的良好兼容性也大大降低了使用门槛。这次迁移实战中遇到的挑战和解决方案,或许也能为你在处理类似云原生/IaaS资源时提供一些思路。希望这篇记录对你有帮助,更多技术实践与踩坑心得,也欢迎来云栈社区开发者广场交流分享。




上一篇:微信小程序实战进阶:一站式实战开发指南 JavaScript/WXSS/云开发核心技能精讲与项目实训
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-9 03:35 , Processed in 0.363959 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表