从零开始:Astro + Cloudflare Pages 手把手搭建个人技术博客


如果你只是想拥有一个属于自己的技术博客,其实不一定需要购买云服务器,也不需要维护 Nginx、数据库和 Docker。

这篇文章记录的是我实际搭建个人博客的完整过程:

Astro + GitHub + Cloudflare Pages + 独立域名

最终的工作流非常简单:

本地写 Markdown
    ↓
git push
    ↓
GitHub
    ↓
Cloudflare Pages 自动构建
    ↓
个人博客自动更新

这种方式特别适合技术博客:成本低、维护简单、访问速度不错,而且所有文章都以 Markdown 文件保存在自己的 Git 仓库里。

下面从零开始完整走一遍。


一、为什么选择 Astro + Cloudflare Pages

最开始我考虑过 Halo、WordPress 等传统博客系统,但如果使用这些系统,通常需要一台可以被公网访问的服务器。

我的服务器属于公司内网服务器,外部无法直接访问,而且公司服务器也不适合承载个人网站。

于是最终选择了静态博客方案:

  • Astro:负责生成博客页面;
  • GitHub:保存博客源码和文章;
  • Cloudflare Pages:负责构建和托管网站;
  • 独立域名:作为网站最终访问地址。

这样最大的好处是:

  1. 不需要单独购买服务器;
  2. 不需要维护数据库;
  3. 不需要配置 Nginx;
  4. 不需要自己申请 HTTPS 证书;
  5. 每次 git push 后网站自动更新;
  6. 博客源码和文章都掌握在自己手里。

二、准备环境

我的本地环境是 Windows。

需要准备:

  • Node.js
  • npm
  • Git
  • GitHub 账号
  • Cloudflare 账号
  • VS Code(推荐)
  • 一个域名(可以最后再买)

先检查本机环境:

node -v
npm -v
git --version

我当时使用的是:

Node.js v24.14.0
Windows x64

Astro 建议使用较新的 Node.js 偶数版本。如果是新安装环境,我更建议直接使用 Node.js 22 LTS 或当前受支持的 LTS 版本。


三、创建 Astro 博客

找一个自己存放代码的目录,例如:

D:
cd D:\codes\blog

创建 Astro 官方 Blog 模板:

npm create astro@latest -- --template blog

项目名称例如:

xinghai-blog

安装过程中按照提示:

Install dependencies? → Yes
Initialize a git repository? → Yes

创建完成后:

cd xinghai-blog
npm run dev

正常情况下会看到:

Local http://localhost:4321/

浏览器打开:

http://localhost:4321

这时应该可以看到 Astro 默认博客首页。


四、第一个坑:astro 不是内部或外部命令

我第一次执行:

npm run dev

遇到:

'astro' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

这个问题通常说明项目依赖没有正确安装。

先检查:

Test-Path .\node_modules
Test-Path .\node_modules\.bin\astro.cmd

如果第二个结果是:

False

直接重新安装依赖:

npm install

然后再次启动:

npm run dev

这里不建议通过:

npm install -g astro

全局安装 Astro。

Astro 应该作为当前项目的本地依赖使用,否则本地版本、CI 构建版本和 Cloudflare 构建版本可能不一致。


五、第二个坑:Cannot find native binding

重新安装依赖后,我又遇到了第二个问题:

Cannot find native binding.

npm has a bug related to optional dependencies.
Please try npm i again after removing both
package-lock.json and node_modules directory.

后面还有:

astro.win32-x64-msvc.node is not a valid Win32 application

这个报错看起来很吓人,但实际问题主要集中在 Astro 的 Windows 原生依赖没有被正确安装。

我先检查了 Node.js 和 Windows 的架构:

node -p "JSON.stringify({version:process.version, arch:process.arch, platform:process.platform, execPath:process.execPath}, null, 2)"

返回:

{
  "version": "v24.14.0",
  "arch": "x64",
  "platform": "win32",
  "execPath": "D:\\program\\nodejs\\node.exe"
}

再检查 Windows:

[Environment]::Is64BitOperatingSystem
Get-CimInstance Win32_OperatingSystem | Select-Object OSArchitecture

确认:

True
64 位

因此并不是 32 位和 64 位架构冲突。

最终处理方法是完整删除依赖和锁文件:

Remove-Item -Recurse -Force .\node_modules -ErrorAction SilentlyContinue
Remove-Item -Force .\package-lock.json -ErrorAction SilentlyContinue

npm cache clean --force
npm install --include=optional --registry=https://registry.npmjs.org/

然后:

npm run dev

如果你的公司网络使用 Nexus、Artifactory 或其他 npm 镜像,也建议先检查:

npm config get registry

必要时直接使用官方 npm Registry:

npm config set registry https://registry.npmjs.org/

这个问题很容易被误认为是 Astro 本身有 Bug,但实际上更常见的是 npm 可选依赖、缓存或者镜像源导致原生二进制文件安装异常。


六、修改博客名称

Astro 官方 Blog 模板创建出来后,首先修改:

src/consts.ts

例如:

export const SITE_TITLE = '景川技术手记';

export const SITE_DESCRIPTION =
	'记录云原生、数据平台、AI生产力与科研方法,以及真实环境中的问题、排查与实践。';

这样网站名称、SEO 描述等内容就会使用自己的信息。


七、修改首页

首页文件通常是:

src/pages/index.astro

默认首页是 Astro 官方示例内容。

可以把它改成个人介绍,例如:

<h1>你好,我是景川</h1>

<p>
	记录云原生、数据平台、AI生产力与科研方法,
	也记录那些真正发生在实际环境中的问题、排查与思考。
</p>

<a href="/blog">查看文章</a>
<a href="/about">关于我</a>

顶部菜单通常位于:

src/components/Header.astro

可以把:

Home
Blog
About

改成:

首页
文章
关于

这样第一版中文个人博客就基本成型了。


八、博客文章放在哪里

Astro Blog 模板的文章一般放在:

src/content/blog/

比如创建:

src/content/blog/hello-world.md

内容:

---
title: "我的第一篇博客"
description: "这是我的第一篇 Astro 博客文章。"
pubDate: 2026-08-27
---

这是我的第一篇文章。

以后所有内容都可以直接使用 Markdown 编写。

这也是静态博客最大的优势之一:

文章就是文件。

即使以后不用 Astro 了,这些 Markdown 文件仍然可以很容易迁移到其他博客系统。


九、本地预览和正式构建

开发过程中:

npm run dev

打开:

http://localhost:4321

正式部署之前最好再执行一次:

npm run build

Astro 会生成:

dist/

这个目录就是最终生成的静态网站。

如果:

npm run build

能够正常执行,Cloudflare Pages 通常也就具备了正常构建的基础。


十、创建 GitHub 仓库

登录 GitHub,新建一个仓库,例如:

xinghai-blog

因为本地 Astro 项目已经初始化 Git,所以 GitHub 新仓库不需要再勾选:

README
.gitignore
License

本地执行:

git add .
git commit -m "Initial Astro blog"
git branch -M main

添加远程仓库:

git remote add origin https://github.com/你的用户名/xinghai-blog.git

例如:

git remote add origin https://github.com/CXAXH/xinghai-blog.git

检查:

git remote -v

然后:

git push -u origin main

十一、第三个坑:GitHub 不再支持密码推送

这里我又遇到了:

remote: Invalid username or token.
Password authentication is not supported for Git operations.

fatal: Authentication failed

原因很简单:

GitHub 的 HTTPS Git 操作已经不能直接使用 GitHub 登录密码。

如果 Windows 中缓存了错误凭据,可以打开:

Windows 凭据管理器
→ Windows 凭据

找到类似:

git:https://github.com
github.com

删除旧凭据。

然后重新执行:

git push -u origin main

如果安装了 Git Credential Manager,通常会自动打开浏览器,让你完成 GitHub 授权。

这是我更推荐的方式。

另外也可以使用 GitHub Personal Access Token,但不要把 Token 提交到代码仓库,也不要写进任何公开配置文件。


十二、部署到 Cloudflare Pages

代码成功推送到 GitHub 后,就可以开始部署。

登录 Cloudflare:

Workers & Pages

然后创建应用。

这里有一个很容易踩的坑。


十三、第四个坑:不要选错成 Workers 部署

我第一次创建时看到的默认部署命令是:

npx wrangler deploy

如果你也看到这个,说明很可能进入了:

Cloudflare Workers

而不是我们这里使用的:

Cloudflare Pages

对于普通 Astro 静态博客,不需要自己执行:

npx wrangler deploy

应该选择:

Workers & Pages
→ Create
→ Pages
→ Connect to Git

连接 GitHub 后,选择博客仓库。

我的核心配置如下:

Production branch:main
Framework preset:Astro
Build command:npm run build
Build output directory:dist

根目录如果 Astro 项目就在 Git 仓库根目录,可以留空。

部署完成后,Cloudflare 会提供类似:

https://项目名.pages.dev

的地址。

到这里,一个完全不依赖自己服务器的个人博客已经上线了。


十四、绑定自己的域名

如果已经有域名,可以继续在 Cloudflare Pages 项目中进入:

Custom domains

添加自己的域名。

例如:

www.example.com

或者根域名:

example.com

如果域名 DNS 已经托管在 Cloudflare,配置会非常简单。

绑定完成后,还需要修改 Astro 项目中的:

astro.config.mjs

加入或修改:

export default defineConfig({
	site: 'https://www.example.com',
});

这里一定要写最终正式域名。

因为它会影响:

  • Sitemap
  • RSS
  • Canonical URL
  • SEO
  • 社交分享链接

修改后重新提交:

git add .
git commit -m "Configure custom domain"
git push

Cloudflare Pages 会自动重新部署。


十五、以后怎么发布文章

整个博客搭好以后,日常维护反而非常简单。

例如创建新文章:

src/content/blog/kubernetes-note.md

写完之后本地预览:

npm run dev

确认没有问题:

git add .
git commit -m "新增 Kubernetes 文章"
git push

后面的事情全部由 Cloudflare 自动完成:

git push
    ↓
GitHub 收到新代码
    ↓
Cloudflare Pages 触发构建
    ↓
npm run build
    ↓
生成 dist
    ↓
网站自动更新

不用登录服务器。

不用上传文件。

不用手动重启 Nginx。


十六、我的最终目录结构

搭建完成后,大致结构如下:

xinghai-blog/
│
├─ public/
│  └─ images/
│
├─ src/
│  ├─ components/
│  ├─ content/
│  │  └─ blog/
│  │     ├─ astro-cloudflare-pages-blog-guide.md
│  │     └─ ...
│  │
│  ├─ layouts/
│  ├─ pages/
│  │  ├─ index.astro
│  │  └─ ...
│  │
│  └─ consts.ts
│
├─ astro.config.mjs
├─ package.json
└─ tsconfig.json

其中真正需要经常操作的,主要就是:

src/content/blog/

以后绝大部分时间都只是在这里增加 Markdown 文件。


十七、这套方案适合什么人

我认为这套方案尤其适合:

  • 程序员个人博客;
  • 技术文档站;
  • 个人作品集;
  • 科研技术笔记;
  • AI 工具实践博客;
  • 不想维护服务器的人;
  • 想拥有自己域名和内容资产的人。

如果你的站点以后需要:

  • 用户注册;
  • 评论后台;
  • 会员系统;
  • 付费内容;
  • 数据库;
  • 复杂管理后台;

那么可以再考虑 Halo、WordPress 或动态 Web 应用。

但对于一个以文章为核心的个人技术博客:

Astro + GitHub + Cloudflare Pages 已经足够好用。


十八、完整命令速查

最后把最核心的命令整理一下。

创建项目:

npm create astro@latest -- --template blog

启动:

npm run dev

构建:

npm run build

如果 Astro 原生依赖异常:

Remove-Item -Recurse -Force .\node_modules -ErrorAction SilentlyContinue
Remove-Item -Force .\package-lock.json -ErrorAction SilentlyContinue

npm cache clean --force
npm install --include=optional --registry=https://registry.npmjs.org/

提交 Git:

git add .
git commit -m "更新博客"
git push

Cloudflare Pages:

Framework preset:Astro
Build command:npm run build
Build output directory:dist
Production branch:main

以后每次更新博客,真正需要做的其实只有:

git add .
git commit -m "新增文章"
git push

写在最后

以前搭个人博客,常见的流程是:

买服务器
→ 安装 Linux
→ 配置 Nginx
→ 配置 HTTPS
→ 安装数据库
→ 安装博客程序
→ 定期备份
→ 定期升级
→ 处理安全问题

而现在,如果核心需求只是写文章,可以把基础设施大幅简化:

Markdown
→ GitHub
→ Cloudflare Pages

工具变简单以后,真正应该花时间的事情也就更加明确了:

不是继续折腾博客系统,而是开始认真写内容。

这也是我最终选择 Astro + Cloudflare Pages 的原因。