使用 Cloudflare Workers 部署 Zola 静态站点:Wrangler 配置、构建脚本与自动化发布实战
【免费下载链接】zolaA fast static site generator in a single binary with everything built-in. https://www.getzola.org项目地址: https://gitcode.com/GitHub_Trending/zo/zola
Zola 是一个把站点构建为纯静态文件(无需数据库)的静态站点生成器,而 Cloudflare Workers 允许你绑定 GitHub/GitLab 仓库,在每次 PR 合并后自动构建并托管网站。本文将基于 Zola 官方部署文档(docs/content/documentation/deployment/cloudflare-workers.md)展开,带你完成仓库准备、build.sh构建脚本编写、wrangler.toml配置以及 Worker 创建的全流程,并结合仓库源码说明 Zola 构建命令与输出目录的行为,让你掌握一套可复制、可自动化的 CI/CD 部署方案。
Zola 部署到 Cloudflare Workers 的整体思路
Cloudflare 是拥有海量专有内容分发网络(CDN)的云服务商。与 Netlify、Vercel 类似,Cloudflare Workers 让部署流程变得灵活且简单:你只需把 GitHub 仓库接入服务,Cloudflare 便会在每次 PR 之后自动构建并托管基于 Zola 的网站。
从仓库根目录的部署总览文档(docs/content/documentation/deployment/overview.md)可以看到,Zola 之所以适合这类平台,是因为它“outputs plain files, no databases needed”——输出的是纯静态文件,不依赖数据库,这使得任何支持“构建 + 托管静态目录”的平台上都能轻松托管。
整个部署链路由三部分组成:
- 构建脚本
build.sh:在云端环境中下载指定版本的 Zola 可执行文件、同步子模块,并执行zola build; - Wrangler 配置
wrangler.toml:告诉 Wrangler 如何构建(build.command)以及生成的站点目录在哪里(assets.directory); - Worker 创建:在 Cloudflare 控制台将仓库连接为 Worker 项目,触发自动化构建与发布。
准备仓库:创建构建脚本 build.sh
在创建 Cloudflare Worker 之前,你需要在仓库中为 Wrangler 添加配置,使其在默认命令npx wrangler deploy被调用时构建你的站点。
由于 Cloudflare 的构建环境并不会预装 Zola,第一步是编写一个构建脚本,负责从 GitHub Releases 下载并解压 Zola 二进制。官方文档建议把脚本命名为build.sh,放在仓库根目录:
#!/usr/bin/env bash main() { ZOLA_VERSION=0.22.1 curl -sLJO "https://github.com/getzola/zola/releases/download/v${ZOLA_VERSION}/zola-v${ZOLA_VERSION}-x86_64-unknown-linux-gnu.tar.gz" tar -xf zola-v${ZOLA_VERSION}-x86_64-unknown-linux-gnu.tar.gz git submodule update --init --recursive ./zola build } set -euo pipefail脚本要点逐行解析
ZOLA_VERSION版本固定:脚本将 Zola 版本号硬编码为变量。当前仓库根目录的 Cargo.toml 中项目版本为0.23.3,你应根据实际发布情况选择版本。将版本固定为具体数值,可以保证云端构建与本地开发环境使用一致的 Zola 版本,避免行为漂移;升级时只需修改这一处变量。curl -sLJO静默下载:-s静默模式、-L跟随重定向、-J从响应头解析文件名、-O保存到本地文件。下载的是面向x86_64-unknown-linux-gnu目标的 Linux 二进制压缩包——这正是 Cloudflare 构建环境的典型平台。如果项目中有主题等 git 子模块,脚本中的git submodule update --init --recursive必不可少,因为Cloudflare 不会递归克隆仓库。./zola build生成静态站点:set -euo pipefail确保任何一步出错(如 curl 失败、子模块拉取失败、构建报错)都会让整个脚本以非零状态退出,从而让 Cloudflare 判定构建失败并阻止发布有问题的产物。
从源码理解 zola build 的行为
构建脚本调用的./zola build对应仓库 src/cmd/build.rs 中的build函数。从该实现可以看到:
- 它通过
Site::new(root_dir, config_file)读取项目配置; - 支持通过
--output-dir覆盖默认输出目录(默认是public),若目标目录已存在且未传--force会直接报错; - 支持通过
--base-url在构建时动态覆盖配置文件中的base_url; - 最终调用
site.build()生成全部静态文件。
官方 CLI 文档(docs/content/documentation/getting-started/cli-usage.md)也明确指出:zola build会把整个站点构建到public目录(如果该目录已存在则先删除)。这正是下文wrangler.toml中assets.directory = "./public"的由来。同时,src/cli.rs 中定义了--base-url选项,用于“Changes the base_url”,这是预览部署场景下动态设置 URL 的关键开关。
添加 Wrangler 配置
第二步是在项目根目录创建wrangler.toml,用于把 Wrangler 指向构建脚本,并指定生成站点的目标目录。其中name和compatibility_date是 Wrangler 的必需字段(可继承键),name使用你的站点名,compatibility_date填当前日期即可:
name = "blog" compatibility_date = "2026-01-22" [build] command = "bash ./build.sh" [assets] directory = "./public"配置字段说明
| 字段 | 作用 | 说明 |
|---|---|---|
name | Worker 项目名称 | 必填,使用你的站点名(如blog) |
compatibility_date | Wrangler 兼容性日期 | 必填,填入当前日期,用于锁定运行时行为 |
[build].command | 构建命令 | 指向仓库根目录的构建脚本bash ./build.sh |
[assets].directory | 静态资产目录 | 指向 Zola 构建产物目录./public,与zola build的默认输出目录一致 |
这套配置的本质是:npx wrangler deploy触发build.command执行build.sh,Zola 生成public/静态文件,随后 Wrangler 将assets.directory指向的目录作为静态资产发布到 Cloudflare 全球网络。
注意:配置中的
name、compatibility_date等是 Wrangler 的“可继承键”(inheritable keys),在 Cloudflare 控制台创建 Worker 时这些值会随项目创建而生效;如本地再通过wrangler.toml覆盖,需注意其优先级关系。
创建 Worker:连接仓库并自动部署
完成仓库准备后,即可在 Cloudflare 控制台创建 Worker:
- 登录或新建 Cloudflare 账户,在导航栏中选择"Workers and Pages";
- 点击"Create a project"按钮;
- 选择包含你的 Zola 网站的GitHub 或 GitLab 仓库,将其连接到 Cloudflare Workers;
- 保持默认设置,点击"Deploy"。
完成上述步骤后,你的网站会被构建并部署到 Cloudflare 网络!之后你可以在 Workers 控制台中添加自定义域名或修改各项设置。
这里的关键在于:Cloudflare 会读取仓库根目录的wrangler.toml,以其中配置的构建命令与资产目录为准执行构建发布,因此第 3 步选择的仓库必须与前面两步(build.sh+wrangler.toml)位于同一仓库根目录。
进阶实践:为预览部署动态设置 base_url
与 Cloudflare Pages 场景类似,当 Worker 项目为不同分支或 PR 生成预览 URL 时,站点的base_url往往是动态变化的。Zola 的配置文件(docs/content/documentation/getting-started/configuration.md)中,base_url是唯一必需的配置项,它决定站点生成的所有绝对链接的域名前缀。若在构建时把它写死,预览环境下的页面资源链接就会指向生产域名而加载失败。
解决思路是让构建命令根据当前环境动态选择 base_url。Zola 官方 CLI 文档(docs/content/documentation/getting-started/cli-usage.md)专门说明了--base-url的用途:
$ zola build --base-url $DEPLOY_URL“This is useful for example when you want to deploy previews of a site to a dynamic URL”。结合 Cloudflare 部署场景,你可以把build.sh中的构建步骤改造成类似下面的形式(以 Pages 场景的官方示例为参照,Worker 场景可类比替换环境变量):
if [ "$CF_PAGES_BRANCH" = "main" ]; then ./zola build else ./zola build --base-url "$CF_PAGES_URL" fi- 构建主分支时使用
zola.toml中配置的base_url; - 构建其他分支(预览部署)时,使用平台自动注入的预览 URL 环境变量(如
$CF_PAGES_URL),通过--base-url覆盖默认配置。
这一模式在仓库源码层面有明确支撑:src/cmd/build.rs 中site.set_base_url(b.to_string())正是--base-url的落点,它会在site.build()之前替换配置中的base_url。因此,无论生产发布还是临时预览,都可以通过环境变量 +--base-url组合实现「一套代码、多环境发布」。
结语与排障提示
将 Zola 站点部署到 Cloudflare Workers 的核心链路可归纳为:写好build.sh(固定版本、同步子模块、执行构建)→ 配置wrangler.toml(构建命令 +public资产目录)→ 控制台连接仓库一键部署。之后每次推送代码或合并 PR,Cloudflare 都会自动执行构建并发布到全球 CDN。
几个常见排障方向:
- 构建失败但日志无输出:检查
build.sh是否设置了set -euo pipefail,确认ZOLA_VERSION对应的下载地址可访问; - 部署成功但资源 404:多半是
assets.directory与 Zola 实际输出目录不一致,确认zola build用的是默认public,或已在脚本中通过--output-dir指定同一目录; - 主题样式丢失:若使用了主题子模块,确认
git submodule update --init --recursive已加入build.sh(Cloudflare 不会递归克隆仓库); - 预览域名下链接异常:参考上文,用
zola build --base-url $PREVIEW_URL动态覆盖base_url。
如需进一步了解 Worker 控制台创建流程,可参考 Cloudflare 官方关于“使用 Cloudflare 控制台创建 Workers 应用”的文档;Zola 侧更多命令行选项(--output-dir、--drafts、--config等)可在 CLI 使用文档 中查阅。
【免费下载链接】zolaA fast static site generator in a single binary with everything built-in. https://www.getzola.org项目地址: https://gitcode.com/GitHub_Trending/zo/zola
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考