演进已部署的站点

本页内容

EmDash 将集合、字段和分类法存储在数据库中,与内容本身并存。部署新代码不会更改它们:部署会替换 Worker(或服务器)代码,而数据库中的架构和内容保持不变。本页说明如何更改已部署站点的内容模型,以 Cloudflare D1 为例。相同的工作流程适用于其他数据库选项

什么改变什么

站点经历四个不同的工作流程。每个影响不同的层:

工作流程改变的内容如何
内容编辑条目、媒体、设置管理面板或内容 API
代码部署模板、配置、EmDash 版本wrangler deploy — 架构和内容不变
首次引导所有内容(从空开始)迁移 + seed 文件 + 设置向导,首次启动时自动执行
架构演进集合、字段、分类法管理面板或对正在运行的站点执行 emdash schema(本页)

seed 文件仅参与第三行。它在数据库为空且设置向导未完成时应用一次。对现有数据库部署更改后的 seed 文件不会产生任何效果 — 正在运行的站点的架构演进始终通过管理面板或 API 进行。

在管理面板中更改架构

管理面板是演进已部署站点的主要方式。在管理界面中打开 Content Types,添加、编辑或删除集合和字段。更改立即生效 — 内容 API、加载器和编辑 UI 都在运行时从数据库读取架构。

可用字段类型、验证规则和小部件选项请参阅集合与字段

更改架构后,重新生成模板使用的 TypeScript 类型。emdash types 命令从运行中的实例读取架构,因此可以直接指向已部署的站点:

npx emdash types --url https://example.com

从 CLI 更改架构

emdash schema 命令通过 REST API 与运行中的实例通信,因此它们对已部署站点的工作方式与本地开发相同。使用设备流认证一次:

npx emdash login --url https://example.com

或者,在管理界面的 Settings → API Tokens 中创建 API 令牌,并通过 --tokenEMDASH_TOKEN 环境变量传递 — 对 CI 很有用。

然后使用与本地相同的命令演进架构:

npx emdash schema add-field posts subtitle --type string --label "Subtitle" --url https://example.com
npx emdash schema remove-field posts legacy_field --url https://example.com
npx emdash schema create projects --label Projects --url https://example.com

由于这些命令是简单的 CLI 调用,可以脚本化:内容模型的可重复”迁移”是 emdash schema 调用的 shell 脚本,提交到仓库中并依次对每个环境运行。

完整命令列表请参阅 CLI 参考

保持 seed 文件同步

构建中嵌入的 seed 文件决定了数据库初始化为什么:新的预览环境、灾难恢复重建或同一站点的第二次部署。如果 seed 仍然描述的是启动博客,而生产环境已经演进为其他内容,则每个新环境都会用错误的模型引导。

构建嵌入在 .emdash/seed.jsonpackage.json#emdash.seed 中的路径或 seed/seed.json 中找到的第一个 seed 文件。如果都不存在,则嵌入内置的默认 seed(启动博客模型),并且 astro dev 记录警告。

演进已部署站点的架构后,将实时模型导出回仓库。emdash export-seed 读取本地 SQLite 文件,wrangler d1 export 从已部署的 D1 数据库生成一个:

npx wrangler d1 export emdash-db --remote --output=./prod.sql
sqlite3 prod.db < prod.sql
npx emdash export-seed --database prod.db > .emdash/seed.json

导出的 seed 包含实时站点的设置、集合、分类法、菜单和小部件区域。添加 --with-content 以包含条目。将更新的 .emdash/seed.json 与依赖新架构的代码一起提交,使新环境始终用代码能理解的模型引导。

在预览环境中排练更改

破坏性的架构更改(删除字段、重组集合)最安全的做法是在生产环境的一次性副本上排练。

  1. wrangler.jsonc 中添加一个拥有自己 D1 数据库的预览环境:

    {
      "env": {
        "preview": {
          "d1_databases": [{ "binding": "DB", "database_name": "emdash-db-preview" }],
        },
      },
    }
  2. 将生产数据复制进去:

    npx wrangler d1 export emdash-db --remote --output=./prod.sql
    npx wrangler d1 execute emdash-db-preview --remote --file=./prod.sql
  3. 部署并对预览 URL 执行架构更改:

    npx wrangler deploy --env preview
    npx emdash schema remove-field posts legacy_field --url https://preview.example.com
  4. 验证站点能渲染且管理界面行为符合预期,然后对生产环境运行相同的命令。

从错误中恢复

  • 字段被误删除。 列和数据已从实时数据库中消失。从 D1 的 Time Travel 时间点备份恢复,或重新添加字段并从之前的 wrangler d1 export 恢复其值。
  • 新环境用错误的模型引导。 嵌入的 seed 过时或缺失。更新 .emdash/seed.json(参见保持 seed 文件同步),重新构建并将部署指向空数据库以重新引导。
  • 架构和模板不一致。 部署和架构更改是独立的,因此要有意识地安排顺序:添加性的架构更改(新集合、新可选字段)先进行,然后部署使用它们的代码。对于删除,先部署停止使用该字段的代码,然后删除字段。