起因
我另一个项目 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。
实际操作的步骤:
- Cloudflare 控制台 → Workers & Pages → Create application → Pages tab(不是 Workers!)→ Connect to Git
- 授权 GitHub(弹窗装 Cloudflare app)→ 选 repo
hugo_leona - 填构建配置:
| 字段 | 值 |
|---|---|
| Project name | shaohua2kuaiqian |
| Production branch | main |
| Framework preset | Hugo |
| Build command | git submodule update --init --recursive && hugo --gc --minify |
| Build output | public |
| Environment variables | HUGO_VERSION = 0.156.0 |
build command 显式加了 git submodule update --init --recursive —— theme 是 submodule,否则 Cloudflare 构建时会找不到 dream 主题报错。HUGO_VERSION 锁死和本地一致的 0.156.0 版本。
第一次 deploy ~2 分钟,输出绿色 ✅ Success。
- 加自定义域名:项目页 → 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 分钟构建+部署。
顺便整理了所有脚本的编号:
| 编号 | 脚本 |
|---|---|
| 1 | 1_new_post.command —— 新建杂记 |
| 2 | 2_new_book_section.command —— 新建书章 / 节 |
| 3 | 3_hugo_server.command —— 本地预览 |
| 4 | 4_post_images.command —— 杂记图片处理 |
| 5 | 5_book_images.command —— 书节图片处理 |
| 6 | 6_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。