Cloudflareへのデプロイ

このページ

Cloudflare Workersは、EmDashのための高速でグローバルに分散されたランタイムを提供します。このガイドでは、データベースにD1、メディアストレージにR2を使用したデプロイについて説明します。

前提条件

  • Cloudflareアカウント
  • Wrangler CLIのインストール(npm install -g wrangler
  • Cloudflareでの認証(wrangler login

バインディングの設定

プロジェクトのルートにD1とR2のバインディングを含むwrangler.jsoncを作成します。Wranglerは、まだ存在しない場合、最初のデプロイ時に両方のリソースをプロビジョニングします。

{
	"$schema": "node_modules/wrangler/config-schema.json",
	"name": "my-emdash-site",
	"compatibility_date": "2025-01-15",
	"compatibility_flags": ["nodejs_compat"],

	"d1_databases": [
		{
			"binding": "DB",
			"database_name": "emdash-db",
		},
	],

	"r2_buckets": [
		{
			"binding": "MEDIA",
			"bucket_name": "emdash-media",
		},
	],
}

EmDashの設定

D1とR2を使用するようにAstro設定を更新します:

import { defineConfig } from "astro/config";
import cloudflare from "@astrojs/cloudflare";
import emdash from "emdash/astro";
import { d1, r2 } from "@emdash-cms/cloudflare";

export default defineConfig({
	output: "server",
	adapter: cloudflare(),
	integrations: [
		emdash({
			database: d1({ binding: "DB" }),
			storage: r2({ binding: "MEDIA" }),
		}),
	],
});

初回起動

データベースマイグレーションは、デプロイ後の最初のリクエスト時に自動的に実行され、適用する新しいものがある場合は、その後の起動ごとに実行されます。

データベースが空(コレクションなし)で、セットアップウィザードが完了していない場合、EmDashは初回起動時にシードファイルも適用します。シードはビルド時に.emdash/seed.jsonpackage.json#emdash.seedのパス、またはseed/seed.jsonから読み込まれます — 最初に見つかったものが使用され — バンドルにインライン化されます。どれも存在しない場合は、組み込みのデフォルトシードが使用されます。既存のデータベースに対する後続のデプロイは、そのコンテンツをそのままにします。

デプロイ

Cloudflare Workersにデプロイします:

wrangler deploy

サイトはhttps://my-emdash-site.<your-subdomain>.workers.devで公開されます。

読み取りレプリカ

グローバルに分散されたサイトの場合、D1読み取りレプリケーションを有効にして、常にプライマリデータベースにアクセスする代わりに、近くのレプリカに読み取りクエリをルーティングします。これにより、プライマリリージョンから遠く離れた訪問者のレイテンシが大幅に削減されます。

emdash({
	database: d1({
		binding: "DB",
		session: "auto",
	}),
	storage: r2({ binding: "MEDIA" }),
}),

また、CloudflareダッシュボードまたはREST APIを介して、D1データベース自体で読み取りレプリケーションを有効にする必要があります。

セッションモードとブックマークベースの一貫性の仕組みについては、データベースオプション — 読み取りレプリカを参照してください。

カスタムドメイン

Cloudflareダッシュボードでカスタムドメインを追加します:

  1. Workers & Pages > あなたのworkerに移動
  2. Custom Domains > Add Custom Domainをクリック
  3. ドメインを入力し、DNS設定の手順に従います

R2パブリックアクセス

R2から直接メディアを配信するには(パフォーマンスに推奨):

  1. Cloudflareダッシュボードで、R2 > あなたのバケットに移動
  2. Settings > Public accessをクリック
  3. パブリックアクセスを有効にし、パブリックURLをメモします
  4. ストレージ設定を更新します:
storage: r2({
  binding: "MEDIA",
  publicUrl: "https://pub-xxx.r2.dev"
}),

Cloudflare Access認証

組織がCloudflare Accessを使用している場合、パスキーの代わりに認証プロバイダーとして使用でき、既存のIDプロバイダーを介してシングルサインオンを提供できます。以下の設定で有効になります:

emdash({
  database: d1({ binding: "DB" }),
  storage: r2({ binding: "MEDIA" }),
  auth: access({
    teamDomain: "myteam.cloudflareaccess.com",
    audience: "your-app-audience-tag",
    roleMapping: {
      "Admins": 50,
      "Editors": 40,
    },
  }),
}),

完全な設定オプションについては、認証ガイドを参照してください。

環境変数

推奨:暗号化キー

EMDASH_ENCRYPTION_KEYは、保存時のプラグインシークレット(Webhookトークン、Turnstileキーなど)を暗号化するためのキーです。キーは起動時に検証されます。プラグインシークレット暗号化は有効にすると使用されます。後で設定を変更することなくシークレットが保護されるように、すべてのデプロイで設定してください。

キーはユーザーが提供し、データベースには保存されません。暗号化された暗号文のみが保存されます。キーを失うと、それで暗号化されたすべてのシークレットが失われます。

次のコマンドでキーを生成し、Workerシークレットとして保存します:

npx emdash secrets generate
wrangler secret put EMDASH_ENCRYPTION_KEY

オプション:安定した値の上書き

EmDashは、プレビューHMACシークレットとコメンターIPハッシュソルトを自動生成し、初回使用時にデータベースに永続化します。以下の環境変数は、値を自分で固定する必要がある場合の上書きです — たとえば、別のプロセスのプレビューWorkerがメインサイトとシークレットを共有する必要がある場合などです。

変数目的
EMDASH_PREVIEW_SECRET自動生成されたプレビューHMACシークレットの上書き。
EMDASH_IP_SALT自動生成されたコメンターIPハッシュソルトの上書き。
EMDASH_AUTH_SECRETオプション。設定されている場合、IPソルトソースとして使用されます(EMDASH_IP_SALTも設定されている場合を除き、優先されます)。既に依存しているインストールのコメンターIPハッシュを安定させます。新しいデプロイでは設定しないでください。

設定で環境変数にアクセスするには、import.meta.envまたはCloudflareのenvバインディングを使用します。

プレビューデプロイ

プレビューブランチをデプロイします:

wrangler deploy --env preview

wrangler.jsoncに環境セクションを追加します:

{
	"env": {
		"preview": {
			"d1_databases": [
				{
					"binding": "DB",
					"database_name": "emdash-db-preview",
				},
			],
		},
	},
}

トラブルシューティング

”D1 binding not found”

wrangler.jsoncのバインディング名がデータベース設定と一致することを確認してください:

// Must match: d1({ binding: "DB" })
"binding": "DB"

“R2 binding not found”

R2バケットが正しくバインドされていることを確認してください:

// Must match: r2({ binding: "MEDIA" })
"binding": "MEDIA"

マイグレーションエラー

スキーマエラーが表示された場合は、Workerログ(wrangler tail)を追跡し、エラーを再現して基礎となるメッセージをキャプチャしてください — その出力で問題を報告してください。