一次 push,就是一次发布。
网站文件和修改历史保存在 GitHub。每次向 main 分支推送新提交,Cloudflare Pages 自动构建并部署,由 Cloudflare 全球网络直接提供访问,不再依赖原来的服务器和 Nginx,HTTPS 证书也由 Cloudflare 自动处理。原服务器关机后,网站仍然可以正常访问。
Skills · Website Deployment
把本地静态网站交给 GitHub 与 Cloudflare Pages,用一次 git push 完成构建、部署与域名发布。
网站文件和修改历史保存在 GitHub。每次向 main 分支推送新提交,Cloudflare Pages 自动构建并部署,由 Cloudflare 全球网络直接提供访问,不再依赖原来的服务器和 Nginx,HTTPS 证书也由 Cloudflare 自动处理。原服务器关机后,网站仍然可以正常访问。
本网站由 HTML、CSS、JavaScript 和图片组成,不需要 Node.js、数据库或服务器端程序,因此非常适合 Cloudflare Pages:没有构建工具也能直接发布仓库根目录。
本地网站文件
编辑 HTML / CSS / 图片
git add · commit · push
提交并推送 main 分支
GitHub 仓库
保存文件与修改历史
Cloudflare Pages
自动触发构建与部署
域名上线
ziyuedesign.com / www
index.html。git --version
能看到类似 git version 2.50.1 的结果,说明 Git 已安装。
cd "/Users/sieh/Desktop/Server/个人网站"
pwd
预期输出 /Users/sieh/Desktop/Server/个人网站。
ls index.html
仓库根目录必须存在 index.html,Cloudflare Pages 发布的就是这个根目录。
Git 的每次提交都需要记录作者姓名和邮箱。打开
github.com/settings/emails,启用
Keep my email addresses private,GitHub 会提供类似
数字+用户名@users.noreply.github.com 的隐私邮箱。
请将下面命令中的 YOUR_GITHUB_NOREPLY_EMAIL 替换为你在 GitHub 邮箱设置页面看到的隐私邮箱。使用隐私邮箱可以避免真实邮箱直接出现在公开的 Git 提交记录中。
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 用户名和隐私邮箱地址。
macOS 经常自动生成 .DS_Store,它不属于网站内容,不应上传。
cd "/Users/sieh/Desktop/Server/个人网站"
printf ".DS_Store\n" > .gitignore
git init -b main
git init:让当前目录成为 Git 仓库。-b main:将默认主分支命名为 main。git add .
git status
git add 只是在本地标记需要记录的文件,不会上传到网络。正确状态通常包含 On branch main、No commits yet、Changes to be committed:。
index.html、CSS、JavaScript、图片和 .gitignore 在列表中。.DS_Store 不在列表中。git commit -m "Initial website"
git log --oneline
git status
本次首次提交为 fb1bde6 Initial website。干净的工作区应显示 nothing to commit, working tree clean。
打开 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。
GitHub 已不支持使用账户密码进行 Git 推送,可以使用 SSH 密钥进行安全认证。先检查是否已有密钥:
ls -la ~/.ssh
常见密钥文件是 id_ed25519 和 id_ed25519.pub。如果不存在,则创建新密钥:
ssh-keygen -t ed25519 -C "YOUR_GITHUB_NOREPLY_EMAIL"
出现 Enter file in which to save the key 时直接按回车,使用默认位置。接下来可以设置密钥密码,输入时终端不会显示字符,这是正常现象。
~/.ssh/id_ed25519:私钥,绝对不能发送、公开或上传。~/.ssh/id_ed25519.pub:公钥,可以添加到 GitHub。如果不慎把密钥生成到了网站目录,应立即将它移出网站目录,并确认它从未被 Git 提交。
pbcopy < ~/.ssh/id_ed25519.pub
打开 github.com/settings/keys,点击 New SSH key:
| 配置项 | 内容 |
|---|---|
| Title | Sieh MacBook Pro |
| Key type | Authentication Key |
| Key | 粘贴完整公钥,通常以 ssh-ed25519 开头 |
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 不提供普通服务器终端。
cd "/Users/rda/Desktop/Server/personal-web"
git remote add origin git@github.com:ziyue-97/personal-website.git
origin 是远程仓库的常用别名。
git remote -v
预期输出两行,分别是 origin git@github.com:ziyue-97/personal-website.git (fetch) 和 (push)。
git push -u origin main
git push:把本地提交上传到 GitHub。-u origin main:让本地 main 分支跟踪 GitHub 的 origin/main。git push。成功结果类似 [new branch] main -> main 和 branch 'main' set up to track 'origin/main'。刷新 GitHub 仓库页面,应当可以看到 index.html、CSS、JavaScript、图片目录等文件。
登录 Cloudflare Dashboard,进入 Workers & Pages,点击 Create application。
正确入口位于创建页面底部的 Looking to deploy Pages? Get started,点击其中的 Get started,进入 Cloudflare Pages 后选择 GitHub。
Cloudflare 新界面默认突出显示 Worker。以下入口属于 Worker,不适合本次 Pages 部署:
Continue with GitHubCreate a WorkerDeploy commandnpx wrangler deployziyue-97。Only select repositories。personal-website。personal-website。Begin setup。Configure。personal-website。本网站没有框架和构建工具,因此配置如下:
| 配置项 | 内容 |
|---|---|
| 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 行为,不代表部署失败。
进入 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。
状态可能依次显示 Verifying、Initializing、Active。变为 Active 后,www 已经由 Cloudflare Pages 提供,不再访问原服务器。
只绑定 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。
如果原服务器只运行这个网站,可以继续保持关机;如果服务器还运行数据库、代理、录制程序或其他服务,则不能因为网站迁移完成而直接删除整台服务器。
网站源码中的 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。
不要创建只会把所有页面都跳转到首页、并丢失路径的规则。
cd "/Users/sieh/Desktop/Server/个人网站"
git status
git diff
git diff --stat
modified:现有文件被修改。untracked:出现尚未被 Git 管理的新文件。deleted:已删除文件。git add -A
git status
git commit -m "新增一篇旅行文章"
git push
-A 会加入新增、修改和删除的文件。提交前再次 git status,确认没有把密码、SSH 私钥、令牌、临时文件或无关的大文件加入提交。
提交说明应简短表达本次修改,例如 新增首尔摄影页面、更新饮食文章、修复移动端导航、替换首页图片。第一次已设置 main 跟踪 origin/main,以后不需要重复输入仓库地址。
进入 Workers & Pages → personal-website → Deployments,新提交会自动生成一次部署,一般一到数分钟内完成。
Queued:等待执行。Building:正在构建。Success:已经上线。Failed:部署失败,需要查看日志。如果部署成功但浏览器仍显示旧内容,用 Command + Shift + R 强制刷新。
git diff index.html
git add index.html
git commit -m "更新首页"
git push
git status
git add img/new-photo.jpeg
git commit -m "添加新图片"
git push
git restore index.html
这会丢弃该文件尚未提交的修改,执行前必须确认。
git restore --staged index.html
文件内容不会消失,只是不再进入下一次提交。
进入失败的 Deployment,打开 Build logs,重点检查:
main。exit 0。.。index.html。如果根地址 https://项目名.pages.dev/ 返回 404,首先检查仓库根目录是否存在 index.html。
打开 github.com/settings/installations,找到 Cloudflare Pages,点击 Configure,把 personal-website 加入可访问仓库。
如果页面出现 Create a Worker、npx wrangler deploy、Deploy command,说明选择错了。返回创建方式页面,点击底部 Looking to deploy Pages? Get started。
原因:裸域名仍指向已经关机的原服务器。解决:将 ziyuedesign.com 也添加到 Pages 的 Custom domains。
git status
git remote -v
git log --oneline
git push
确认 GitHub 页面选择的是 main 分支。
ssh -T git@github.com
正常结果应包含 You've successfully authenticated。
先检查 Cloudflare Deployment 是否为 Success,然后用 Command + Shift + R 强制刷新浏览器。
Cloudflare Pages 可能把 /about.html 重定向到 /about,这是正常行为。
确认待提交列表里只有网站文件,没有任何密钥、令牌或个人配置,再执行提交。
id_ed25519 等 SSH 私钥。.env 文件。.DS_Store
.env
.env.*
*.pem
*.key
不要复制或公开 ~/.ssh/id_ed25519。只能复制以 .pub 结尾的公钥文件。
Success。www.ziyuedesign.com 在 Custom domains 中为 Active。ziyuedesign.com 在 Custom domains 中为 Active。curl -I https://www.ziyuedesign.com
curl -I https://ziyuedesign.com
正常时应看到 HTTP/2 200。如果裸域名配置了 301 跳转,则看到 HTTP/2 301 也正常。
首次部署:
git push。exit 0,Build output directory 填 .。www.ziyuedesign.com → 绑定 ziyuedesign.com。日常更新:
cd "/Users/sieh/Desktop/Server/个人网站"
git status
git diff
git add -A
git commit -m "说明本次修改"
git push
Cloudflare 随后会自动部署,无需再手动上传文件。