デプロイ済みサイトのスキーマを進化させる

このページ

EmDash はコレクション、フィールド、タクソノミーをコンテンツと共にデータベースに保存します。このガイドを使用して、コードデプロイ、初回シーディング、EmDash コアマイグレーションと混同せずに、稼働中のコンテンツモデルを変更してください。例では Cloudflare D1 を使用していますが、同じ分離はすべてのデータベースアダプターに適用されます。

何が何を変更するか

サイトは 4 つの異なるワークフローを経ます。それぞれが異なるレイヤーに影響します:

ワークフロー何が変わるか方法
コンテンツ編集エントリ、メディア、設定管理パネルまたはコンテンツ API
コードデプロイテンプレート、設定、EmDash バージョンwrangler deploy — EmDash 管理のデータベーステーブルをマイグレーションする場合あり
初回ブートストラップすべて(空の状態から)マイグレーション + シードファイル + セットアップウィザード、初回起動時に自動
スキーマ進化コレクション、フィールド、タクソノミー管理パネルまたは emdash schema を稼働サイトに対して実行(このページ)

シードファイルは 3 行目のみに関与します。データベースが空でセットアップウィザードが完了していない場合に一度だけ適用されます。変更されたシードファイルを既存のデータベースに対してデプロイしても何も起こりません — 稼働サイトのスキーマの進化は常に管理パネルまたは 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

または、管理画面の 設定 → API トークン で 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

これらのコマンドはスクリプトにチェックインして、各環境が同じ順序の変更を受け取るようにできます。コマンドは自動的に冪等ではありません:既存のオブジェクトに対して createadd-field を再実行すると失敗する場合があります。emdash schema listget でターゲットを検査し、どの環境が各ステップを完了したかを記録し、最初のエラーで停止してください。

完全なコマンドリストについては CLI リファレンスを参照してください。

シードファイルを同期する

ビルドに埋め込まれたシードファイルは、新しいデータベースが何で初期化されるかを決定します:新しいプレビュー環境、災害復旧の再構築、または同じサイトの 2 回目のデプロイメント。シードがまだスターターブログを記述しているのに本番が別のものに進化している場合、すべての新しい環境が間違ったモデルでブートストラップされます。

ビルドは .emdash/seed.jsonpackage.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

エクスポートされたシードには、稼働サイトの設定、コレクション、タクソノミー、メニュー、ウィジェットエリアが含まれます。エントリを含めるには --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 を更新し(シードファイルを同期するを参照)、再ビルドして、空のデータベースに対してデプロイして再度ブートストラップします。
  • スキーマとテンプレートが一致しない。 デプロイとスキーマ変更は独立しているため、意図的に順序付けてください:追加的なスキーマ変更(新しいコレクション、新しいオプションフィールド)を最初に、次にそれらを使用するコードを。削除の場合は、まずフィールドの使用を停止するコードをデプロイし、次にフィールドを削除します。