literary-lab

部署与发布

站点是构建产物,不是手写页面:node site/build.mjs 把仓库 markdown 编译到 site/dist/,再由 Cloudflare Workers 静态资产托管。site/dist/ 已进 .gitignore,永远由 CI 或本地重新生成。

0. 现状

项值
构建命令node site/build.mjs(零 npm 依赖)
产物site/dist/,当前 75 页 + 样式 / favicon / 404 / robots / _headers
Worker 名literary-lab
账号83b40c9065a6f4631f4ab6cda824a21a(Cloudflare 账号 ID)
托管方式Workers 静态资产(assets-only),html_handling=auto-trailing-slash,not_found_handling=404-page
线上地址<https://lab.talkincode.net>(自定义域;workers_dev: false,无 workers.dev 入口)
自动流水线.github/workflows/deploy.yml(push main → 门禁 → 构建 → deploy;缺 secret 时跳过)

1. 首次上线(本地,一次性)

make site                 # 构建 + 站内死链自检
npx wrangler dev          # 可选:本地预览 http://localhost:8787
npx wrangler deploy       # 部署;workers_dev 已关闭,只输出自定义域

部署会打印最终地址(当前只有 lab.talkincode.net 一个入口);如无自定义域,把 workers_dev 改回 true 才会出现 workers.dev 地址。

2. 让 push 自动发布

需要两个仓库 secret。只在这里设置一次,不要写进代码、不要贴进聊天记录。

  1. Cloudflare Dashboard → My Profile → API Tokens → Create Token
      1. 模板选 Edit Cloudflare Workers,或自定义权限:Account → Workers Scripts:Edit
        1. 账号限定为当前账号,区域留空(不需要 Zone 权限,除非之后绑自定义域)
      2. 写进 GitHub secrets:
      gh secret set CLOUDFLARE_API_TOKEN  --repo talkincode/literary-lab
      gh secret set CLOUDFLARE_ACCOUNT_ID --repo talkincode/literary-lab --body 83b40c9065a6f4631f4ab6cda824a21a
      1. 验证:随便推一个 commit,看 Actions 里 deploy 工作流的最后一步是否变为「部署到 Cloudflare Workers」。

      没有 secret 时不会红:部署步骤自动跳过并留一条 warning,内容门禁与构建照常跑——所以本地开发、PR 校验不受影响。

      3. 回滚与下线

      npx wrangler deployments list          # 看历史版本
      npx wrangler rollback                  # 回滚到上一版
      npx wrangler delete --name literary-lab  # 彻底下线

      4. 可选:绑定自定义域名

      talkincode.net 已在同一账号下。若要把站点放到 lab.talkincode.net:

      // wrangler.jsonc
      "routes": [{ "pattern": "lab.talkincode.net", "custom_domain": true }]

      再 npx wrangler deploy,Cloudflare 会自动建 DNS 记录与证书。这会改动 DNS,属于独立决策,需要单独确认后再做。

      5. 内容变更后的固定流程

      make check      # 结构 / 引文 / 摘录 / INDEX 是否最新
      make site       # 构建 + 死链自检
      npx wrangler dev # 本地看一眼
      git push        # CI 门禁通过后自动发布

      6. 发布范围

      site/build.mjs 的 walk() 里有排除表:tools/、templates/、.github/、node_modules/、dist/。要让某个内部文件上线,把它从排除表里拿掉并在路由表里加一条;反过来,任何新增目录默认不会被发布。

      7. 已知限制

      • 站内搜索:无。74 页靠导航 + 目录 + INDEX.md 消化,暂不值得引入前端依赖。
      • 评论:无。研究结论的讨论走仓库 issue。
      • 构建时间戳写进页脚(每次构建变化),因此每次部署都会产生完整的新资产,而非增量。