请稍侯

公共站与成员站双发布方案

27 March 2026

这是一篇成员文章,用于记录当前博客的双发布方案:

  • 公开站继续发布到 luowei.github.io
  • 私有文章存放在 _posts_private/
  • 私有站构建时会临时将 _posts_private/ 并入站点
  • 成员站部署到 Cloudflare Pages
  • 成员站入口由 Cloudflare Access 按邮箱或身份组控制访问

内容组织约定

公开文章放在:

_posts/

私有文章放在:

_posts_private/

如果历史文章仍在 _posts/ 中但需要临时保密,也可以显式写:

visibility: private

发布链路

flowchart LR
  A[私有源码仓] --> B[Public Build]
  A --> C[Members Build]
  B --> D[GitHub Pages Public Repo]
  C --> E[Cloudflare Pages Members Project]
  E --> F[Cloudflare Access]

Cloudflare Access 建议

对成员站建议至少配置:

  • 仅允许指定邮箱访问
  • 对搜索引擎返回拒绝访问
  • 使用独立 hostname,例如 members.example.com
  • 将成员站 robots 设为 noindex,nofollow

Cloudflare Pages / Access 实际配置过程

当前站点已经按下面的流程跑通了成员站部署:

  1. 在 Cloudflare Workers & Pages 中新建了一个真正的 Pages 项目,而不是 Worker
  2. Pages 项目名保持为 luowei
  3. 给该 Pages 项目绑定了自定义域名:
    • https://luowei.markdev.work
  4. 在 GitHub 私有源码仓 luowei/luowei_github_io_src 的 Actions 配置中填写:
    • secrets.CLOUDFLARE_API_TOKEN
    • secrets.CLOUDFLARE_ACCOUNT_ID
    • vars.MEMBERS_PAGES_PROJECT=luowei
    • vars.MEMBERS_SITE_URL=https://luowei.markdev.work
  5. Deploy Members Site workflow 通过:
    • SITE_VISIBILITY_MODE=members
    • BUILD_DEST=_site_private 构建私有站产物,再执行:
    • wrangler pages deploy _site_private --project-name=luowei --branch=master
  6. Cloudflare Access 再挂在 luowei.markdev.work 这个私有站入口前面,按指定邮箱或 GitHub 登录进行访问控制

Access 配置注意点

  • 如果使用 GitHub Login,OAuth App 的 callback URL 必须指向:
    • https://<team-name>.cloudflareaccess.com/cdn-cgi/access/callback
  • 如果使用 One-time PIN,只有命中 Allow -> Emails 白名单的邮箱才会真正收到邮件
  • Emails ending in 只适合填域名后缀,例如 @gmail.com,不应填写完整邮箱或拼错的域名
  • wrangler pages deploy 返回认证错误,要先区分当前对象到底是 Pages 还是 Worker
  • 可以用下面的接口确认项目是否真的是 Pages 项目:
curl -s "https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/pages/projects/<PROJECT_NAME>" \
  -H "Authorization: Bearer <CLOUDFLARE_API_TOKEN>"

返回 success: true 才说明它是可被 wrangler pages deploy 直接部署的 Pages 项目

回滚方式

如果成员站方案暂时不继续推进,可以:

  1. 暂停 Deploy Members Site workflow
  2. 保留 _posts_private/
  3. 继续使用公开站构建链,不影响现有公共发布