演進已部署的網站

本頁內容

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 檔案同步),重新建構並將部署指向空資料庫以重新啟動。
  • 架構和範本不一致。 部署和架構變更是獨立的,因此要有意識地安排順序:新增性的架構變更(新集合、新選擇性欄位)先進行,然後部署使用它們的程式碼。對於移除,先部署停止使用該欄位的程式碼,然後移除欄位。