Default Content Deploy
データベース転送なしでJSONファイルを介してコンテンツを継続的にエクスポート・インポートできる、Drupal向けコンテンツデプロイソリューション。
default_content_deploy
インストール
composer require 'drupal/default_content_deploy:^2.1'
概要
Default Content Deploy (DCD) は、Drupalの包括的なコンテンツデプロイソリューションを提供し、開発チームがGit経由でサイトのすべてのコンテンツをエクスポートおよびデプロイできるようにします。これにより、環境間(ローカル、ステージング、本番)でデータベースを転送する必要がなくなります。
このモジュールは、HAL(Hypertext Application Language)フォーマットを使用してエンティティをJSONファイルにシリアライズし、設定可能なコンテンツディレクトリに保存します。コンテンツは個別に、エンティティタイプ別に、すべての参照とともに、またはサイト全体を一度にエクスポートできます。インポートはタイムスタンプをインテリジェントに比較し、変更されたコンテンツのみを更新します。
DCDは、コード変更と一緒にコンテンツを自動的にデプロイする必要があるCI/CDワークフローで特に価値があります。インクリメンタルインポート、強制上書き、Layout Builderのブロックやテキストフィールドに埋め込まれたメディアを含む複雑なエンティティ関係の処理をサポートしています。
Features
- 個々のエンティティ、エンティティタイプ、またはサイト全体のコンテンツをJSONファイルにエクスポート
- インテリジェントなタイムスタンプベースの比較により、新しいコンテンツの上書きを回避してインポート
- メディア、ファイル、Taxonomyターム、ユーザーなど、すべての参照を再帰的にエクスポート
- Layout Builderのインラインブロックと参照されたブロックコンテンツのサポート
- 処理済みテキストフィールドに埋め込まれた依存関係(CKEditorコンテンツ内の画像、メディア、エンティティ)のエクスポート
- 管理UIから圧縮されたtar.gzアーカイブとしてエクスポートしたコンテンツをダウンロード
- tar.gzアーカイブファイルからコンテンツをアップロードしてインポート
- エクスポートファイルで定義された状態にすべてのコンテンツを戻す強制上書きオプション
- CI/CD自動化を可能にするすべての操作用Drushコマンド
- 進捗追跡付きの大規模コンテンツセットのバッチ処理
- タイムスタンプに基づいて変更されていないコンテンツをスキップするインクリメンタルインポートモード
- イベントサブスクライバーによるエクスポート/インポート動作のカスタマイズ用イベントシステム
- エクスポート/インポート操作から特定のエンティティタイプをスキップ
- インポート時のコンテンツ削除(エクスポートされたエンティティを削除対象としてマーク)
- 特定のデプロイシナリオ向けのエンティティID保持オプション
- 追跡とインクリメンタルエクスポート用のSearch API統合サブモジュール
- 孤立したバッチアイテムのCronベースのガベージコレクション
Use Cases
開発チームのコンテンツ同期
プロジェクトで作業する複数の開発者がコンテンツをGitリポジトリにエクスポートできます。各開発者は 'drush dcdes' で変更をエクスポートし、JSONファイルをコミットし、他の開発者はプル後に 'drush dcdi' でインポートします。これにより、データベースダンプを共有する必要がなくなり、コンテンツの変更がコードと一緒にバージョン管理されます。
CI/CD自動コンテンツデプロイ
継続的デプロイパイプラインでは、コードと一緒にコンテンツを自動的にデプロイできます。デプロイスクリプトには: git pull, drush updb -y, drush cim -y, drush cr, drush dcdi -y が含まれます。これにより、手動介入なしでステージングと本番環境で一貫したコンテンツが確保されます。
サイトインストール用のデフォルトコンテンツ
カスタムインストールプロファイルまたはモジュールとともにデフォルトコンテンツをパッケージ化します。初期コンテンツを一度エクスポートし、リポジトリにコミットし、新規インストールのたびに自動的にインポートさせます。デモサイト、スターターキット、ディストリビューションパッケージに最適です。
コンテンツステージングワークフロー
コンテンツエディターがステージング環境でコンテンツを作成します。エクスポートUIまたはDrushコマンドを使用して、コンテンツをファイルにエクスポートします。レビュー後、これらのファイルはGit経由で本番環境にデプロイされ、そこでインポートされます。これにより、制御されたコンテンツプロモーションワークフローが提供されます。
サイト移行とバックアップ
主要な更新や移行の前に 'drush dcdes' でサイト全体のコンテンツをエクスポートします。JSONファイルは、データベースの違いに関係なく、一致する設定を持つ任意のDrupalインストールにインポートできるポータブルなバックアップとして機能します。
Search APIによるインクリメンタルコンテンツ同期
Search APIサブモジュールを使用すると、コンテンツの変更が自動的に追跡されます。変更されたエンティティのみがエクスポートされるため、大量のコンテンツを持つサイトで効率的です。Search APIバックエンドがエクスポートが必要なものを決定する複雑さを処理します。
Tips
- セキュリティのためコンテンツディレクトリをドキュメントルートの外に配置してください(例: Webルートからの相対で ../content)
- Drushコマンドで --verbose フラグを使用して、インポート/エクスポート中の詳細な進捗とエンティティレベルの情報を確認してください
- 大規模サイトでは、--changes-since オプションを使用して最近変更されたコンテンツのみをエクスポートしてください
- 新しい環境をセットアップする際は、管理者と匿名ユーザーのUUID同期を確保するためにユーザーを最初にエクスポートしてください
- _thumbsフォルダーには、より高速なインクリメンタルインポートスキャンのための軽量メタデータファイルが含まれています
- 'drush dcd-entity-list' を使用して、エクスポート前に利用可能なすべてのエンティティタイプを確認してください
- 追跡可能性のために、エクスポートしたコンテンツファイルを意味のあるコミットメッセージとともにGitにコミットしてください
- 本番環境にデプロイする前に、ステージング環境でインポートをテストしてください
- Search APIサブモジュールはエンティティ保存時の自動エクスポートを提供し、継続的なコンテンツエクスポートワークフローに最適です
Technical Details
Admin Pages 3
/admin/config/development/dcd
コンテンツディレクトリパス、スキップするエンティティタイプ、シリアライゼーションオプションなど、コンテンツのエクスポートおよびインポート操作のグローバル設定を構成します。
/admin/config/development/dcd/import
コンテンツディレクトリに保存されたJSONファイルまたはアップロードされたアーカイブファイルからコンテンツをインポートします。drush dcdiコマンドと同等です。
/admin/config/development/dcd/export
コンテンツをコンテンツディレクトリ内のJSONファイルにエクスポートするか、圧縮アーカイブとしてダウンロードします。drush dcde/dcder/dcdesコマンドと同等です。
権限 2
Hooks 2
hook_hal_type_uri_alter
シリアライゼーション中にHALタイプURIを変更します。DCDはこれを使用して[ENTITY_TYPE]/[BUNDLE]形式のポータブルURIを作成します。
hook_hal_relation_uri_alter
シリアライゼーション中にHALリレーションURIを変更します。DCDはこれを使用してrelation/[ENTITY_TYPE]/[BUNDLE]/[FIELD]形式のポータブルURIを作成します。
Drush Commands 9
drush default-content-deploy:export <entity_type>
参照なしで単一のエンティティまたはエンティティグループをエクスポートします。エンティティをJSONファイルとしてコンテンツディレクトリにエクスポートします。
drush default-content-deploy:export-with-references <entity_type>
エンティティとそのすべての参照エンティティを再帰的にエクスポートします。メディア、ファイル、Taxonomyターム、ユーザー、その他の参照コンテンツを含みます。
drush default-content-deploy:export-site
サイト全体のすべてのコンテンツをエクスポートします。完全なサイトバックアップや初期コンテンツデプロイのセットアップに便利です。
drush default-content-deploy:import
コンテンツディレクトリ内のJSONファイルからコンテンツをインポートします。UUIDマッチングに基づいて新しいエンティティを作成するか、既存のエンティティを更新します。
drush default-content-deploy:uuid-info <entity_type> <id>
特定のエンティティのUUID値を表示します。エクスポート用のエンティティを識別するのに便利です。
drush default-content-deploy:entity-list
サイトで利用可能なすべてのコンテンツエンティティタイプを表示します。有効なentity_type引数を決定するのに便利です。
drush default-content-deploy:get-last-import-timestamp
コンテンツフォルダーのstateに保存されている最後のインポートタイムスタンプを取得します。インクリメンタルインポートの追跡に使用されます。
drush default-content-deploy:set-last-import-timestamp <timestamp>
コンテンツフォルダーのstateに最後のインポートタイムスタンプを設定します。インクリメンタルインポートのstateをリセットするのに便利です。
drush default-content-deploy:sync-thumbs
コンテンツディレクトリからthumbs(メタデータ)フォルダーを同期します。より高速なインクリメンタルインポートのための最適化されたメタデータファイルを作成します。
Troubleshooting 7
https://www.drupal.org/files/issues/2023-04-05/2904423-90.patch からパッチを適用して、翻訳フィールドに関するHALモジュールの問題に対処してください。
https://www.drupal.org/project/drupal/issues/2329253 からCoreパッチを適用してエンティティのタイムスタンプを保持してください。Drupal 11にはこの修正がネイティブで含まれています。
コンテンツディレクトリをドキュメントルートの外に移動するか(推奨)、コンテンツディレクトリ内のJSONファイルへのアクセスを拒否する.htaccess(Apache)またはnginxのlocationルールを追加してください。
'drush dcde' の代わりに 'drush dcder' を使用して参照付きでエクスポートしてください。参照されたエンティティタイプが 'skip_entity_types' 設定にリストされていないことを確認してください。
インポートはタイムスタンプを比較し、ファイルがデータベースより古いエンティティをスキップします。タイムスタンプに関係なくインポートするには --force-override フラグを使用してください。
設計上、DCDはエンティティの識別にUUIDを使用します。インポート中にエンティティIDが変更される場合があります。IDの保持が重要な場合は、--preserve-ids フラグを使用してください(既存のエンティティとの競合を引き起こす可能性があります)。
better_normalizersモジュールはDCDと互換性がありません。Default Content Deployを使用する前に削除してください。
Security Notes 5
- エクスポートされたJSONファイルには機密データが含まれる可能性があります。常にコンテンツディレクトリをドキュメントルートの外に配置するか、Webサーバー設定で保護してください。
- インポート権限は既存のコンテンツを上書きすることを許可します。この権限は信頼できる管理者にのみ付与してください。
- ユーザーのパスワードハッシュはユーザーエンティティのエクスポートに含まれます。コンテンツディレクトリが公開アクセス可能でないことを確認してください。
- アップロードされたアーカイブからインポートする場合、悪意のあるコンテンツのインポートを防ぐためにソースを検証してください。
- モジュールはインポート/エクスポート中にすべてのエンティティデータにアクセスするため、管理者権限で動作します。