演進已部署站台的結構描述

本頁內容

EmDash 把集合、欄位和分類法與內容一起存放在資料庫中。本指南說明如何變更這個線上內容模型,同時避免把它與程式碼部署、首次種子初始化或 EmDash 核心遷移混為一談。範例使用 Cloudflare D1;同樣的區分也適用於每一種資料庫轉接器。

什麼會改變什麼

站台會經歷四種不同的工作流程,每一種影響不同的層:

工作流程變動的內容方式
內容編輯條目、媒體、設定管理後台或內容 API
程式碼部署範本、設定、EmDash 版本wrangler deploy —— 可能會遷移由 EmDash 管理的資料庫資料表
首次引導一切,從空白開始遷移 + 種子檔案 + 設定精靈,首次啟動時自動執行
結構描述演進集合、欄位、分類法針對線上站台使用管理後台或 emdash schema(本頁)

種子檔案只參與第三列。它的結構描述和結構只會套用一次,發生在設定精靈完成之前的第一次請求時。把修改過的種子檔案部署到既有的資料庫上不會有任何效果——演進線上站台的結構描述一律透過管理後台或 API 完成。

在管理後台中變更結構描述

管理後台是演進已部署站台的主要方式。在管理後台中開啟 Content Types,然後新增、編輯或移除集合和欄位。變更會立即生效——內容 API、載入器和編輯介面都會在執行階段從資料庫讀取結構描述。

可用的欄位型別、校驗規則和小工具選項請參閱集合與欄位。

變更結構描述之後,請重新產生範本所使用的 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 權杖,並透過 --token 或 EMDASH_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

這些指令可以放入指令碼並提交到儲存庫,讓每個環境都接收到相同的、有順序的變更。這些指令並不會自動保持冪等:對已存在的物件重複執行 create 或 add-field 可能會失敗。請用 emdash schema list 或 get 檢查目標,記錄每個環境已完成哪些步驟,並在出現第一個錯誤時立即停止。

完整的指令清單請參閱 CLI 參考。

保持種子檔案同步

建置中內嵌的種子檔案決定了全新資料庫會初始化成什麼樣子:新的預覽環境、災難復原重建,或同一站台的第二次部署。如果種子檔案仍然描述的是入門部落格,而正式環境已經演進成了別的樣子,那麼每個全新環境啟動時用的都是錯誤的模型。

建置會內嵌依序找到的第一個種子檔案:.emdash/seed.json、package.json#emdash.seed 中指定的路徑,或 seed/seed.json。如果這些都不存在,就會內嵌內建的預設種子(入門部落格模型),同時 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

匯出的種子包含線上站台的設定、集合、分類法、選單、重新導向、小工具區域和 sections。加上 --with-content 可以一併包含條目。請把更新後的 .emdash/seed.json 與依賴新結構描述的程式碼一起提交,這樣全新環境啟動時總能得到程式碼能夠理解的模型。

在預覽環境中演練變更

破壞性的結構描述變更(移除欄位、重構集合)最安全的做法,是先在正式環境的一份可隨時丟棄的副本上演練。

  1. 建立一個獨立的預覽 D1 資料庫,並讓 Wrangler 把它加入 preview 環境:

    npx wrangler d1 create emdash-db-preview \
      --binding DB --env preview --update-config

    確認 env.preview.d1_databases 中包含新資料庫的名稱和 UUID。繫結不會從最上層的 Wrangler 設定繼承。

  2. 匯出正式環境資料,然後透過預覽環境的 DB 繫結匯入該 SQL:

    npx wrangler d1 export emdash-db --remote --output=./prod.sql
    npx wrangler d1 execute DB --env preview --remote --file=./prod.sql
  3. 建置專案並部署到預覽環境,然後針對預覽 URL 執行結構描述變更:

    npm run build
    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 中還原它的值。
  • 全新環境用錯誤的模型完成了引導。 內嵌的種子已經過時或遺失。請更新 .emdash/seed.json(參見保持種子檔案同步),重新建置,並讓部署指向一個空資料庫,以再次完成引導。
  • 結構描述和範本不一致。 部署和結構描述變更是彼此獨立的,因此要有意識地安排順序:增量式的結構描述變更(新集合、新的可選欄位)先進行,然後再部署使用它們的程式碼。對於移除操作,先部署不再使用該欄位的程式碼,再移除欄位。