deploy blog to github cloudflare vercel
六月 13, 2026 [部署] #blog #deploy #github #cloudflare #vercel #zola准备工作
先构建站点,确认 public/ 目录正常生成:
zola build
ls public/
GitHub Pages
创建仓库
创建 github.com/<你的用户名>/<你的用户名>.github.io 仓库,这是 GitHub 的 user site,域名固定为 https://<用户名>.github.io。
git init
git remote add origin git@github.com:<用户名>/<用户名>.github.io.git
GitHub Actions 自动部署
创建 .github/workflows/deploy.yml:
name: Deploy Zola Blog
on:
push:
branches: [master]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Zola
run: |
ZOLA_VERSION=$(curl -s https://api.github.com/repos/getzola/zola/releases/latest | grep tag_name | cut -d '"' -f4)
curl -sL "https://github.com/getzola/zola/releases/download/${ZOLA_VERSION}/zola-${ZOLA_VERSION}-x86_64-unknown-linux-gnu.tar.gz" | tar xz
sudo mv zola /usr/local/bin/
- name: Build
run: zola build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
推送后 GitHub Actions 自动构建并部署到 gh-pages 分支。在仓库 Settings → Pages 中选择 gh-pages 分支作为部署源。
Cloudflare Pages
Cloudflare Pages 直接托管静态站点,支持自定义域名 juzhong.xyz 或子域名如 blog.juzhong.xyz。
连接 GitHub 仓库
在 Cloudflare Dashboard → Workers & Pages → Pages → 创建项目,连接 GitHub 仓库。
构建配置:
| 配置项 | 值 |
|---|---|
| 构建命令 | zola build |
| 输出目录 | public |
| 环境变量 | ZOLA_VERSION=0.19.2 |
Cloudflare Pages 内置了 Zola 支持,会自动下载对应版本。
自定义域名
Pages 项目 → 自定义域 → 添加 blog.juzhong.xyz。
需要在 juzhong.xyz 的 DNS 中添加 CNAME 记录:
blog.juzhong.xyz CNAME <项目名>.pages.dev
Cloudflare 代理(橙色云朵)开启后自动提供 HTTPS。
Vercel
Vercel 也支持 Zola 静态站点,但默认构建环境没有 Zola 版本太低,需要自定义构建命令。
连接仓库与构建配置
访问 vercel.com/new 导入 GitHub 仓库。
Vercel 可能无法自动识别 Zola 项目,手动配置构建参数:
| 配置项 | 值 |
|---|---|
| Framework | Other |
| Build Command | 见下方自定义命令 |
| Output Directory | public |
自定义构建命令(下载指定版本 Zola 并构建):
curl -sL https://github.com/getzola/zola/releases/download/v0.19.2/zola-v0.19.2-x86_64-unknown-linux-gnu.tar.gz | tar -xzf - && ./zola build --base-url https://vercel.juzhong.xyz
拆解说明:
curl -sL ... | tar -xzf -—— 下载 Zola v0.19.2 二进制包并解压到当前目录./zola build --base-url https://vercel.juzhong.xyz—— 用本地 Zola 构建,--base-url指定站点根 URL,确保绝对路径(如 RSS、sitemap)正确
注意:将
vercel.juzhong.xyz替换为你的实际域名;如果没有自定义域名,使用 Vercel 分配的xxx.vercel.app域名。
自定义域名配置(以 Cloudflare 为例)
下面以子域名 vercel.juzhong.xyz 为例,DNS 解析由 Cloudflare 管理。
第一阶段:Vercel 平台操作
- 进入项目仪表板,点击顶部 Settings → 左侧菜单 Domains
- 输入完整域名(例如
vercel.juzhong.xyz),点击 Add - 页面会提示 Invalid Configuration(正常),点击域名旁边的 View 查看需要的 DNS 记录
Vercel 通常建议添加以下记录:
- A 记录:将根域名指向
76.76.21.21(Vercel 的 IP) - CNAME 记录:将子域名指向
cname.vercel-dns.com - cname.vercel-dns.com — 全球通用
- cname-china.vercel-dns.com — 国内专用节点,中国大陆访问速度更快、更稳定
- 由于你在国内使用,强烈推荐使用 cname-china.vercel-dns.com。
本项目使用子域名,只需 CNAME 记录即可。
第二阶段:Cloudflare DNS 操作
- 登录 Cloudflare 仪表板 → 选择域名
juzhong.xyz→ DNS → 记录 - 点击 添加记录,配置如下:
| 字段 | 值 |
|---|---|
| 类型 | CNAME |
| 名称 | vercel |
| 目标 | cname.vercel-dns.com |
| 代理状态 | 仅 DNS(灰色云朵 ☁️) |
关键:代理状态务必选择灰色云朵(仅 DNS),不要开启橙色云朵(代理)。
为什么? Vercel 使用 Let's Encrypt 自动签发 SSL 证书,需要通过 ACME 协议验证域名所有权。Cloudflare 橙色代理会拦截 ACME 验证请求,导致证书签发失败、域名始终显示 Invalid Configuration。
特殊情况:根域名配置
DNS 标准不允许根域名(@)使用 CNAME 记录。Cloudflare 通过 CNAME Flattening 技术自动将根域名的 CNAME 转换为 A 记录,你只需正常添加 CNAME 记录,名称写 @ 即可。
如果 Vercel 提示根域名需要 A 记录,则改为:
| 字段 | 值 |
|---|---|
| 类型 | A |
| 名称 | @ |
| IPv4 地址 | 76.76.21.21 |
第三阶段:验证与生效
- DNS 记录全球生效通常需要几分钟到几十分钟
- 回到 Vercel 项目 Domains 页面,状态从红色 Invalid Configuration 变为绿色 Valid Configuration 即表示成功
- SSL 证书自动签发,通常 1-3 分钟内完成
- 访问
https://vercel.juzhong.xyz确认站点正常
额外配置:URL 重定向(可选)
在 Vercel 的 Domains 页面,点击域名旁边的 Edit,可设置:
- 将
www.vercel.juzhong.xyz重定向到vercel.juzhong.xyz(或反之) - 如需同时使用 www 子域名,需在 Cloudflare 再添加一条名称
www.vercel的 CNAME 记录,并同样加入 Vercel 项目
常见问题排查
| 问题 | 原因 | 解决 |
|---|---|---|
| 状态一直 Invalid | Cloudflare 代理未关闭(橙色云朵) | 将 DNS 记录的代理状态改为灰色(仅 DNS) |
| DNS 记录冲突 | Cloudflare 中存在旧 A/AAAA 记录与 CNAME 冲突 | 删除无关的解析记录,只保留 Vercel 所需的 |
| www 子域名无法访问 | Vercel 不会自动添加 www 子域名 | 手动在 Vercel 中添加 www.vercel.juzhong.xyz,并添加对应的 Cloudflare DNS 记录 |
| SSL 证书续期失败 | 后续开启了 Cloudflare 代理(橙色云朵),拦截了 ACME 验证 | 在 Cloudflare Zero Trust 中为路径 /.well-known/acme-challenge/* 设置 Bypass 策略;或在证书续期期间临时关闭代理 |
三平台对比
| GitHub Pages | Cloudflare Pages | Vercel | |
|---|---|---|---|
| 免费额度 | 无限 | 无限 | 100GB/月带宽 |
| 自定义域名 | 支持 | 支持 | 支持 |
| HTTPS | 自动 | 自动 | 自动 |
| 构建时间 | 10min/次 | 500次/月 | 6000min/月 |
| 域名 | xxx.github.io | xxx.pages.dev | xxx.vercel.app |
| 适用场景 | 简单托管 | 需要自定义域名 + CDN | 开发预览 |
推荐方案:源码放 GitHub,用 Cloudflare Pages 部署到 blog.juzhong.xyz。GitHub 负责版本管理,Cloudflare 提供全球 CDN 和免费 HTTPS。