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.json、package.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ダッシュボードでカスタムドメインを追加します:
- Workers & Pages > あなたのworkerに移動
- Custom Domains > Add Custom Domainをクリック
- ドメインを入力し、DNS設定の手順に従います
R2パブリックアクセス
R2から直接メディアを配信するには(パフォーマンスに推奨):
- Cloudflareダッシュボードで、R2 > あなたのバケットに移動
- Settings > Public accessをクリック
- パブリックアクセスを有効にし、パブリックURLをメモします
- ストレージ設定を更新します:
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)を追跡し、エラーを再現して基礎となるメッセージをキャプチャしてください — その出力で問題を報告してください。