迁移到 Cloudflare

2026-05-22T12:00:00-05:00 | 5分钟阅读

@

起因

我另一个项目 team_workout_data 是部署在 Cloudflare Workers 上的,博客这边一直是 S3 + CloudFront。两套不同的工具链让我每次操作都要切换思维 —— AWS 的控制台界面 + Cloudflare 的 dashboard,分别管理账单、缓存策略、DNS。

加上 AWS 每月 $1-2 的开销虽小但是持续;Cloudflare Pages 个人博客流量基本都在免费额度里。所以问 Claude:

我在思考,需不需要把现在的网页从 s3+cloudfront 放到和我 team_workout_data 一样部署的 cloudflare。或者可以两边都放,因为 cloudfront 中国可以直接浏览但是 cloudflare 被墙了。

Claude 先纠正了我对"被墙"的简单二分

“CloudFront 通、Cloudflare 不通"这个理解不太准确。两者都没有中国境内的免费边缘节点。Cloudflare 的 *.workers.dev *.pages.dev 这类官方子域确实经常被针对性封锁,但如果用自定义域名 + Cloudflare DNS,访问性和 CloudFront 默认子域基本一个量级。

也就是说,迁不迁的关键不是"国内能不能访问”,而是"工具链统一 + 月成本"。决定迁。

域名

迁到 Cloudflare 必须有自定义域名(避免 *.pages.dev 被墙)。我之前没买过域名,让 Claude 给点建议:

我没有域名,需要单独购买。和 leona shao 相关,可以是英文/中文拼音的谐音梗,或者反应我博客内容的名字。

Claude 给了一堆候选,第一轮主推 leonashao.com 但都被我嫌弃太普通。第二轮转向拼音玩法,发现 shaohua 这个开头有三个完全不同的解读:

拼音中文意思
shǎo huā少花节俭、不乱花
sháo huá韶华古典诗意,意为"美好年华"
Shào Huá邵华我姓邵的话也能解

最终敲定 shaohua2kuaiqian.com——“少花2块钱”。自带 logo、自带价值观、记忆点很强。在 Cloudflare Registrar 买的(成本价,~$9.15/年)。

Cloudflare Pages 设置

部署方式选了 Git 集成(push 到 main 自动构建),不需要本地 wrangler。

实际操作的步骤:

  1. Cloudflare 控制台 → Workers & Pages → Create application → Pages tab(不是 Workers!)→ Connect to Git
  2. 授权 GitHub(弹窗装 Cloudflare app)→ 选 repo hugo_leona
  3. 填构建配置
字段
Project nameshaohua2kuaiqian
Production branchmain
Framework presetHugo
Build commandgit submodule update --init --recursive && hugo --gc --minify
Build outputpublic
Environment variablesHUGO_VERSION = 0.156.0

build command 显式加了 git submodule update --init --recursive —— theme 是 submodule,否则 Cloudflare 构建时会找不到 dream 主题报错。HUGO_VERSION 锁死和本地一致的 0.156.0 版本。

第一次 deploy ~2 分钟,输出绿色 ✅ Success。

  1. 加自定义域名:项目页 → Custom domains → 输入 shaohua2kuaiqian.com → “Complete DNS setup”

因为域名在 Cloudflare Registrar 买的,DNS 也在 Cloudflare,“Complete DNS setup” 会自动写 CNAME 记录,几分钟内 SSL 证书签发完成。

DNS 传播的坑

证书签好之后,手机能访问 shaohua2kuaiqian.com,但 Mac 上 Chrome 死活打不开 —— 报 DNS_PROBE_FINISHED_NXDOMAIN

各种刷新缓存(sudo dscacheutil -flushcache + chrome://net-internals/#dns 清 host cache)都不管用。Claude 让我用 dig 看实际解析:

dig shaohua2kuaiqian.com +short
# 空

dig @1.1.1.1 shaohua2kuaiqian.com +short
# 172.64.80.1   ← Cloudflare 的 IP,正确

scutil --dns | grep nameserver | head -5
# nameserver[2] : 64.71.255.204   ← 我的 ISP 的 DNS

确诊:ISP 的 DNS 服务器缓存了"域名不存在"(NXDOMAIN)—— 那个状态有 TTL,长则几小时。本地刷再多次也没用,因为本地查询会去问 ISP,ISP 那边还在返回"不存在"。

修复:把 Mac 的 DNS 改成 1.1.1.1 + 8.8.8.8(系统设置 → 网络 → Wi-Fi → 详细信息 → DNS → 添加),绕过 ISP 缓存直接问公共 DNS。立刻能访问。Claude 说这种"长期改一下也好",公共 DNS 比 ISP 一般更快更新鲜,还少卖一份隐私。

文件夹位置统一

team_workout_data 在 ~/Documents/GitHub/,博客在 ~/Documents/Hugo_Blog/blog_main/。强迫症我想统一。Claude 提醒:

移之前要先把 .command 脚本里的硬编码路径改成相对路径,否则移动后会找不到文件夹。

grep 一下发现三个老脚本里都有 cd '/Users/lianghuashao/Documents/Hugo_Blog/blog_main' 这种死路径。全部改成:

cd "$(dirname "$0")" || exit

$0 是脚本本身路径,dirname 取所在目录。脚本无论放哪都能跑。

改完 mv ~/Documents/Hugo_Blog/blog_main ~/Documents/GitHub/

部署脚本重写

老的 4_hugo_deploy_upload.command 是 AWS 流程:

hugo --cleanDestinationDir --minify
aws s3 sync public/ s3://leonashao.com --delete
aws cloudfront create-invalidation --distribution-id E392F0BZEJZ6Y6 --paths "/*"

迁到 Cloudflare 之后部署变成 git push 一行:

# 6_deploy.command(重命名后)
git add -A
git commit -m "$message"
git push origin main

push 之后 Cloudflare Pages 自动监听 main 分支,~2 分钟构建+部署。

顺便整理了所有脚本的编号:

编号脚本
11_new_post.command —— 新建杂记
22_new_book_section.command —— 新建书章 / 节
33_hugo_server.command —— 本地预览
44_post_images.command —— 杂记图片处理
55_book_images.command —— 书节图片处理
66_deploy.command —— git push 部署

后续处理

资源状态
博客 HTML现在跑 Cloudflare Pages
图床(d89gm6mvdsato.cloudfront.net d1o52pu61y2in8.cloudfront.net保留在 AWS。Markdown 里所有图片 URL 都指向 CloudFront,迁到 R2 要 find-replace 几百处不值得,月成本 ~$0.5 也不痛
旧的 S3 bucket + CloudFront distribution让它再跑几周稳定了再下线
Route 53 域名(之前没有)现在在 Cloudflare Registrar,单向

我自己需要做的事

技术方案 Claude 出,但下面这些只能我亲自做:

  • 在 Cloudflare 控制台买域名(涉及付款)
  • 控制台里的所有点击操作(建 Pages 项目、加自定义域名、设环境变量)
  • 改本地 DNS 设置
  • 物理移动文件夹
  • 在 GitHub 上确认默认分支是 main 而不是 dev/update_post(涉及 git 分支管理决策)

现在

写完一篇杂记或者书节,本地 3_hugo_server.command 预览没问题,双击 6_deploy.command,输入 commit message,shaohua2kuaiqian.com 两分钟后更新。回滚也方便 —— Cloudflare Dashboard 里每次 deploy 都有快照,一键 Rollback to this deployment。

© 2025 - 2026 Leona的田园牧歌

🌱 Powered by Hugo with theme Dream.

关于我

Leona

  • 女的。
  • INFJ。
  • 长毛象链接点这里!
  • 做了八年数据科学家,但是每次管自己叫”科学家“,都很羞愧。职业+J人,习惯把日常生活数据化。
  • 玩了十几年相机,三十岁以前拍人像擅长无痕修图,三十岁以后拍动物植物大自然。
  • 厌倦城市,旅行目标大多是看动物。
  • 嘴太叼,不好吃宁愿饿着,还好手艺不错,不会饿死自己。
  • 没体能天赋,从小长跑最后一名,但是热爱运动,练过跑步、举铁、泰拳、网球、crossfit,现在重心转向功能性训练。
  • 现阶段人生目标是找个山头归隐,自给自足,田园牧歌,种菜养花,遛猫逗狗,养鸡喂牛。