跳到正文
Victor BI
返回

将我的 Astro 博客从 GitHub 部署到 Cloudflare Pages

背景

我想托管一个用 Astro 搭建的轻量个人博客。博客源代码已存储在 GitHub 仓库中,目标很简单:

最初,我将网站部署为 Cloudflare Worker。虽然可以运行,但默认 URL 看起来是这样的:

https://victorbi.spearfishingchina.workers.dev/

这不是我想要的博客形式。我希望使用 Cloudflare Pages 项目,因为 Pages 的默认 URL 更简洁:

https://victorbi.pages.dev/

项目结构

我的 Astro 项目位于仓库的 src 目录下。

重要的结构如下:

repo-root/
├── README.md
├── deploy/
│   └── cloudflare/
│       └── website/
│           └── ...
└── src/
    ├── package.json
    ├── pnpm-lock.yaml
    ├── astro.config.ts
    ├── public/
    └── src/
        ├── content/
        ├── pages/
        ├── layouts/
        └── components/

deploy/cloudflare/website/ 目录包含已构建的静态文件,例如:

index.html
404.html
_astro/
pagefind/
rss.xml
sitemap-index.xml

该目录可用于测试,但并不适合作为 Cloudflare Pages 的长期来源。更好的做法是让 Cloudflare 直接从 Astro 源代码构建网站。

为什么更换部署方式

部署静态 Astro 博客有两种方式:

方式一:本地构建后上传静态文件

即在本地机器上运行构建,然后上传生成的文件。

例如:

cd src
pnpm run build

然后手动上传生成的 dist 文件夹。

这种方式可行,但并不理想,因为每次更新都需要手动操作。

方式二:让 Cloudflare 从 GitHub 构建

这是更好的长期方案。

工作流变为:

撰写博客文章
提交到 GitHub
推送到 GitHub
Cloudflare Pages 构建 Astro 网站
Cloudflare Pages 部署生成的 dist 文件夹

这种方式更简洁,因为 GitHub 存储源代码,Cloudflare 自动处理构建和部署。

清理仓库

仓库不应跟踪生成的文件或本地依赖。

我添加或更新了根目录的 .gitignore 文件:

node_modules/
src/node_modules/
dist/
src/dist/
deploy/cloudflare/website/
.wrangler/
.dev.vars
.env

然后从 Git 跟踪中移除生成文件,但不删除本地文件:

git rm -r --cached src/node_modules || true
git rm -r --cached deploy/cloudflare/website || true
git rm -r --cached src/dist || true
git rm -r --cached dist || true

之后提交清理内容:

git add .gitignore
git commit -m "Clean up generated files for Cloudflare Pages deployment"
git push

检查 Astro 构建脚本

src/package.json 中,我确认其中包含构建脚本。

重要部分如下:

{
  "scripts": {
    "build": "astro build"
  }
}

对于我的项目,Cloudflare Pages 只需要运行构建命令。Astro 默认会将静态网站生成到 dist 目录。

本地测试构建

在配置 Cloudflare 之前,我先在本地测试了构建。

cd src
pnpm install
pnpm run build

构建成功后,Astro 生成了:

src/dist/

dist 文件夹即为最终的静态网站。

其中包含以下文件:

index.html
404.html
_astro/
posts/
tags/
rss.xml
sitemap-index.xml

找到 Cloudflare Pages 选项

在 Cloudflare 控制台中,我进入:

Workers & Pages
→ 创建应用

令人困惑的是,主页面首先显示的是 Worker 选项,例如:

Continue with GitHub
Connect GitLab
Start with Hello World!
Select a template
Upload your static files

这些选项会创建 Worker 应用。

Pages 的正确入口在底部:

Looking to deploy Pages? Get started

我点击了那里的 Get started

创建 Cloudflare Pages 项目

进入 Pages 设置后,我选择了:

导入现有 Git 仓库

然后连接了我的 GitHub 仓库。

Cloudflare Pages 构建设置

我使用了以下 Pages 配置:

项目名称:
victorbi

生产分支:
main

框架预设:
Astro

根目录:
src

构建命令:
pnpm run build

构建输出目录:
dist

重要细节如下:

根目录 = src
构建输出目录 = dist

由于我的 Astro 项目位于仓库的 src 文件夹内,Cloudflare 必须从该目录运行构建。

因此 Cloudflare 识别的项目结构如下:

repo-root/src/package.json
repo-root/src/astro.config.ts
repo-root/src/pnpm-lock.yaml

构建完成后,Astro 将网站输出到:

repo-root/src/dist

从 Cloudflare Pages 的角度来看,由于根目录已设置为 src,输出目录只需填写:

dist

而不是:

src/dist

设置 Node 版本

我还添加了一个构建环境变量:

NODE_VERSION = 22

这可以保持构建环境稳定,避免现代 Astro 版本出现 Node 版本兼容问题。

部署网站

保存 Cloudflare Pages 配置后,我触发了第一次部署。

预期流程为:

Cloudflare 拉取 GitHub 仓库
Cloudflare 进入 src 目录
Cloudflare 安装依赖
Cloudflare 运行 pnpm run build
Astro 生成 dist 文件夹
Cloudflare Pages 部署 dist 文件夹

部署完成后,网站可通过 Pages URL 访问:

https://victorbi.pages.dev/

Worker 与 Pages 的区别

我最初创建的是 Worker 部署,生成的 URL 如下:

https://victorbi.spearfishingchina.workers.dev/

这是因为 Worker 使用以下默认 URL 格式:

worker-name.account-subdomain.workers.dev

对于博客来说,这不是我想要的形式。

Cloudflare Workers 可以托管静态网站,但对于简单的 Astro 博客,Cloudflare Pages 更为自然。Pages 提供更简洁的默认域名和更直观的心智模型:

GitHub 仓库
→ Cloudflare Pages 构建
→ 静态网站

最终配置

我的最终配置如下:

源代码:
GitHub

托管:
Cloudflare Pages

框架:
Astro

包管理器:
pnpm

项目根目录:
src

构建命令:
pnpm run build

输出目录:
dist

Node 版本:
22

最终工作流

现在发布工作流非常简单:

cd src
pnpm run build

如果本地构建成功,我撰写或编辑博客文章后直接推送更改:

git add .
git commit -m "Add new blog post"
git push

Cloudflare Pages 会自动构建并部署更新后的博客。

给未来自己的备注

不要提交以下文件夹:

node_modules/
src/node_modules/
dist/
src/dist/
deploy/cloudflare/website/

不要将旧的本地构建输出文件夹作为 Cloudflare 项目根目录。

正确的 Cloudflare Pages 项目根目录为:

src

正确的 Cloudflare Pages 构建输出目录为:

dist

这意味着 Cloudflare 从源代码构建,并自动部署生成的 Astro 静态网站。


分享这篇文章:

下一篇
欢迎来到 Victor BI