<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>枫栈</title><description>记录与思考</description><link>http://localhost:4321/</link><language>zh_CN</language><item><title>从零部署个人博客：完整使用指南</title><link>http://localhost:4321/posts/blog-deployment-guide/</link><guid isPermaLink="true">http://localhost:4321/posts/blog-deployment-guide/</guid><description>从 GitHub 获取模板开始，一步步完成 Cloudflare Pages 部署、后台写作、日记、音乐、友链、荣誉墙和 Twikoo 留言配置。</description><pubDate>Mon, 02 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这份指南面向第一次使用本模板的人。从 GitHub 获取代码开始，完成本地预览、个人资料修改、Cloudflare Pages 上线、后台写作、音乐、日记、友链、荣誉墙和 Twikoo 留言板配置。&lt;/p&gt;
&lt;p&gt;适用对象：本仓库当前模板版本。命令以 &lt;strong&gt;Windows PowerShell&lt;/strong&gt; 为例；macOS / Linux 用户可将本地路径换成自己的路径，其余 Git、Node.js 和 pnpm 命令基本一致。&lt;/p&gt;
&lt;p&gt;外部平台文档核对日期：&lt;strong&gt;2026-11-02&lt;/strong&gt;。控制台可能调整按钮名称，下面同时给出功能名称和替代路径；遇到界面差异时，以链接中的官方说明为准。&lt;/p&gt;
&lt;h2&gt;目录&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#step-1&quot;&gt;先了解部署结果与所需账户&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-2&quot;&gt;从 GitHub 创建自己的博客仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-3&quot;&gt;安装并检查本地工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-4&quot;&gt;拉取代码并启动本地预览&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-5&quot;&gt;修改博客身份与外观&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-6&quot;&gt;检查、构建并提交修改&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-7&quot;&gt;部署到 Cloudflare Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-8&quot;&gt;填写正式网址与绑定域名&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-9&quot;&gt;启用后台管理系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-10&quot;&gt;发布文章和日记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-11&quot;&gt;配置音乐、友链和荣誉墙&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-12&quot;&gt;部署并接入留言板&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-13&quot;&gt;日常维护、备份与版本更新&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-14&quot;&gt;常见错误排查&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-15&quot;&gt;上线验收清单&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-16&quot;&gt;配置速查与官方资料&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-1&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;1. 先了解部署结果与所需账户&lt;/h2&gt;
&lt;h3&gt;1.1 最终会得到什么&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;完成哪个阶段后可用&lt;/th&gt;
&lt;th&gt;内容放在哪里&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主页、文章、日记、关于、友链、荣誉墙、小游戏、主题切换&lt;/td&gt;
&lt;td&gt;首次部署成功&lt;/td&gt;
&lt;td&gt;GitHub 仓库内的代码与 Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;搜索、RSS、站点地图&lt;/td&gt;
&lt;td&gt;正式构建并部署成功&lt;/td&gt;
&lt;td&gt;构建时自动生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;音乐播放、切歌、音量、播放模式&lt;/td&gt;
&lt;td&gt;加入音频与歌单后&lt;/td&gt;
&lt;td&gt;仓库的 &lt;code&gt;public/audio/&lt;/code&gt; 与歌单文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网页后台写文章、日记、编辑各内容模块&lt;/td&gt;
&lt;td&gt;配好 Pages Functions 和后台变量后&lt;/td&gt;
&lt;td&gt;后台向你的 GitHub 仓库提交文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;访客留言、留言审核与删除&lt;/td&gt;
&lt;td&gt;另行接入自己的 Twikoo 服务后&lt;/td&gt;
&lt;td&gt;独立留言服务的数据库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自定义域名&lt;/td&gt;
&lt;td&gt;可选，绑定域名后&lt;/td&gt;
&lt;td&gt;域名提供商与 Cloudflare 配置&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;模板已经有页面与交互，不需要从头开发。头像、个人资料、文章、日记等使用示例；歌单为空，留言服务与后台凭据未配置。&lt;/p&gt;
&lt;h3&gt;1.2 准备这些账户和工具&lt;/h3&gt;
&lt;p&gt;必需：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 账户：保存自己的博客源码和文章。&lt;/li&gt;
&lt;li&gt;Cloudflare 账户：部署网站与现有后台 API。&lt;/li&gt;
&lt;li&gt;一台安装 Git、Node.js 22 和 pnpm 9.14.4 的电脑。&lt;/li&gt;
&lt;li&gt;一个代码编辑器，例如 VS Code。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按需准备：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;域名：可以先使用免费的 &lt;code&gt;xxx.pages.dev&lt;/code&gt; 地址。&lt;/li&gt;
&lt;li&gt;Cloudflare 账户：博客部署、后台接口与留言板都跑在同一个 Cloudflare 账号里。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;博客前台和写作后台不需要 MySQL 或单独购买服务器。&lt;/strong&gt; 留言数据存在 Cloudflare D1，可选启用。现有后台运行于 Cloudflare Pages Functions，GitHub Pages 本身不能运行这些接口。&lt;/p&gt;
&lt;p&gt;平台有免费套餐及用量限制，不能理解为无限流量、无限构建或永久不变的免费政策。本文不要求先开付费套餐；创建资源时查看当前计费页，避免误选付费数据库或加购项目。&lt;/p&gt;
&lt;h3&gt;1.3 理解更新流程&lt;/h3&gt;
&lt;p&gt;前台是静态构建，后台是文件管理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;本地编辑 → git push → GitHub → Cloudflare 自动构建 → 网站更新
网页后台保存 ─────────→ GitHub → Cloudflare 自动构建 → 网站更新

访客留言 → Twikoo 服务 → 留言数据库（不需要每条留言重建博客）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后台显示“保存成功”表示内容已经写入仓库，前台更新还要等部署完成。&lt;/p&gt;
&lt;h3&gt;1.4 本文占位符约定&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;th&gt;你应该替换成什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;23ypz/blog_template&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;本模板的公开仓库：&lt;a href=&quot;https://github.com/23ypz/blog_template&quot;&gt;https://github.com/23ypz/blog_template&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YOUR_GITHUB_NAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你自己的 GitHub 用户名，或拥有博客仓库的组织名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-blog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你自己新建的博客仓库名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;D:\Projects\my-blog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你保存博客的本地目录，可自行更改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-blog.pages.dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cloudflare 实际分配的项目地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;https://你的域名.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你自己的正式博客网址&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;复制命令前替换占位符。不要在 URL 或变量里保留“你的用户名”等说明文字。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-2&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;2. 从 GitHub 创建自己的博客仓库&lt;/h2&gt;
&lt;h3&gt;2.1 推荐：使用模板创建仓库&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开模板仓库：&lt;a href=&quot;https://github.com/23ypz/blog_template&quot;&gt;23ypz/blog_template&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;如果页面有 &lt;strong&gt;Use this template → Create a new repository&lt;/strong&gt;，点击它。&lt;/li&gt;
&lt;li&gt;Owner 选择你自己；Repository name 填 &lt;code&gt;my-blog&lt;/code&gt; 或喜欢的名称。&lt;/li&gt;
&lt;li&gt;若可选，选择只复制默认分支，无需其他分支。&lt;/li&gt;
&lt;li&gt;选择 Public 或 Private，创建仓库。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cloudflare Pages 的 Git 集成支持公开与私有仓库；私有仓库需要在授权时允许 Cloudflare 读取。&lt;strong&gt;网站部署后能访问的内容仍是公开的&lt;/strong&gt;，仓库设为 Private 不等于给网站加密码。&lt;a href=&quot;https://developers.cloudflare.com/pages/get-started/git-integration/&quot;&gt;Cloudflare Git 集成说明&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;2.2 没有 Use this template 时&lt;/h3&gt;
&lt;p&gt;可以点击 &lt;strong&gt;Fork&lt;/strong&gt;，创建属于自己账户的副本，再部署自己的仓库。公开仓库的 Fork 通常保持公开；希望独立设为私有时，优先使用模板创建功能。&lt;/p&gt;
&lt;p&gt;如果发布者未启用模板功能，而你需要私有仓库，可用以下方法创建独立副本：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下载模板仓库的 &lt;strong&gt;Code → Download ZIP&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;解压到计划使用的博客目录，确认其中直接包含 &lt;code&gt;package.json&lt;/code&gt;、&lt;code&gt;src&lt;/code&gt;、&lt;code&gt;functions&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在 GitHub 新建一个空的 Private 仓库，先不要勾选生成 README、LICENSE 或 .gitignore。&lt;/li&gt;
&lt;li&gt;安装 Git 后，在解压目录运行：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cd D:\Projects\my-blog
git init
git branch -M main
git add .
git commit -m &quot;chore: initialize blog from template&quot;
git remote add origin https://github.com/YOUR_GITHUB_NAME/my-blog.git
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此方法只用于没有 Git 历史的 ZIP 目录。通过模板或 Fork 创建并 clone 的项目，跳过这些初始化命令。&lt;/p&gt;
&lt;p&gt;若第一次 commit 提示缺少姓名或邮箱，先按第 6.2 节设置 Git 提交身份，再重试该命令。&lt;/p&gt;
&lt;h3&gt;2.3 检查结果&lt;/h3&gt;
&lt;p&gt;浏览器地址应该是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://github.com/YOUR_GITHUB_NAME/my-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;仓库根目录应看到 &lt;code&gt;package.json&lt;/code&gt;、&lt;code&gt;pnpm-lock.yaml&lt;/code&gt;、&lt;code&gt;astro.config.mjs&lt;/code&gt;、&lt;code&gt;src/&lt;/code&gt;、&lt;code&gt;public/&lt;/code&gt;、&lt;code&gt;functions/&lt;/code&gt; 等。以后部署、后台 Token 和提交操作都针对&lt;strong&gt;这个属于你的仓库&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-3&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;3. 安装并检查本地工具&lt;/h2&gt;
&lt;h3&gt;3.1 打开命令行&lt;/h3&gt;
&lt;p&gt;Windows 开始菜单搜索 PowerShell，打开普通终端即可。下文命令框不包含 &lt;code&gt;PS D:\...&amp;gt;&lt;/code&gt; 提示符，只复制命令本身。一行一个命令，看到错误先处理，不要接着执行依赖它的后续步骤。&lt;/p&gt;
&lt;h3&gt;3.2 检查是否已经安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git --version
node --version
npm --version
corepack --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预期：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git 能输出版本号。&lt;/li&gt;
&lt;li&gt;Node 输出 &lt;code&gt;v22.x.x&lt;/code&gt;。为保持与此模板一致，建议先使用 Node 22。&lt;/li&gt;
&lt;li&gt;npm 随 Node 安装，用于安装包管理器。&lt;/li&gt;
&lt;li&gt;Corepack 可输出版本；如果没有，也可以走下面的 pnpm 备用安装方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;未安装时从官网下载 &lt;a href=&quot;https://git-scm.com/downloads&quot;&gt;Git&lt;/a&gt;、&lt;a href=&quot;https://nodejs.org/en/download&quot;&gt;Node.js&lt;/a&gt; 和可选的 &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;。安装完成后关闭并重新打开 PowerShell，再检查。&lt;/p&gt;
&lt;h3&gt;3.3 使用 pnpm 9.14.4&lt;/h3&gt;
&lt;p&gt;本项目锁定 &lt;code&gt;pnpm@9.14.4&lt;/code&gt;，不能用 &lt;code&gt;npm install&lt;/code&gt; 或 Yarn 代替安装项目依赖。&lt;/p&gt;
&lt;p&gt;有 Corepack 时先运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;corepack pnpm --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入项目根目录后应使用模板声明的 9.14.4。本文后续统一写 &lt;code&gt;corepack pnpm ...&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果提示找不到 Corepack，或 Corepack 下载/签名报错，可以安装指定版本的 pnpm：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install --global pnpm@9.14.4
pnpm --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后将本文的 &lt;code&gt;corepack pnpm install&lt;/code&gt;、&lt;code&gt;corepack pnpm dev&lt;/code&gt; 等分别换成 &lt;code&gt;pnpm install&lt;/code&gt;、&lt;code&gt;pnpm dev&lt;/code&gt;。不要反复交替使用不同包管理器。&lt;/p&gt;
&lt;p&gt;如果 PowerShell 提示 &lt;code&gt;pnpm.ps1&lt;/code&gt; / &lt;code&gt;npm.ps1&lt;/code&gt; 无法运行，可先用 &lt;code&gt;pnpm.cmd&lt;/code&gt; / &lt;code&gt;npm.cmd&lt;/code&gt; 执行对应命令，无需为了安装修改全局执行策略。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-4&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;4. 拉取代码并启动本地预览&lt;/h2&gt;
&lt;p&gt;以下以“已经在 GitHub 创建自己的仓库”为前提。采用 ZIP 方法且已经有本地源码的读者，直接进入该目录，从安装依赖开始。&lt;/p&gt;
&lt;h3&gt;4.1 拉取自己的仓库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;New-Item -ItemType Directory -Force D:\Projects
cd D:\Projects
git clone https://github.com/YOUR_GITHUB_NAME/my-blog.git
cd .\my-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果目标文件夹已经存在并有文件，不要覆盖或重复 clone 到里面。选择一个新路径，或确认已有目录就是正确的仓库后使用它。&lt;/p&gt;
&lt;p&gt;检查位置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-Location
Test-Path .\package.json
git remote -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应在自己的项目根目录，&lt;code&gt;Test-Path&lt;/code&gt; 输出 &lt;code&gt;True&lt;/code&gt;，&lt;code&gt;origin&lt;/code&gt; 指向自己的仓库。&lt;/p&gt;
&lt;p&gt;私有仓库 clone 时按 Git Credential Manager 的浏览器提示登录 GitHub。GitHub 网页登录密码不能直接当作 HTTPS Git 密码；不要把 Token 拼进 clone URL 或写入教程。&lt;/p&gt;
&lt;h3&gt;4.2 安装依赖&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;corepack pnpm install --frozen-lockfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次会下载较多依赖。看到安装完成、命令提示符重新出现，才进入下一步。保留仓库的 &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;，不要通过删除锁文件掩盖版本问题。&lt;/p&gt;
&lt;h3&gt;4.3 启动开发预览&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;corepack pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;终端会显示类似 &lt;code&gt;http://localhost:4321/&lt;/code&gt;，在浏览器打开它。端口被占用时可能换成 4322 等，始终以当前终端显示的地址为准。&lt;/p&gt;
&lt;p&gt;成功标志：能看到示例头像和主页，并打开文章、日记、音乐、友链、留言板、关于页面。此时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;空歌单正常。&lt;/li&gt;
&lt;li&gt;留言板显示尚未配置正常。&lt;/li&gt;
&lt;li&gt;后台可以展示界面，但不能靠这个开发命令完成登录。&lt;/li&gt;
&lt;li&gt;开发模式尚无完整搜索索引，搜索应在构建预览或正式站检查。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编辑文件、按 Ctrl+S 保存后，开发页面通常会自动更新。关闭浏览器不会停止服务；返回运行服务的终端按 &lt;strong&gt;Ctrl+C&lt;/strong&gt; 才会停止。&lt;/p&gt;
&lt;h3&gt;4.4 用编辑器打开&lt;/h3&gt;
&lt;p&gt;在 VS Code 中选择“文件 → 打开文件夹”，打开 &lt;code&gt;D:\Projects\my-blog&lt;/code&gt;。若安装了 &lt;code&gt;code&lt;/code&gt; 命令，也可在项目根目录执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-5&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;5. 修改博客身份与外观&lt;/h2&gt;
&lt;p&gt;先改基本资料，保留示例文章和日记用于验证流程，全部打通后再删除。&lt;/p&gt;
&lt;h3&gt;5.1 修改标题、昵称、头像与主题色&lt;/h3&gt;
&lt;p&gt;打开 &lt;code&gt;src/config.ts&lt;/code&gt;，修改现有对象中的字段，保留其他字段和 TypeScript 语法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// siteConfig 中
title: &quot;我的小站&quot;,
subtitle: &quot;&quot;,
siteStartedAt: &quot;2026-01-01&quot;,
themeColor: { hue: 252, fixed: false },

// profileConfig 中
avatar: &quot;/images/avatar.svg&quot;,
name: &quot;你的昵称&quot;,
bio: &quot;记录生活、学习和正在发生的小事。&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;subtitle: &quot;&quot;&lt;/code&gt; 表示不填写副标题。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;siteStartedAt&lt;/code&gt; 是网站运行时间的起点，按 &lt;code&gt;YYYY-MM-DD&lt;/code&gt; 填写。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hue&lt;/code&gt; 是色相，通常在 0～360 之间；访客的主题选择可能已存在本地缓存中。&lt;/li&gt;
&lt;li&gt;这些片段分属不同对象，不要当作整个配置文件覆盖粘贴。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 更换头像和图标&lt;/h3&gt;
&lt;p&gt;模板头像在 &lt;code&gt;public/images/avatar.svg&lt;/code&gt;。使用自己的图片可：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把图片放到 &lt;code&gt;public/images/my-avatar.webp&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;profileConfig.avatar&lt;/code&gt; 改为 &lt;code&gt;&quot;/images/my-avatar.webp&quot;&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如需同时用作网站图标，修改 &lt;code&gt;siteConfig.favicon&lt;/code&gt; 的 &lt;code&gt;src&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;后台页面独立：&lt;code&gt;src/pages/admin/index.astro&lt;/code&gt; 的 favicon 和品牌名称也可同步修改。更换 favicon 格式时，同时修改或移除不匹配的 &lt;code&gt;type=&quot;image/svg+xml&quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用清晰、接近正方形的原图，例如 512×512 像素以上；大头像展示不适合拉伸很小的缩略图。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;路径规则：&lt;/strong&gt;&lt;code&gt;public/images/a.jpg&lt;/code&gt; 在网页上的地址是 &lt;code&gt;/images/a.jpg&lt;/code&gt;，不写 &lt;code&gt;/public/images/a.jpg&lt;/code&gt;。不要把 JPG 仅改扩展名为 SVG；图片格式不会因重命名转换。线上文件名大小写敏感。&lt;/p&gt;
&lt;h3&gt;5.3 关于、首页标签与联系方式&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你要改什么&lt;/th&gt;
&lt;th&gt;修改文件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;关于页城市、专业、性别、简介、兴趣&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/pages/about.astro&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;首页大头像区域的标签与文字&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/components/HomeHero.astro&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;昵称、简介、公开社交链接&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/config.ts&lt;/code&gt; 的 &lt;code&gt;profileConfig&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;导航模块与顺序&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/config.ts&lt;/code&gt; 的 &lt;code&gt;navBarConfig.links&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;随机语录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/data/quotes.ts&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台顶栏博客名&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/pages/admin/index.astro&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;联系方式示例，放进现有 &lt;code&gt;profileConfig.links&lt;/code&gt; 数组中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{ name: &quot;Bilibili&quot;, icon: &quot;fa6-brands:bilibili&quot;, url: &quot;https://space.bilibili.com/你的编号&quot; },
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用前替换为真实地址。没有要公开的联系方式，保持空数组即可。新增图标名称需是当前项目图标工具支持的名称；优先参考现有图标，避免图标不存在导致构建失败。&lt;/p&gt;
&lt;h3&gt;5.4 背景与现有交互&lt;/h3&gt;
&lt;p&gt;模板保留动态背景、悬停动画、日历和小游戏，不需要额外购买插件。默认 &lt;code&gt;banner.enable: false&lt;/code&gt;；修改横幅配置会改变页面展示，不必为了让现有主页工作而开启它。&lt;/p&gt;
&lt;p&gt;先使用现有主题配置调整色调。若要修改组件样式，每次只改少量内容，并检查浅色、深色、桌面、手机布局。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-6&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;6. 检查、构建并提交修改&lt;/h2&gt;
&lt;h3&gt;6.1 本地检查&lt;/h3&gt;
&lt;p&gt;停止开发服务器，或另开终端进入项目根目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;corepack pnpm check
corepack pnpm build
corepack pnpm preview
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三条命令分开运行，前一项成功再继续。&lt;code&gt;preview&lt;/code&gt; 会持续占用终端，浏览器访问它输出的地址，结束按 Ctrl+C。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;check&lt;/code&gt; 检查 Astro / TypeScript。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build&lt;/code&gt; 生成 &lt;code&gt;dist/&lt;/code&gt; 和 Pagefind 搜索索引。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preview&lt;/code&gt; 查看这次构建结果；源码改动后需要重新 build 才会更新此预览。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preview&lt;/code&gt; 同样不运行 Cloudflare 后台接口。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;成功标志：构建完成，没有报错；搜索能找到示例文章，页面和图片正常。&lt;/p&gt;
&lt;h3&gt;6.2 提交到自己的 GitHub&lt;/h3&gt;
&lt;p&gt;先查看待提交文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git status
git diff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认没有密码、Token、私人文档等，再运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add .
git commit -m &quot;chore: personalize my blog&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次提交若提示缺少姓名和邮箱，可仅对这个仓库设置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config user.name &quot;你的公开署名&quot;
git config user.email &quot;你在 GitHub 设置中复制的 noreply 邮箱&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;邮箱可在 GitHub &lt;strong&gt;Settings → Emails&lt;/strong&gt; 找到；随后重试 commit 和 push。如果显示 &lt;code&gt;nothing to commit&lt;/code&gt;，说明当前没有新改动，不必强行重复提交。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;node_modules/&lt;/code&gt;、&lt;code&gt;dist/&lt;/code&gt;、&lt;code&gt;.astro/&lt;/code&gt;、&lt;code&gt;.env*&lt;/code&gt;、&lt;code&gt;.dev.vars*&lt;/code&gt; 等已通过忽略规则排除；保留作为空白配置示例的 &lt;code&gt;.env.example&lt;/code&gt;。上传源码与锁文件即可。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-7&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;7. 部署到 Cloudflare Pages&lt;/h2&gt;
&lt;p&gt;这一节只部署博客，后台密码稍后配置。&lt;/p&gt;
&lt;h3&gt;7.1 创建 Git 集成的 Pages 项目&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登录 &lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare 控制台&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;进入 &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt;（Workers 和 Pages）。&lt;/li&gt;
&lt;li&gt;选择 &lt;strong&gt;Create application&lt;/strong&gt;，切到 &lt;strong&gt;Pages&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;选择 &lt;strong&gt;Connect to Git / Import an existing Git repository&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;连接 GitHub，授权 Cloudflare 访问你自己的博客仓库。&lt;/li&gt;
&lt;li&gt;选择 &lt;code&gt;YOUR_GITHUB_NAME/my-blog&lt;/code&gt;，进入构建配置。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果默认展示的是创建 Worker 的页面，寻找 Pages 标签或切换入口。本项目主路线是 &lt;strong&gt;Pages + Git 集成&lt;/strong&gt;，不需要自行改成 Worker，也不需要安装 Astro SSR 适配器。&lt;/p&gt;
&lt;p&gt;官方当前指南提供上述入口；不同控制台可能分别写“Connect to Git”或“Import an existing Git repository”。&lt;a href=&quot;https://developers.cloudflare.com/pages/framework-guides/deploy-an-astro-site/&quot;&gt;Astro 部署指南&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;7.2 填写构建参数&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;填写值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project name&lt;/td&gt;
&lt;td&gt;自定义，例如 &lt;code&gt;my-little-blog&lt;/code&gt;；影响默认网址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production branch&lt;/td&gt;
&lt;td&gt;你的主分支，本文用 &lt;code&gt;main&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framework preset&lt;/td&gt;
&lt;td&gt;Astro；也可以不选，手动填写下面两项&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build command&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;pnpm build&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build output directory&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;dist&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Root directory / Path&lt;/td&gt;
&lt;td&gt;留空使用仓库根目录；不要填 &lt;code&gt;src&lt;/code&gt; 或 &lt;code&gt;dist&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;构建命令使用项目的 &lt;code&gt;pnpm build&lt;/code&gt;，其中包含搜索索引生成。不要只写 &lt;code&gt;astro build&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;在构建环境变量中设置：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NODE_VERSION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PNPM_VERSION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;9.14.4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;版本覆盖变量来自 Cloudflare 的构建环境说明，避免平台默认 pnpm 版本变化影响锁文件。&lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-image/&quot;&gt;构建镜像与版本覆盖&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;7.3 首次部署&lt;/h3&gt;
&lt;p&gt;点击 &lt;strong&gt;Save and Deploy / Deploy&lt;/strong&gt;，等待构建和发布完成。状态成功后，打开 Cloudflare 给出的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://你的项目名.pages.dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;记录这个真实地址。此时前台应该能访问，空歌单和未配置留言提示仍然正常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;保留根目录的 &lt;code&gt;functions/&lt;/code&gt; 并通过 Git 集成构建。&lt;/strong&gt; 只把 &lt;code&gt;dist/&lt;/code&gt; 拖到普通静态上传入口，不能按本文方式获得完整后台接口。&lt;/p&gt;
&lt;h3&gt;7.4 后续如何更新、重新部署&lt;/h3&gt;
&lt;p&gt;连接 Git 后，每次向生产分支 push 新提交，通常都会自动部署，不需要每次新建项目。&lt;/p&gt;
&lt;p&gt;查看项目的 &lt;strong&gt;Deployments&lt;/strong&gt; 页面，核对最近一项的分支、提交号和状态。修改变量后，应创建使用新配置的部署；可使用界面提供的 &lt;strong&gt;Create deployment / Retry deployment / Redeploy&lt;/strong&gt; 等操作，以实际项目界面为准。&lt;/p&gt;
&lt;p&gt;如果找不到按钮，先确认本地没有需要处理的改动，并已同步仓库，然后推送一条空提交触发新部署：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd D:\Projects\my-blog
git status
git pull --ff-only
git commit --allow-empty -m &quot;chore: redeploy after configuration change&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里只向自己的博客仓库操作。若 &lt;code&gt;pull&lt;/code&gt; 报冲突或工作区有未提交内容，先按第 13 节处理，不要强制覆盖。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-8&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;8. 填写正式网址与绑定域名&lt;/h2&gt;
&lt;h3&gt;8.1 不买域名也可以使用&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pages.dev&lt;/code&gt; 可用于浏览博客和登录后台。是否购买域名取决于你是否需要独立网址；域名不是接入本文后台或留言方案的必需条件。&lt;/p&gt;
&lt;p&gt;跨地区访问质量受网络影响，免费地址和自定义域名都不能保证在所有网络下始终畅通。用手机流量和其他网络分别测试。&lt;/p&gt;
&lt;h3&gt;8.2 修改站点正式地址&lt;/h3&gt;
&lt;p&gt;打开 &lt;code&gt;astro.config.mjs&lt;/code&gt;，找到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const siteUrl = (process.env.SITE_URL || &quot;http://localhost:4321&quot;).replace(/\/+$/, &quot;&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部署时在 Cloudflare Pages 的环境变量里配置 &lt;code&gt;SITE_URL&lt;/code&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SITE_URL=https://fengzhan.pages.dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本地不设置这个变量时会退回 &lt;code&gt;http://localhost:4321&lt;/code&gt;，不会生成指向示例域名的链接。&lt;/p&gt;
&lt;p&gt;这里只写站点来源地址，不填 &lt;code&gt;/admin/&lt;/code&gt;，也不填 GitHub 仓库 URL。该配置影响规范链接、RSS 和站点地图，正式部署前必须填上自己的地址。&lt;/p&gt;
&lt;p&gt;提交并推送：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add astro.config.mjs
git commit -m &quot;chore: set production site URL&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.3 可选：绑定自己的域名&lt;/h3&gt;
&lt;p&gt;在 Pages 项目进入 &lt;strong&gt;Custom domains → Set up a domain&lt;/strong&gt;，先在项目里添加域名，再按引导配置 DNS。&lt;/p&gt;
&lt;p&gt;两种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;**根域名 &lt;code&gt;你的域名.com&lt;/code&gt;：**按 Pages 官方要求，把该域名作为站点加入同一 Cloudflare 账户，并在注册商处将名称服务器切换为 Cloudflare 分配的地址。切换前先核对并保留已有网站、邮箱等 DNS 记录。&lt;/li&gt;
&lt;li&gt;**子域名 &lt;code&gt;blog.你的域名.com&lt;/code&gt;：**可继续使用现有 DNS 服务商，在 Pages 添加后，根据提示新增 CNAME，目标为 &lt;code&gt;你的项目.pages.dev&lt;/code&gt;，不带 &lt;code&gt;https://&lt;/code&gt; 和路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不要只添加一条 CNAME 而跳过 Pages 内的域名绑定。等待域名状态和 HTTPS 证书正常后再访问。&lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/custom-domains/&quot;&gt;Cloudflare 自定义域名说明&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;成功后，再将 &lt;code&gt;astro.config.mjs&lt;/code&gt; 的 &lt;code&gt;site&lt;/code&gt; 改为最终域名，提交并等待部署。如果以后更换域名，也要同步留言服务的来源域名配置。&lt;/p&gt;
&lt;h3&gt;8.4 可选：接入 Cloudflare Web Analytics&lt;/h3&gt;
&lt;p&gt;博客首页侧栏的「站点统计」读取的是 Cloudflare 自带的 Web Analytics 数据。默认不配置，组件显示「未接入访问统计」，&lt;strong&gt;不会用假数字兜底&lt;/strong&gt;。想要真实访问数据时按下面配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：在 Pages 里开启 Web Analytics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;进入项目 &lt;strong&gt;Metrics → Web Analytics → Enable&lt;/strong&gt;。如果用的是 &lt;strong&gt;Enable with JS snippet installation&lt;/strong&gt;（手动安装），把面板给出的 token 记下来。Pages 的自动注入在部分站点上不生效，本项目采用手动注入方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：配置四个环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;strong&gt;Settings → Variables and Secrets&lt;/strong&gt; 添加：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;从哪里取&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PUBLIC_CF_BEACON_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;td&gt;Web Analytics 面板给出的站点 token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CF_ACCOUNT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;td&gt;Cloudflare 账号 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CF_API_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Secret，保密&lt;/td&gt;
&lt;td&gt;见下方说明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CF_SITE_TAG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;td&gt;Web Analytics 面板 URL 里的站点 tag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;PUBLIC_CF_BEACON_TOKEN&lt;/code&gt; 会打进前端构建产物并在页面里明文出现，这是&lt;strong&gt;公开标识而不是密钥&lt;/strong&gt;，可以放心使用。其余三个是服务端变量，&lt;code&gt;functions/api/stats.ts&lt;/code&gt; 在 Cloudflare 侧读取，不要加 &lt;code&gt;PUBLIC_&lt;/code&gt; 前缀。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：创建 API Token&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;进入 Cloudflare 控制台的 &lt;strong&gt;My Profile → API Tokens → Create Token&lt;/strong&gt;，使用 &lt;strong&gt;Edit Cloudflare Workers&lt;/strong&gt; 模板或自定义 Token，权限需要包含：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Account → Account Analytics → Read
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建后把 Token 值填入 &lt;code&gt;CF_API_TOKEN&lt;/code&gt;，存为 Secret。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步：重新部署并验证&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;保存变量后创建一次新部署（见 7.4 节）。打开首页侧栏的「站点统计」，应看到「页面浏览」和「访问次数」两个数字，底部标注「近 7 天 · 数据来自 Cloudflare」。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关于指标口径&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;页面浏览：成功返回 HTML 的页面请求数。&lt;/li&gt;
&lt;li&gt;访问次数：Referer 主机名与本站不同的页面浏览，含直接访问。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudflare &lt;strong&gt;不统计独立访客数、跳出率和停留时长&lt;/strong&gt;，所以组件里没有「总访客」这一项。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;已知限制&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare 的 RUM 数据集只对**美国元数据边界（US metadata boundary）**的账号返回，其他区域的账号可能查不到数据。&lt;/li&gt;
&lt;li&gt;采样与数据新旧有关：最近几天是精确值，更早的数据约 10% 采样，界面只取最近 7 天。Cloudflare 官方说明采样后的返回值已经放大过，不需要再乘一次。&lt;/li&gt;
&lt;li&gt;GraphQL API 配额为每 5 分钟 300 次查询；接口端带 30 分钟缓存，正常浏览不会超限。&lt;/li&gt;
&lt;li&gt;本地 &lt;code&gt;pnpm preview&lt;/code&gt; 不运行 Pages Functions，&lt;code&gt;/api/stats&lt;/code&gt; 返回 404 属正常，需到线上验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/web-analytics/&quot;&gt;Cloudflare Web Analytics 文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-9&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;9. 启用后台管理系统&lt;/h2&gt;
&lt;p&gt;后台地址是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://你的博客网址/admin/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有附带默认密码。后台有独立登录页面，但需要以下配置才能读写你自己的仓库。&lt;/p&gt;
&lt;h3&gt;9.1 创建 GitHub Fine-grained Token&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登录拥有博客仓库的 GitHub 账户。&lt;/li&gt;
&lt;li&gt;进入个人 &lt;strong&gt;Settings → Developer settings → Personal access tokens → Fine-grained tokens&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;选择 &lt;strong&gt;Generate new token&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;Token name 可写 &lt;code&gt;my-blog-admin&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;设置有效期，并记录续期日期。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource owner&lt;/strong&gt; 选拥有博客仓库的个人或组织。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository access → Only select repositories&lt;/strong&gt;，只勾选自己的 &lt;code&gt;my-blog&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;Repository permissions&lt;/strong&gt; 设置：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contents：Read and write&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metadata：Read-only&lt;/strong&gt;，通常自动包含。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;创建并复制 Token，暂存到密码管理器中，页面通常只显示一次。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不要将 Token 写入源码、文章、截图或浏览器端配置。Cloudflare 读取仓库的 GitHub App 授权和这里的写作 Token 是两件事，需要分别配置。组织仓库还可能需要管理员审批。&lt;a href=&quot;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens&quot;&gt;GitHub Token 官方说明&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;9.2 生成两个不同的随机值&lt;/h3&gt;
&lt;p&gt;在自己电脑的 PowerShell 运行下面命令两次，每次都会输出不同的值：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node -e &quot;console.log(require(&apos;crypto&apos;).randomBytes(32).toString(&apos;hex&apos;))&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;第一个作为 &lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;：你登录后台时输入的密码。&lt;/li&gt;
&lt;li&gt;第二个作为 &lt;code&gt;ADMIN_SESSION_SECRET&lt;/code&gt;：服务器签名会话的密钥，不在登录框输入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两者分别保存，不使用模板名称或“123456”等简单内容，不把示例变量名本身当作值。&lt;/p&gt;
&lt;h3&gt;9.3 在 Pages 中设置服务端变量&lt;/h3&gt;
&lt;p&gt;进入 &lt;strong&gt;Workers &amp;amp; Pages → 你的 Pages 项目 → Settings → Variables and Secrets → Add&lt;/strong&gt;，选 &lt;strong&gt;Production / 生产环境&lt;/strong&gt;。这是 Cloudflare 官方提供的环境变量位置。&lt;a href=&quot;https://developers.cloudflare.com/pages/functions/bindings/&quot;&gt;Pages Functions 绑定与变量&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称，必须完全一致&lt;/th&gt;
&lt;th&gt;示例 / 填写规则&lt;/th&gt;
&lt;th&gt;保存类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GITHUB_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;上一步创建的 Token&lt;/td&gt;
&lt;td&gt;Secret，保密&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GITHUB_OWNER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;YOUR_GITHUB_NAME&lt;/code&gt;，仓库拥有者的用户名或组织名&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GITHUB_REPO&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;my-blog&lt;/code&gt;，只填仓库短名&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GITHUB_BRANCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt;，与 Pages 生产分支一致&lt;/td&gt;
&lt;td&gt;普通变量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第一个随机值&lt;/td&gt;
&lt;td&gt;Secret，保密&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ADMIN_SESSION_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第二个随机值&lt;/td&gt;
&lt;td&gt;Secret，保密&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ADMIN_EMAIL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选，管理员显示信息&lt;/td&gt;
&lt;td&gt;需要保护邮箱时存 Secret&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;填写值时不要加额外引号、空格或换行。不要给变量名添加 &lt;code&gt;PUBLIC_&lt;/code&gt; 或 &lt;code&gt;VITE_&lt;/code&gt; 前缀。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GITHUB_OWNER&lt;/code&gt; 不是显示昵称或邮箱；&lt;code&gt;GITHUB_REPO&lt;/code&gt; 不是整个 HTTPS 地址。后台写入分支必须是实际部署的分支，否则“保存成功”也不会更新正式站。&lt;/p&gt;
&lt;p&gt;根目录 &lt;code&gt;.env.example&lt;/code&gt; 只列出变量名称。&lt;strong&gt;在本地复制成 .env，不会自动配置 Cloudflare 远程环境，也不会让 &lt;code&gt;pnpm dev&lt;/code&gt; 运行 Pages Functions。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;预览部署不必开放管理权限；如果需要测试后台，应使用测试仓库或测试分支的配置，避免预览页面写入正式内容。&lt;/p&gt;
&lt;h3&gt;9.4 重新部署并登录&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;保存变量。&lt;/li&gt;
&lt;li&gt;按第 7.4 节触发新的生产部署。&lt;/li&gt;
&lt;li&gt;等待成功后打开正式域名的 &lt;code&gt;/admin/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;输入 &lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;检查文章和日记列表能否读取。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果没有启用 Cloudflare Access，本文也可以正常使用。Access 是可选增强功能，不是第一版后台的必经步骤。&lt;/p&gt;
&lt;h3&gt;9.5 做一次完整写作测试&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;后台新建一篇文章。&lt;/li&gt;
&lt;li&gt;填标题、日期、唯一英文文件名、摘要和正文。&lt;/li&gt;
&lt;li&gt;先保存草稿，确认重新进入后能读取。&lt;/li&gt;
&lt;li&gt;点击发布。&lt;/li&gt;
&lt;li&gt;打开自己的 GitHub 仓库，确认新增文件和提交。&lt;/li&gt;
&lt;li&gt;打开 Pages 的 Deployments，等待这条提交对应的部署成功。&lt;/li&gt;
&lt;li&gt;打开前台文章总览和文章详情，确认内容正确。&lt;/li&gt;
&lt;li&gt;下次在电脑上继续编辑前，先 &lt;code&gt;git pull --ff-only&lt;/code&gt; 拉取后台产生的提交。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;**后台能力边界：**文章与日记编辑器提供 Markdown 工具、预览和表情；音乐可上传与改歌单；友链、荣誉墙、留言板配置通过文本编辑。头像、导航和整体样式仍通过源码调整。访客无法通过普通音乐页面修改歌单。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-10&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;10. 发布文章和日记&lt;/h2&gt;
&lt;p&gt;可以用后台操作，也可以本地编辑 Markdown。两种方式都修改同一个 GitHub 仓库，避免同时编辑同一文件。&lt;/p&gt;
&lt;h3&gt;10.1 新建文章&lt;/h3&gt;
&lt;p&gt;主路线使用平铺文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/my-first-post.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前后台列表直接管理这一层的 &lt;code&gt;.md&lt;/code&gt; 文件。前台虽支持文件夹文章，若希望持续在现有后台编辑，优先使用平铺文件，把图片放在 &lt;code&gt;public/images/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;命令创建文章：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;corepack pnpm new-post my-first-post &quot;我的第一篇文章&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以复制 &lt;code&gt;templates/post-template.md&lt;/code&gt;，改名后放入上述目录。&lt;/p&gt;
&lt;p&gt;完整元数据示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;我的第一篇文章&quot;
published: 2026-01-01
# updated: 2026-01-02
description: &quot;这是文章列表中显示的摘要。&quot;
image: &quot;/images/banner.svg&quot;
tags: [&quot;学习&quot;, &quot;生活&quot;]
category: &quot;学习笔记&quot;
draft: false
hidden: false
lang: &quot;zh_CN&quot;
---

## 第一段

这里是正文，可以写 **加粗**、列表、链接和图片。

![图片说明](/images/banner.svg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用时把日期、正文和分类换成自己的内容。没有封面写 &lt;code&gt;image: &quot;&quot;&lt;/code&gt;，没有标签写 &lt;code&gt;tags: []&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一行必须是 &lt;code&gt;---&lt;/code&gt;，元数据结束也用单独一行 &lt;code&gt;---&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;日期按 &lt;code&gt;YYYY-MM-DD&lt;/code&gt; 写，不加引号。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;draft&lt;/code&gt;、&lt;code&gt;hidden&lt;/code&gt; 使用 &lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;，不加引号。&lt;/li&gt;
&lt;li&gt;文件名用小写英文、数字和连字符，确定后尽量不改；它决定 &lt;code&gt;/posts/my-first-post/&lt;/code&gt; 地址。&lt;/li&gt;
&lt;li&gt;一篇文章一个分类；相同的分类文字会自动聚合。&lt;/li&gt;
&lt;li&gt;新建命令默认 &lt;code&gt;draft: true&lt;/code&gt;，准备上线时改为 &lt;code&gt;false&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;中文内容建议 &lt;code&gt;lang: &quot;zh_CN&quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多 Markdown、封面、字段规则见 仓库内的文章与日记写作指南（&lt;code&gt;docs/CONTENT_GUIDE.md&lt;/code&gt;）。&lt;/p&gt;
&lt;h3&gt;10.2 草稿、隐藏与删除的区别&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;状态&lt;/th&gt;
&lt;th&gt;正式网站列表&lt;/th&gt;
&lt;th&gt;正式详情页面&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft: false, hidden: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显示&lt;/td&gt;
&lt;td&gt;可访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不显示&lt;/td&gt;
&lt;td&gt;正式构建不生成该草稿详情&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft: false, hidden: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常规列表不显示&lt;/td&gt;
&lt;td&gt;原链接仍然可访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;删除文件并重新部署&lt;/td&gt;
&lt;td&gt;不显示&lt;/td&gt;
&lt;td&gt;新构建不再提供该页面&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;文章草稿在本地开发模式可能出现，便于预览；日记草稿在本地列表也被过滤。&lt;/p&gt;
&lt;p&gt;隐藏适合暂时不放进列表，&lt;strong&gt;不适合保密&lt;/strong&gt;。隐藏详情仍被构建，不应依赖它阻止被搜索或被转发。公开仓库里的草稿、隐藏内容及历史提交也可能被读取。&lt;/p&gt;
&lt;h3&gt;10.3 新建日记&lt;/h3&gt;
&lt;p&gt;文件位置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/diary/2026-01-01-my-day.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可复制 &lt;code&gt;templates/diary-template.md&lt;/code&gt;，或在后台选择“日记”新建。示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;普通又开心的一天&quot;
date: 2026-01-01
mood: &quot;😊&quot;
moodLabel: &quot;开心&quot;
excerpt: &quot;完成了一个小目标。&quot;
cover: &quot;/images/banner.svg&quot;
tags: [&quot;生活&quot;]
pinned: true
draft: false
hidden: false
---

今天做了什么，记录在这里。
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;date&lt;/code&gt; 决定心情日历上的位置；有对应日记的日期可点击进入详情。&lt;/li&gt;
&lt;li&gt;同一天建议一篇，避免同一天多个详情只有一个日历入口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mood&lt;/code&gt; 写表情，&lt;code&gt;moodLabel&lt;/code&gt; 写心情文字。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pinned: true&lt;/code&gt; 加入置顶区；桌面一次展示三张，超过三张可左右切换。&lt;/li&gt;
&lt;li&gt;不要封面写 &lt;code&gt;cover: &quot;&quot;&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;日记模板默认草稿，需改为 &lt;code&gt;draft: false&lt;/code&gt; 才会显示。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当前后台保存日记会写入 &lt;code&gt;pinned: false&lt;/code&gt;，置顶需要在文件中设置：完成后台编辑后将对应文件的 &lt;code&gt;pinned&lt;/code&gt; 改为 &lt;code&gt;true&lt;/code&gt; 并提交。如果之后再次在后台保存该日记，需要重新核对置顶字段。&lt;/p&gt;
&lt;h3&gt;10.4 本地发布内容&lt;/h3&gt;
&lt;p&gt;保存文件后运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;corepack pnpm check
corepack pnpm build
git status
git add src/content public/images
git commit -m &quot;content: publish a new post&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没有新增图片也不影响该命令。确认 &lt;code&gt;git status&lt;/code&gt; 中的改动符合预期，再提交。&lt;/p&gt;
&lt;h3&gt;10.5 删除示例内容&lt;/h3&gt;
&lt;p&gt;流程打通后，可在后台逐篇删除示例，或在编辑器中删除不需要的 &lt;code&gt;.md&lt;/code&gt; 文件并提交。不要删除 &lt;code&gt;src/content/config.ts&lt;/code&gt;、整个 &lt;code&gt;src/pages/&lt;/code&gt; 或模板解析代码。&lt;/p&gt;
&lt;p&gt;目录暂时没有内容时，可能出现内容集合为空的提示，以最终构建是否成功为准。删除示例图片前，先检查文章、日记、友链是否仍然引用它。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-11&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;11. 配置音乐、友链和荣誉墙&lt;/h2&gt;
&lt;p&gt;这些模块使用“一个文本文件存多条记录”的格式。每条记录用一对单独占行的 &lt;code&gt;---&lt;/code&gt; 包裹；后续记录继续复制完整区块。文章和日记则是一篇一个文件，不要混淆。&lt;/p&gt;
&lt;h3&gt;11.1 本地音乐：推荐先添加一首验证&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;准备你有权公开播放的音频，例如 &lt;code&gt;my-song.mp3&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;放到 &lt;code&gt;public/audio/my-song.mp3&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;打开 &lt;code&gt;src/data/music.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在现有 &lt;code&gt;&amp;lt;!-- ... --&amp;gt;&lt;/code&gt; 注释&lt;strong&gt;后面&lt;/strong&gt;添加：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;---
title: 我的第一首歌
artist: 示例作者
url: /audio/my-song.mp3
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二首示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 我的第二首歌
artist: 示例作者
url: /audio/another-song.mp3
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二条必须有真实对应文件，不要仅复制示例而不上传音频，否则会构建失败。&lt;/p&gt;
&lt;p&gt;当前版本的歌单解析器只接受 &lt;code&gt;/audio/&lt;/code&gt; 开头、实际存在于 &lt;code&gt;public/audio/&lt;/code&gt; 内的路径，&lt;strong&gt;不支持直接填写外部音频 URL&lt;/strong&gt;。路径不要带问号参数、反斜杠或 &lt;code&gt;../&lt;/code&gt;，不写电脑磁盘绝对路径。&lt;/p&gt;
&lt;p&gt;成功标志：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音乐页出现歌曲，列表每页最多 10 首。&lt;/li&gt;
&lt;li&gt;点播放后有声音，可调进度与音量。&lt;/li&gt;
&lt;li&gt;默认列表循环，可选单曲循环和随机播放。&lt;/li&gt;
&lt;li&gt;从主页进入其他站内页面时，已开始的播放可持续。&lt;/li&gt;
&lt;li&gt;浏览器通常要求用户主动点击；刷新、关闭、外链打开新站不属于站内持续播放。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;11.2 用后台上传音乐&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登录后台，进入音乐模块。&lt;/li&gt;
&lt;li&gt;选择本地音频上传，等上传完成。&lt;/li&gt;
&lt;li&gt;按返回路径编辑歌单，确认歌名、歌手与 &lt;code&gt;url&lt;/code&gt; 对应。&lt;/li&gt;
&lt;li&gt;保存歌单配置。&lt;/li&gt;
&lt;li&gt;等待最后一次提交对应的 Pages 部署成功，再测试。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;后台接受 mp3、m4a、ogg、wav、flac、aac，但浏览器解码支持可能不同，新手优先 MP3。后台代码上限为 30 MiB，Cloudflare Pages 单个静态资源上限为 &lt;strong&gt;25 MiB&lt;/strong&gt;；实际应遵守更小的平台限制，建议单曲压缩到 &lt;strong&gt;20 MiB 以下&lt;/strong&gt;，超时则继续缩小文件。&lt;a href=&quot;https://developers.cloudflare.com/pages/platform/limits/&quot;&gt;Pages 限制&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上传音频与保存歌单可能分别产生提交，第一次构建先于歌单更新属于正常情况，以最后一次部署为准。音频会占用仓库空间，不适合把大量无损音乐打包进去。&lt;/p&gt;
&lt;h3&gt;11.3 添加友链&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;src/data/friends.md&lt;/code&gt;，或使用后台友链模块：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
name: 朋友的网站
url: https://example.org
avatar: /images/friend-avatar.webp
description: 记录生活与技术的小站。
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;：卡片显示的网站名。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt;：点击卡片跳转的网址，带 &lt;code&gt;https://&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avatar&lt;/code&gt;：图片地址，不能填“某网站主页”。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt;：简短介绍。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本地头像应放到 &lt;code&gt;public/images/friend-avatar.webp&lt;/code&gt;；也可填外部 HTTPS 图片，但对方可能限制防盗链。有权使用时保存到自己站内更稳定。桌面布局一行三张，小屏幕会自动调整。&lt;/p&gt;
&lt;h3&gt;11.4 添加荣誉墙&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;src/data/honors.md&lt;/code&gt;，或使用后台荣誉模块：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
date: 2026-06
name: 示例设计比赛
award: 二等奖
issuer: 示例组织
category: 比赛
description: 一句简短补充说明。
---
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;date&lt;/code&gt;：显示时间，推荐 &lt;code&gt;YYYY-MM&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;：比赛、活动或证书名称。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;award&lt;/code&gt;：奖项或等级，和名称分开填写。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;issuer&lt;/code&gt;、&lt;code&gt;category&lt;/code&gt;、&lt;code&gt;description&lt;/code&gt;：可选补充信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;荣誉展示在关于页面，一页最多 5 条，超过后翻页。信息尽量简短，保持类似简历的行式排版。纯文本模块按自己的解析规则读取，不要随意更改字段名或插入多行复杂 YAML 结构。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-12&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;12. 部署并接入留言板&lt;/h2&gt;
&lt;p&gt;本节可最后完成。不需要留言时保持 &lt;code&gt;envId: &quot;&quot;&lt;/code&gt;，不影响其他功能。&lt;/p&gt;
&lt;p&gt;当前模板集成 &lt;strong&gt;Twikoo&lt;/strong&gt;，本地客户端文件为 &lt;code&gt;public/vendor/twikoo-2.0.17.min.js&lt;/code&gt;。不要照 Waline、Giscus 或其他评论系统的变量表配置。&lt;/p&gt;
&lt;h3&gt;12.1 本文路线：Cloudflare Pages 同域 + D1&lt;/h3&gt;
&lt;p&gt;主路线：&lt;strong&gt;把 Twikoo 后端编译进博客自己的 Cloudflare Pages Function，数据存 Cloudflare D1&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组成&lt;/th&gt;
&lt;th&gt;位置&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;博客静态页面&lt;/td&gt;
&lt;td&gt;Cloudflare Pages&lt;/td&gt;
&lt;td&gt;Astro 构建产物&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;博客后台 API&lt;/td&gt;
&lt;td&gt;&lt;code&gt;functions/api/admin/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pages Function，已自带&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言板后端&lt;/td&gt;
&lt;td&gt;&lt;code&gt;functions/api/twikoo/[[path]].ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Twikoo 适配器，与博客同域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言数据&lt;/td&gt;
&lt;td&gt;Cloudflare D1（绑定名 &lt;code&gt;DB&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;建表脚本 &lt;code&gt;functions/vendor/twikoo/schema.sql&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这套方案的特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不依赖第三方平台&lt;/strong&gt;，不用注册 MongoDB Atlas、Netlify、Hugging Face 等外部服务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不需要额外的子域名&lt;/strong&gt;。留言接口是 &lt;code&gt;https://你的博客域名/api/twikoo&lt;/code&gt;，与博客同域，不存在 &lt;code&gt;*.workers.dev&lt;/code&gt; 在国内被 DNS 污染而超时的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全部在免费额度内&lt;/strong&gt;：Pages 免费版每月 500 次构建，静态资源流量不限；Workers Free 每天 10 万次请求，留言量远达不到。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;博客与留言共用一个 Cloudflare 账号&lt;/strong&gt;，不用在多个平台之间来回配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Twikoo 服务与写作后台独立，管理员密码也独立。访客通过评论表单留言，不要求持有 GitHub 账户。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;已包含在本仓库里&lt;/strong&gt;：Twikoo 的 Cloudflare 适配器已经构建好并放进 &lt;code&gt;functions/vendor/twikoo/&lt;/code&gt;，你不需要自己下载源码或执行构建命令。本节只涉及创建数据库和填数据库 ID。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;12.2 准备 Cloudflare 登录&lt;/h3&gt;
&lt;p&gt;部署需要 Cloudflare 账号和账号 ID。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;注册并登录 &lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 wrangler（如果还没有）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g wrangler@4
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;登录（会打开浏览器让你授权）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler login
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认登录状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler whoami
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出里能看到账号 ID 就说明成功。记下这个 Account ID，后面要在 Cloudflare 面板创建 D1 数据库。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;12.3 创建 D1 数据库并初始化表结构&lt;/h3&gt;
&lt;p&gt;D1 是 Cloudflare 的免费无服务器数据库，专门存这种小数据。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建数据库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler d1 create twikoo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;命令会输出类似这样的结果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;🌀 Creating Cloudflare D1 database with name &quot;twikoo&quot;...
✅ Success, your database was created!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;database_id&lt;/code&gt; 是一串 UUID，&lt;strong&gt;记下来&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把 &lt;code&gt;database_id&lt;/code&gt; 填进项目根目录的 &lt;strong&gt;&lt;code&gt;wrangler.toml&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[d1_databases]]
binding = &quot;DB&quot;
database_name = &quot;twikoo&quot;
database_id = &quot;把这里换成上一步的 UUID&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初始化表结构（可以跳过，因为适配器首次请求时会自动建表，但手动执行更保险）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler d1 execute twikoo --remote --file=./functions/vendor/twikoo/schema.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证表已建好：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler d1 execute twikoo --remote --command &quot;SELECT name FROM sqlite_master WHERE type=&apos;table&apos;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应该能看到 &lt;code&gt;comment&lt;/code&gt; 和 &lt;code&gt;cap_kv&lt;/code&gt; 两张表。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关于 &lt;code&gt;wrangler.toml&lt;/code&gt;&lt;/strong&gt;：这个文件里带 &lt;code&gt;pages_build_output_dir&lt;/code&gt; 字段后，它就是 Pages 项目的配置唯一来源，&lt;code&gt;[[d1_databases]]&lt;/code&gt; 会随部署一起应用到生产与预览环境。仪表盘上再改同名绑定会被覆盖，改配置请改这个文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;12.4 接入博客&lt;/h3&gt;
&lt;p&gt;打开 &lt;strong&gt;&lt;code&gt;src/data/guestbook.md&lt;/code&gt;&lt;/strong&gt;，修改现有区块：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 留言板
description: 留下你的想法，和站长打个招呼吧。
envId: &quot;/api/twikoo&quot;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;envId&lt;/code&gt; 写站内相对路径 &lt;code&gt;/api/twikoo&lt;/code&gt; 即可，页面脚本会按当前域名自动补全，&lt;strong&gt;换域名时不用改这里&lt;/strong&gt;。也可以写完整地址，例如 &lt;code&gt;https://fengzhan.pages.dev/api/twikoo&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里的 &lt;code&gt;envId&lt;/code&gt; 就是留言接口地址，配置组件实际读取这个文件，&lt;strong&gt;只修改 &lt;code&gt;src/config.ts&lt;/code&gt; 的同名配置不会完成接入&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;可以在博客后台的留言板模块编辑同一个区块。保存后等待 Pages 重新部署；本地修改则提交：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add src/data/guestbook.md
git commit -m &quot;feat: connect Twikoo guestbook&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;12.5 设置留言管理员并验证&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开正式站 &lt;code&gt;/guestbook/?admin=1&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;使用评论区域的小齿轮管理入口，按 Twikoo 提示设置自己的管理员密码。&lt;/li&gt;
&lt;li&gt;此密码独立于博客后台的 &lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;，也不是数据库密码。&lt;/li&gt;
&lt;li&gt;使用普通访客窗口发布一条测试留言。&lt;/li&gt;
&lt;li&gt;使用管理员窗口检查审核、删除或垃圾留言处理是否正常。&lt;/li&gt;
&lt;li&gt;切换到其他页面再返回留言板，确认样式和留言列表仍正常。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;非腾讯云部署的管理员初始化方式由 Twikoo 前端文档说明。&lt;a href=&quot;https://twikoo.js.org/frontend.html&quot;&gt;Twikoo 前端与管理入口&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;博客后台的&quot;留言板&quot;模块负责服务地址与页面文案，并提供&quot;管理现有留言&quot;的入口。&lt;strong&gt;现有留言的审核与删除在 Twikoo 管理面板完成&lt;/strong&gt;，不会作为文章文件保存在 GitHub。&lt;/p&gt;
&lt;p&gt;分页、每页数量、匿名/邮箱要求等，使用当前 Twikoo 管理面板实际提供的设置，不需要改博客文章分页。不要向访客公开管理员密码或数据库 ID。&lt;/p&gt;
&lt;h3&gt;12.6 留言故障先按这个顺序查&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;浏览器直接访问 &lt;code&gt;https://你的博客域名/api/twikoo&lt;/code&gt;，应返回 &lt;code&gt;{&quot;code&quot;:100,&quot;message&quot;:&quot;Twikoo 云函数运行正常...&quot;}&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果返回 404，检查 Pages 部署是否包含 &lt;code&gt;functions/api/twikoo/&lt;/code&gt; 与 &lt;code&gt;functions/vendor/twikoo/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果报&quot;未绑定 D1 数据库&quot;，检查 &lt;code&gt;wrangler.toml&lt;/code&gt; 里的 &lt;code&gt;database_id&lt;/code&gt; 是否填对，并重新部署。&lt;/li&gt;
&lt;li&gt;检查 D1 里是否已有表：&lt;code&gt;wrangler d1 execute twikoo --remote --command &quot;SELECT count(*) FROM comment&quot;&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;检查博客 &lt;code&gt;envId&lt;/code&gt; 是否填写（不能是空字符串）。&lt;/li&gt;
&lt;li&gt;检查 Pages 是否已部署含最新 &lt;code&gt;guestbook.md&lt;/code&gt; 的提交。&lt;/li&gt;
&lt;li&gt;浏览器 F12 → Network 查看接口是否被跨域策略拒绝。&lt;/li&gt;
&lt;li&gt;用其他网络测试，区分配置问题与网络访问问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;只刷新博客不能修复数据库绑定或留言服务部署错误。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;本地调试提示&lt;/strong&gt;：&lt;code&gt;pnpm preview&lt;/code&gt; 不运行 Pages Functions，本地访问 &lt;code&gt;/api/twikoo&lt;/code&gt; 一定是 404，这是正常的。需要联调时用 &lt;code&gt;wrangler pages dev dist --d1 DB=twikoo&lt;/code&gt;，它会在本地启动包含 Functions 的完整环境。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;13. 日常维护、备份与版本更新&lt;/h2&gt;
&lt;h3&gt;13.1 每次本地编辑前先同步&lt;/h3&gt;
&lt;p&gt;后台写作会自动向 GitHub 提交。电脑上的本地目录不会自动跟着更新。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd D:\Projects\my-blog
git status
git pull --ff-only
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认工作区干净再 pull；拉取成功后开始编辑。若有未提交的更改，先保存并整理为自己的提交，或明确暂存这些改动；不确定时先复制相关改动文件作为备份。&lt;/p&gt;
&lt;p&gt;如果提示 &lt;code&gt;Not possible to fast-forward&lt;/code&gt;，说明本地和远程都产生了新提交，需要合并或 rebase 并解决冲突，不要用 &lt;code&gt;push --force&lt;/code&gt; 覆盖后台写的新文章。&lt;/p&gt;
&lt;h3&gt;13.2 常用命令&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;th&gt;项目根目录中运行&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;安装锁定依赖&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corepack pnpm install --frozen-lockfile&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开发预览&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corepack pnpm dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型检查&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corepack pnpm check&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;正式构建与搜索索引&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corepack pnpm build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;预览上一次构建&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corepack pnpm preview&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;停止预览&lt;/td&gt;
&lt;td&gt;在对应终端按 Ctrl+C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;查看改动&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git status&lt;/code&gt;、&lt;code&gt;git diff&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;同步后台提交&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git pull --ff-only&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推送已提交的改动&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;13.3 需要备份什么&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;**博客内容与代码：**GitHub 仓库，并定期保存自己的离线副本。&lt;/li&gt;
&lt;li&gt;**留言：**独立备份 Twikoo / D1 数据（&lt;code&gt;wrangler d1 export&lt;/code&gt;），备份仓库不会包含留言。&lt;/li&gt;
&lt;li&gt;**密钥：**使用密码管理器保存 Cloudflare、Token 有效期、后台密码、签名密钥和数据库凭据。&lt;/li&gt;
&lt;li&gt;**域名：**记录注册商、到期时间与 DNS 配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私有仓库不能代替密钥管理。不要为了备份把服务器变量写回公开仓库。&lt;/p&gt;
&lt;h3&gt;13.4 修改密码或 Token&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;后台密码修改：更新 Pages 的 &lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;，创建新部署。&lt;/li&gt;
&lt;li&gt;需要让既有会话失效：同时轮换 &lt;code&gt;ADMIN_SESSION_SECRET&lt;/code&gt; 并重新部署。&lt;/li&gt;
&lt;li&gt;Token 到期：创建同范围的新 Token，更新 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; 并重新部署，确认读写后撤销旧 Token。&lt;/li&gt;
&lt;li&gt;留言数据清理：&lt;code&gt;wrangler d1 execute twikoo --remote --command &quot;DELETE FROM comment&quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.5 模板更新与回滚&lt;/h3&gt;
&lt;p&gt;新模板版本发布后，先查看差异并备份自己的修改，逐项合并。不要把自己的整个 &lt;code&gt;src/config.ts&lt;/code&gt;、&lt;code&gt;src/data/&lt;/code&gt;、&lt;code&gt;src/content/&lt;/code&gt; 覆盖成新版示例。&lt;/p&gt;
&lt;p&gt;网站出问题时，可先在 Cloudflare 部署历史中恢复一个成功版本；长期修复仍应在 GitHub 更正代码或通过 revert 创建撤销提交，使下一次部署与源码一致。回滚部署不会自动撤销仓库里已经保存的内容。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-14&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;14. 常见错误排查&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;现象&lt;/th&gt;
&lt;th&gt;重点检查与处理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;命令提示找不到 package.json&lt;/td&gt;
&lt;td&gt;执行 &lt;code&gt;Get-Location&lt;/code&gt;、&lt;code&gt;Test-Path .\package.json&lt;/code&gt;，切到真正项目根目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;提示只允许使用 pnpm&lt;/td&gt;
&lt;td&gt;用 pnpm 9.14.4，不使用 npm / Yarn 安装本项目依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;冻结锁文件安装失败&lt;/td&gt;
&lt;td&gt;确认 pnpm 版本和仓库锁文件；不要先删除锁文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pnpm.ps1 不能执行&lt;/td&gt;
&lt;td&gt;使用对应的 &lt;code&gt;pnpm.cmd&lt;/code&gt;，或 Corepack 的可用命令入口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4321 和 4322 页面不同&lt;/td&gt;
&lt;td&gt;两个旧预览服务可能同时运行；在各自终端 Ctrl+C 停止，只重开需要的一个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;源码改了，preview 不变&lt;/td&gt;
&lt;td&gt;先重新 &lt;code&gt;pnpm build&lt;/code&gt; 再预览&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开发模式搜索不工作&lt;/td&gt;
&lt;td&gt;正常；使用 build + preview 或正式站，确认云端命令是 &lt;code&gt;pnpm build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;页面更新后样式像旧版本&lt;/td&gt;
&lt;td&gt;核对部署提交号，完成后 Ctrl+F5；仍有问题再检查控制台和资源请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地正常，线上图片失败&lt;/td&gt;
&lt;td&gt;检查文件是否提交、大小写、扩展名；路径不含 &lt;code&gt;public/&lt;/code&gt; 前缀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新文章未出现&lt;/td&gt;
&lt;td&gt;检查 &lt;code&gt;draft&lt;/code&gt;、&lt;code&gt;hidden&lt;/code&gt;、目录、日期和部署状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日记日历没有新心情&lt;/td&gt;
&lt;td&gt;日记必须已发布、未隐藏，检查 &lt;code&gt;date&lt;/code&gt; 与当前查看月份&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;歌单为空&lt;/td&gt;
&lt;td&gt;音频文件本身不会自动变成歌曲；须在 music.md 的注释外写记录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;歌曲路径导致构建失败&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/audio/文件名&lt;/code&gt; 必须对应真实文件，不接受外部链接或磁盘路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大音频部署失败&lt;/td&gt;
&lt;td&gt;遵守 Pages 单文件上限，先用较小 MP3 测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地后台登录失败&lt;/td&gt;
&lt;td&gt;dev / preview 不运行 Pages Functions，使用云端完整部署&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台接口返回 404 或 HTML&lt;/td&gt;
&lt;td&gt;检查是否创建了正确 Pages 项目、仓库有 functions、是否仅上传静态产物&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台登录提示尚未配置 / 503&lt;/td&gt;
&lt;td&gt;检查生产环境 ADMIN_PASSWORD 与 ADMIN_SESSION_SECRET，并部署新版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台登录 401&lt;/td&gt;
&lt;td&gt;密码错误或会话失效，核对 Secret 并重新登录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台登录 429&lt;/td&gt;
&lt;td&gt;登录尝试过多，等待限流窗口结束再检查密码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;登录成功但列表读不了 / GitHub 401、403、404&lt;/td&gt;
&lt;td&gt;检查 Token 到期、Resource owner、目标仓库权限、仓库名和分支；私有仓库授权错误也可能返回 404&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;保存发生冲突 / 409&lt;/td&gt;
&lt;td&gt;重新读取最新内容后再编辑，避免多个标签页同时覆盖同一文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台保存成功，前台没变&lt;/td&gt;
&lt;td&gt;查看 GitHub 提交是否存在，确认写入生产分支并等待对应 Pages 部署&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;仓库里有文章但后台列表没看到&lt;/td&gt;
&lt;td&gt;当前后台直接管理 posts / diary 下平铺的 .md 文件；避免放入子文件夹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;友链头像不显示&lt;/td&gt;
&lt;td&gt;avatar 应是图片而非网页；外部图片可能防盗链&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;荣誉数量不对&lt;/td&gt;
&lt;td&gt;检查每条记录的分隔线、name 与 award；超过 5 条应出现分页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言管理和后台密码不通用&lt;/td&gt;
&lt;td&gt;两套系统密码独立，Twikoo 使用自己的管理面板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言板显示「尚未配置」&lt;/td&gt;
&lt;td&gt;检查 src/data/guestbook.md 的 envId 是否为 /api/twikoo 或完整地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言提交失败 404&lt;/td&gt;
&lt;td&gt;确认已部署含 functions/api/twikoo/ 的版本，且 Pages 项目启用了 Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言提交失败 500&lt;/td&gt;
&lt;td&gt;检查 wrangler.toml 的 database_id 是否为真实 D1 UUID，D1 绑定名是否为 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言表不存在&lt;/td&gt;
&lt;td&gt;执行 wrangler d1 execute twikoo --remote --file=./functions/vendor/twikoo/schema.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;留言能发但管理面板提示版本过旧&lt;/td&gt;
&lt;td&gt;适配器需为 2.0.17，检查 functions/vendor/twikoo/ 是否为重新构建的产物&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;访客数在不同电脑不一样&lt;/td&gt;
&lt;td&gt;访问数据来自 Cloudflare Web Analytics 服务端接口，各人看到的是同一份数据；本地预览无 Pages Functions 时显示「未接入访问统计」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;统计一直显示「未接入访问统计」&lt;/td&gt;
&lt;td&gt;检查 &lt;code&gt;PUBLIC_CF_BEACON_TOKEN&lt;/code&gt; 与 &lt;code&gt;CF_ACCOUNT_ID&lt;/code&gt; / &lt;code&gt;CF_API_TOKEN&lt;/code&gt; / &lt;code&gt;CF_SITE_TAG&lt;/code&gt; 四个变量是否都已配置并重新部署&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;统计接口返回 502&lt;/td&gt;
&lt;td&gt;常见原因是 API Token 权限不足（需 Account → Account Analytics → Read）或账号不在美国元数据边界&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git push 被拒绝&lt;/td&gt;
&lt;td&gt;先检查本地改动与远程提交，处理同步或冲突，不要 force push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare 看不到自己的仓库&lt;/td&gt;
&lt;td&gt;检查 GitHub App 授权的账户和仓库范围；组织仓库可能还需批准&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;若怀疑后台接口问题，在正式站按 F12 → Network，点击登录或保存，检查 &lt;code&gt;/api/admin/...&lt;/code&gt; 的 HTTP 状态及响应。分享截图前遮住 Cookie、Token、密码、数据库连接串和私人内容。&lt;/p&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-15&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;15. 上线验收清单&lt;/h2&gt;
&lt;h3&gt;前台&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 标题、昵称、头像、关于页不再保留占位内容。&lt;/li&gt;
&lt;li&gt;[ ] 导航、文章详情、返回按钮和友链可正常跳转。&lt;/li&gt;
&lt;li&gt;[ ] 非主页没有错误显示首页大头像或左侧首页组件。&lt;/li&gt;
&lt;li&gt;[ ] 桌面和手机布局正常，没有横向溢出。&lt;/li&gt;
&lt;li&gt;[ ] 深浅主题、主题颜色与动态背景正常。&lt;/li&gt;
&lt;li&gt;[ ] 农历日历能切换月份；切换页面返回后时间继续更新。&lt;/li&gt;
&lt;li&gt;[ ] 日记日期能进入对应详情，多张置顶卡片能切换。&lt;/li&gt;
&lt;li&gt;[ ] 搜索能找到已发布文章。&lt;/li&gt;
&lt;li&gt;[ ] 环境变量 &lt;code&gt;SITE_URL&lt;/code&gt; 已填正式地址，生成的链接不再指向本地地址。&lt;/li&gt;
&lt;li&gt;[ ] 示例内容已按需要保留或删除。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;后台&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 未登录无法读写管理接口。&lt;/li&gt;
&lt;li&gt;[ ] 使用自己的密码可以登录并读到自己的文章。&lt;/li&gt;
&lt;li&gt;[ ] 新建、保存草稿、发布、隐藏与删除符合预期。&lt;/li&gt;
&lt;li&gt;[ ] 发布后 GitHub 有提交，Pages 自动构建，前台最终更新。&lt;/li&gt;
&lt;li&gt;[ ] 音乐、友链、荣誉墙配置可保存。&lt;/li&gt;
&lt;li&gt;[ ] Token 只授权自己的博客仓库，已记录过期时间。&lt;/li&gt;
&lt;li&gt;[ ] 未将任何真实凭据提交到 GitHub。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;可选服务&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 音乐可播放、切歌、拖动进度、调音量，站内切页持续播放。&lt;/li&gt;
&lt;li&gt;[ ] 访客可以提交测试留言，接口为同域 /api/twikoo。&lt;/li&gt;
&lt;li&gt;[ ] Twikoo 管理员可以处理留言，普通访客没有管理权限。&lt;/li&gt;
&lt;li&gt;[ ] 留言板切页返回后仍正常，D1 数据已用 wrangler d1 export 独立备份。&lt;/li&gt;
&lt;li&gt;[ ] 自定义域名与 HTTPS 正常，手机流量也能测试。&lt;/li&gt;
&lt;li&gt;[ ] 统计只展示 Cloudflare Web Analytics 的真实数据；未接入时显示「未接入访问统计」，不用本地假数据凑数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;a id=&quot;step-16&quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;16. 配置速查与官方资料&lt;/h2&gt;
&lt;h3&gt;16.1 文件入口&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;项目根目录/
├── astro.config.mjs          正式站点地址
├── src/
│   ├── config.ts             标题、头像、导航、主题与公开链接
│   ├── content/
│   │   ├── posts/*.md        一篇文章一个文件
│   │   └── diary/*.md        一篇日记一个文件
│   ├── data/
│   │   ├── music.md          本地音乐歌单
│   │   ├── friends.md        友链
│   │   ├── honors.md         荣誉墙
│   │   ├── guestbook.md      留言板服务地址
│   │   └── quotes.ts         语录
│   └── pages/
│       ├── about.astro       个人介绍
│       └── admin/index.astro 后台页面
├── public/
│   ├── images/               头像与图片
│   └── audio/                音频
├── functions/
│   ├── api/admin/            Cloudflare 后台接口
│   ├── api/twikoo/           留言板后端（Twikoo）
│   └── vendor/twikoo/        Twikoo 适配器与建表脚本
├── templates/                可复制的文章与日记模板
├── wrangler.toml             Cloudflare Pages 配置（含 D1 绑定）
├── .env.example              变量名示例，不含真实密码
└── pnpm-lock.yaml            应提交的依赖锁文件
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;16.2 继续阅读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;功能与使用手册：仓库中的 &lt;code&gt;docs/USAGE.zh-CN.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文章与日记完整格式：仓库中的 &lt;code&gt;docs/CONTENT_GUIDE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;后台配置速查：仓库中的 &lt;code&gt;docs/admin-deployment.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;模板清理与验证记录：仓库中的 &lt;code&gt;docs/TEMPLATE_REVIEW.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;源码许可证：仓库根目录的 &lt;code&gt;LICENSE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;16.3 官方资料&lt;/h3&gt;
&lt;p&gt;这些链接供遇到界面或平台政策变化时核对，不需要全部通读再开始：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/get-started/git-integration/&quot;&gt;Cloudflare Pages：Git 集成创建项目&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/framework-guides/deploy-an-astro-site/&quot;&gt;Cloudflare Pages：Astro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-image/&quot;&gt;Cloudflare Pages：构建镜像与版本设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/functions/bindings/&quot;&gt;Cloudflare Pages：Functions 环境变量与 Secrets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/custom-domains/&quot;&gt;Cloudflare Pages：自定义域名&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/platform/limits/&quot;&gt;Cloudflare Pages：平台限制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/web-analytics/&quot;&gt;Cloudflare：Web Analytics 概览&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/&quot;&gt;Cloudflare：Web Analytics GraphQL API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template&quot;&gt;GitHub：创建模板仓库的项目&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens&quot;&gt;GitHub：管理 Personal access tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twikoo.js.org/backend.html&quot;&gt;Twikoo：部署方式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twikoo.js.org/frontend.html&quot;&gt;Twikoo：前端与管理员入口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/functions/wrangler-configuration/&quot;&gt;Cloudflare Pages：Wrangler 配置与绑定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;Cloudflare：D1 数据库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>