从零搭建 Hexo + Fluid + GitHub Pages:把隐私检查放进发布链
个人技术站不只是把 Markdown 变成 HTML。更可靠的发布链应该同时管理源码、生成物、站内链接和公开边界,让敏感内容在推送之前就被阻止。
最小架构
Hexo 把 source/ 中的 Markdown 和静态资源渲染到 public/:
1 | source Markdown |
GitHub Pages 支持两类发布方式:
- 从指定分支的根目录或
docs/目录发布; - 使用 GitHub Actions 构建并部署 artifact。
对于非 Jekyll 的静态站点,GitHub 和 Hexo 官方文档都提供了 Actions 方案。它能让仓库只保存源内容,由 CI 生成 public/,通常更容易维护。分支根目录方案也可用,但必须明确管理生成物同步。
初始化 Hexo
准备 Node.js 和 Git 后:
1 | npm install -g hexo-cli |
安装 Fluid:
1 | npm install --save hexo-theme-fluid |
在 _config.yml 中启用:
1 | title: My Notes |
再创建 _config.fluid.yml 保存主题覆盖配置。把自定义配置放在站点仓库,而不是直接修改 node_modules 中的主题源码,这样升级和审查都更清晰。
建立内容结构
建议至少区分:
1 | source/ |
文章使用 YAML front matter:
1 |
|
本地构建不是最终检查
最基础的命令是:
1 | hexo clean |
但“生成成功”只说明模板没有立即报错。发布前还应该检查:
- 首页、404、文章和独立页面是否存在;
- HTML 中的站内
href、src是否有目标; - 默认主题示例是否残留;
- sitemap、feed 和搜索索引是否包含新内容;
- 删除页面是否仍残留在生成目录;
- CSS 是否可以正常解析。
把检查写进 package.json:
1 | { |
把隐私规则变成构建门
只靠发布前“记得检查”并不可靠。可以维护一组禁止标记:
1 | const forbiddenMarkers = [ |
扫描范围不仅包括 Markdown,还应包括最终 HTML、搜索索引、feed 和 sitemap。原因是:
- 已删除源文件可能仍残留在旧生成目录;
- 页面摘要可能进入 meta description;
- 搜索索引可能保存正文副本;
- 导航和站点地图可能继续暴露旧地址。
手机号可以使用格式规则检测:
1 | const phonePattern = /\b1[3-9]\d{9}\b/g; |
格式扫描只是最后一道保险,不能代替内容审查。邮箱、芯片型号等字段是否公开,需要按个人边界单独决定。
两种部署方式
方案 A:GitHub Actions
把 public/ 加入 .gitignore,CI 中执行安装、构建、检查和部署:
1 | checkout |
在仓库 Settings → Pages 中选择 GitHub Actions。Node.js 主版本应与本地验证环境一致。
方案 B:分支目录发布
如果从 main / (root) 发布,根目录必须包含最终 index.html。此时需要受控同步脚本:
1 | clean |
不要简单覆盖现有文件,否则已经删除的文章目录可能继续在线。
发布后的闭环
推送后继续检查:
- Pages 构建对应的是当前提交;
- 状态为成功;
- 首页和核心页面返回 200;
- 已删除页面返回 404;
- 线上 HTML 不含禁止标记;
- 本地与远端提交一致。
只有本地构建和线上结果都通过,发布才算完成。
公开边界建议
私人知识库可以作为选题和证据索引,但不应自动全量同步。公开文章应重新组织背景、删除身份和内部信息,并明确区分事实、推断与适用范围。
参考资料: