GitHub 到 Cloudflare Pages 部署指南背景

Skills · Website Deployment

Commit.
Push.
Deploy.

把本地静态网站交给 GitHub 与 Cloudflare Pages,用一次 git push 完成构建、部署与域名发布。

ScopeGit / GitHub / Cloudflare Pages EnvironmentmacOS + Git + SSH Resultziyuedesign.com / www Updated2026-07-28
Mental model

一次 push,就是一次发布。

网站文件和修改历史保存在 GitHub。每次向 main 分支推送新提交,Cloudflare Pages 自动构建并部署,由 Cloudflare 全球网络直接提供访问,不再依赖原来的服务器和 Nginx,HTTPS 证书也由 Cloudflare 自动处理。原服务器关机后,网站仍然可以正常访问。

Why Pages

纯静态网站天然适合 Pages

本网站由 HTML、CSS、JavaScript 和图片组成,不需要 Node.js、数据库或服务器端程序,因此非常适合 Cloudflare Pages:没有构建工具也能直接发布仓库根目录。

Pipeline

完成后的更新链路

  1. 01

    本地网站文件

    编辑 HTML / CSS / 图片

  2. 02

    git add · commit · push

    提交并推送 main 分支

  3. 03

    GitHub 仓库

    保存文件与修改历史

  4. 04

    Cloudflare Pages

    自动触发构建与部署

  5. 05

    域名上线

    ziyuedesign.com / www

Checklist

开始前需要

  1. 一个 GitHub 账号。
  2. 一个 Cloudflare 账号。
  3. 已经加入 Cloudflare 管理的域名。
  4. Mac 上安装好的 Git。
  5. 网站根目录内存在 index.html
Git

检查 Git 是否安装

Terminal
git --version

能看到类似 git version 2.50.1 的结果,说明 Git 已安装。

Path

进入网站目录

Terminal
cd "/Users/sieh/Desktop/Server/个人网站"
pwd

预期输出 /Users/sieh/Desktop/Server/个人网站

Entry

确认首页存在

Terminal
ls index.html

仓库根目录必须存在 index.html,Cloudflare Pages 发布的就是这个根目录。

Privacy email

获取 GitHub 隐私邮箱

Git 的每次提交都需要记录作者姓名和邮箱。打开 github.com/settings/emails,启用 Keep my email addresses private,GitHub 会提供类似 数字+用户名@users.noreply.github.com 的隐私邮箱。

请将下面命令中的 YOUR_GITHUB_NOREPLY_EMAIL 替换为你在 GitHub 邮箱设置页面看到的隐私邮箱。使用隐私邮箱可以避免真实邮箱直接出现在公开的 Git 提交记录中。

Config

设置用户名和邮箱

Terminal
git config --global user.name "ziyue-97"
git config --global user.email "YOUR_GITHUB_NOREPLY_EMAIL"

git config --global user.name
git config --global user.email

验证时应分别输出你的 GitHub 用户名和隐私邮箱地址。

Ignore

创建 .gitignore

macOS 经常自动生成 .DS_Store,它不属于网站内容,不应上传。

Terminal
cd "/Users/sieh/Desktop/Server/个人网站"
printf ".DS_Store\n" > .gitignore
Init

初始化仓库

Terminal
git init -b main
  • git init:让当前目录成为 Git 仓库。
  • -b main:将默认主分支命名为 main
Stage

加入文件并检查

Terminal
git add .
git status

git add 只是在本地标记需要记录的文件,不会上传到网络。正确状态通常包含 On branch mainNo commits yetChanges to be committed:

  • index.html、CSS、JavaScript、图片和 .gitignore 在列表中。
  • .DS_Store 不在列表中。
  • 没有密码、私钥、访问令牌或个人配置文件。
Commit

创建第一次提交

Terminal
git commit -m "Initial website"
git log --oneline
git status

本次首次提交为 fb1bde6 Initial website。干净的工作区应显示 nothing to commit, working tree clean

New repo

在 GitHub 创建空仓库

打开 github.com/new,按下表填写:

配置项 内容
Owner ziyue-97
Repository name personal-website
Description My personal website,可选
Visibility Private

因为本地已经存在完整仓库,以下选项不要启用:不要添加 README、不要创建新的 .gitignore、不要添加 License、不要使用仓库模板。否则 GitHub 会生成本地没有的提交,第一次推送时可能产生冲突。

Cloudflare Pages 支持连接私有 GitHub 仓库,因此网站仓库不必设为 Public。最终仓库页面为 github.com/ziyue-97/personal-website。

Keygen

创建 ED25519 密钥

GitHub 已不支持使用账户密码进行 Git 推送,可以使用 SSH 密钥进行安全认证。先检查是否已有密钥:

Terminal
ls -la ~/.ssh

常见密钥文件是 id_ed25519id_ed25519.pub。如果不存在,则创建新密钥:

Terminal
ssh-keygen -t ed25519 -C "YOUR_GITHUB_NOREPLY_EMAIL"

出现 Enter file in which to save the key 时直接按回车,使用默认位置。接下来可以设置密钥密码,输入时终端不会显示字符,这是正常现象。

Private / Public

两个密钥文件的分工

  • ~/.ssh/id_ed25519:私钥,绝对不能发送、公开或上传。
  • ~/.ssh/id_ed25519.pub:公钥,可以添加到 GitHub。

如果不慎把密钥生成到了网站目录,应立即将它移出网站目录,并确认它从未被 Git 提交。

Add key

添加公钥到 GitHub

Terminal
pbcopy < ~/.ssh/id_ed25519.pub

打开 github.com/settings/keys,点击 New SSH key

配置项 内容
Title Sieh MacBook Pro
Key type Authentication Key
Key 粘贴完整公钥,通常以 ssh-ed25519 开头
Test

测试 SSH 连接

Terminal
ssh -T git@github.com

第一次连接可能提示 Are you sure you want to continue connecting (yes/no/[fingerprint])?,输入 yes

成功结果为 Hi ziyue-97! You've successfully authenticated, but GitHub does not provide shell access.

最后一句“不提供 shell access”不是错误,它表示身份认证已经成功,但 GitHub 不提供普通服务器终端。

Remote

添加远程仓库

Terminal
cd "/Users/rda/Desktop/Server/personal-web"
git remote add origin git@github.com:ziyue-97/personal-website.git

origin 是远程仓库的常用别名。

Verify

检查远程地址

Terminal
git remote -v

预期输出两行,分别是 origin git@github.com:ziyue-97/personal-website.git (fetch)(push)

Push

推送主分支

Terminal
git push -u origin main
  • git push:把本地提交上传到 GitHub。
  • -u origin main:让本地 main 分支跟踪 GitHub 的 origin/main
  • 设置跟踪关系后,以后只需要执行 git push

成功结果类似 [new branch] main -> mainbranch 'main' set up to track 'origin/main'。刷新 GitHub 仓库页面,应当可以看到 index.html、CSS、JavaScript、图片目录等文件。

Entry

创建 Pages 项目

登录 Cloudflare Dashboard,进入 Workers & Pages,点击 Create application

正确入口位于创建页面底部的 Looking to deploy Pages? Get started,点击其中的 Get started,进入 Cloudflare Pages 后选择 GitHub。

Important

不要误选 Worker

Cloudflare 新界面默认突出显示 Worker。以下入口属于 Worker,不适合本次 Pages 部署:

  • Continue with GitHub
  • Create a Worker
  • 出现 Deploy command
  • 默认命令为 npx wrangler deploy
Authorize

授权 Cloudflare 访问 GitHub

  1. 在 Pages 的仓库选择页面选择 GitHub。
  2. GitHub account 选择 ziyue-97
  3. 如果尚未授权,安装 Cloudflare Pages GitHub App。
  4. Repository access 建议选择 Only select repositories
  5. 仅选择 personal-website
  6. 返回 Cloudflare,选择 personal-website
  7. 点击 Begin setup
Missing repo

Cloudflare 看不到仓库时

  1. 打开 github.com/settings/installations
  2. 找到 Cloudflare Pages,点击 Configure
  3. 在 Repository access 中加入 personal-website
  4. 保存后回 Cloudflare 刷新。
Build

配置 Pages 构建

本网站没有框架和构建工具,因此配置如下:

配置项 内容
Project name personal-website
Production branch main
Framework preset None
Build command exit 0
Build output directory .
Root directory 留空
Environment variables 不添加
  • exit 0 表示不执行编译,并返回成功状态。
  • . 表示发布 GitHub 仓库根目录,根目录必须存在 index.html
  • 页面可能在输出目录输入框左边固定显示 /,填入 . 后看起来像 /.,这是正常的。

点击 Save and Deploy 后,部署流程大致包括:克隆 GitHub 仓库、执行构建命令、收集输出目录、发布到 Cloudflare 网络。部署成功后会显示 Success! Your project is deployed,本项目得到的临时地址是 personal-website-8xc.pages.dev

首次绑定域名前,应先检查临时地址:首页是否能打开、CSS 是否加载、图片是否显示、JavaScript 功能是否正常、几个子页面是否可以访问。

Cloudflare Pages 可能把 /photo-seoul.html 自动 308 重定向到 /photo-seoul。这是 Pages 的正常简洁 URL 行为,不代表部署失败。

www

绑定 www.ziyuedesign.com

进入 Workers & Pages → personal-website → Custom domains → Set up a domain,输入 www.ziyuedesign.com

Cloudflare 会显示 DNS 变更。本次原记录是 CNAME www ziyuedesign.com,新记录是 CNAME www personal-website-8xc.pages.dev。确认无误后点击 Activate domain

状态可能依次显示 VerifyingInitializingActive。变为 Active 后,www 已经由 Cloudflare Pages 提供,不再访问原服务器。

Apex

绑定裸域名 ziyuedesign.com

只绑定 www 还不够,裸域名可能仍然指向原服务器。关闭原服务器后访问 https://ziyuedesign.com 出现 Cloudflare 522,通常表示裸域名的 DNS 仍指向已关机的原服务器。本次原有记录为 A @ 38.59.225.179

再次进入 Custom domains → Set up a domain,输入 ziyuedesign.com。Cloudflare 会把旧记录替换为 CNAME @ personal-website-8xc.pages.dev,点击 Activate domain 并等待 Active

如果原服务器只运行这个网站,可以继续保持关机;如果服务器还运行数据库、代理、录制程序或其他服务,则不能因为网站迁移完成而直接删除整台服务器。

301

设置统一主域名

网站源码中的 canonical、Open Graph、sitemap 和 robots 配置使用 https://www.ziyuedesign.com,因此建议把 www 作为主域名,并将裸域名永久重定向到 www

在 Cloudflare 中进入 Rules → Redirect Rules → Create rule → Single Redirect:匹配条件 Hostname equals ziyuedesign.com,目标 https://www.ziyuedesign.com,选择保留原路径和查询参数,并使用 301 Permanent Redirect

示例:https://ziyuedesign.com/photo-seoul 应跳转到 https://www.ziyuedesign.com/photo-seoul

不要创建只会把所有页面都跳转到首页、并丢失路径的规则。

Inspect

查看文件变化

Terminal
cd "/Users/sieh/Desktop/Server/个人网站"
git status
git diff
git diff --stat
  • modified:现有文件被修改。
  • untracked:出现尚未被 Git 管理的新文件。
  • deleted:已删除文件。
Commit

加入变化并提交

Terminal
git add -A
git status
git commit -m "新增一篇旅行文章"
git push

-A 会加入新增、修改和删除的文件。提交前再次 git status,确认没有把密码、SSH 私钥、令牌、临时文件或无关的大文件加入提交。

提交说明应简短表达本次修改,例如 新增首尔摄影页面更新饮食文章修复移动端导航替换首页图片。第一次已设置 main 跟踪 origin/main,以后不需要重复输入仓库地址。

Deploy

等待 Cloudflare 自动部署

进入 Workers & Pages → personal-website → Deployments,新提交会自动生成一次部署,一般一到数分钟内完成。

  • Queued:等待执行。
  • Building:正在构建。
  • Success:已经上线。
  • Failed:部署失败,需要查看日志。

如果部署成功但浏览器仍显示旧内容,用 Command + Shift + R 强制刷新。

Single file

只修改了一个文件时

Modified file
git diff index.html
git add index.html
git commit -m "更新首页"
git push
New image
git status
git add img/new-photo.jpeg
git commit -m "添加新图片"
git push
Undo

撤销尚未提交的修改

Discard changes
git restore index.html

这会丢弃该文件尚未提交的修改,执行前必须确认。

Unstage

从待提交区移回工作区

Unstage
git restore --staged index.html

文件内容不会消失,只是不再进入下一次提交。

Build logs

Cloudflare 部署失败时

进入失败的 Deployment,打开 Build logs,重点检查:

  1. GitHub 仓库是否能正常克隆。
  2. Production branch 是否为 main
  3. Build command 是否为 exit 0
  4. Build output directory 是否为 .
  5. 仓库根目录是否存在 index.html
  6. GitHub App 是否仍有仓库读取权限。

如果根地址 https://项目名.pages.dev/ 返回 404,首先检查仓库根目录是否存在 index.html

FAQ 01

仓库列表中没有 GitHub 仓库

打开 github.com/settings/installations,找到 Cloudflare Pages,点击 Configure,把 personal-website 加入可访问仓库。

FAQ 02

进入了 Worker 页面

如果页面出现 Create a Workernpx wrangler deployDeploy command,说明选择错了。返回创建方式页面,点击底部 Looking to deploy Pages? Get started

FAQ 03

www 正常,但裸域名显示 522

原因:裸域名仍指向已经关机的原服务器。解决:将 ziyuedesign.com 也添加到 Pages 的 Custom domains。

FAQ 04

GitHub 页面没有文件

Terminal
git status
git remote -v
git log --oneline
git push

确认 GitHub 页面选择的是 main 分支。

FAQ 05

git push 要求认证

Terminal
ssh -T git@github.com

正常结果应包含 You've successfully authenticated

FAQ 06

页面仍显示旧内容

先检查 Cloudflare Deployment 是否为 Success,然后用 Command + Shift + R 强制刷新浏览器。

FAQ 07

.html 地址自动跳转

Cloudflare Pages 可能把 /about.html 重定向到 /about,这是正常行为。

Rule

git add -A 之前,一定先 git status。

确认待提交列表里只有网站文件,没有任何密钥、令牌或个人配置,再执行提交。

Never commit

禁止提交的内容

  • id_ed25519 等 SSH 私钥。
  • GitHub Personal Access Token。
  • Cloudflare API Token。
  • 数据库密码。
  • 订阅链接或真实访问令牌。
  • .env 文件。
  • 服务器私钥和证书。
.gitignore

建议加入的忽略规则

.gitignore
.DS_Store
.env
.env.*
*.pem
*.key
Key principle

私钥永远不离开本机

不要复制或公开 ~/.ssh/id_ed25519。只能复制以 .pub 结尾的公钥文件。

Done criteria

确认网站已完全脱离原服务器

  1. Cloudflare Pages 最新部署状态为 Success
  2. www.ziyuedesign.com 在 Custom domains 中为 Active
  3. ziyuedesign.com 在 Custom domains 中为 Active
  4. 两个域名都能通过 HTTPS 打开。
  5. 关闭原服务器后两个域名仍然正常。
  6. DNS 中不再使用旧服务器的 A 记录提供网站。
HTTP check

用 curl 检查状态

Terminal
curl -I https://www.ziyuedesign.com
curl -I https://ziyuedesign.com

正常时应看到 HTTP/2 200。如果裸域名配置了 301 跳转,则看到 HTTP/2 301 也正常。

Cheat sheet

最简速查表

首次部署:

  1. 配置 Git 身份 → 初始化本地仓库 → 第一次 commit。
  2. 创建 GitHub 空仓库 → 配置 SSH → git push
  3. Cloudflare Pages 连接 GitHub,Build command 填 exit 0,Build output directory 填 .
  4. 部署 pages.dev 临时地址 → 绑定 www.ziyuedesign.com → 绑定 ziyuedesign.com

日常更新:

Daily update
cd "/Users/sieh/Desktop/Server/个人网站"
git status
git diff
git add -A
git commit -m "说明本次修改"
git push

Cloudflare 随后会自动部署,无需再手动上传文件。