Cloudflare にデプロイする

このページ

Cloudflare Workers は EmDash 向けに高速でグローバルに分散されたランタイムを提供します。本ガイドでは、データベースに D1、メディア保存に R2 を使うデプロイ手順を説明します。

前提条件

  • Cloudflare アカウント
  • Wrangler CLI がインストール済み(npm install -g wrangler
  • Cloudflare にログイン済み(wrangler login

リソースの作成

1. D1 データベースを作成する

wrangler d1 create emdash-db

出力に含まれる database_id を控えておきます。

2. R2 バケットを作成する

wrangler r2 bucket create emdash-media

3. wrangler.jsonc を作成する

プロジェクトルートに wrangler.jsonc を作成します。

{
	"$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",
			"database_id": "your-database-id",
		},
	],

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

EmDash の設定

Astro の設定を更新し、D1 と R2 を使います。

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" }),
		}),
	],
});

マイグレーションの実行

データベーススキーマを生成して適用します。

1. スキーマ SQL をエクスポートする

npx emdash init --database ./data.db

2. D1 にマイグレーションを適用する

wrangler d1 migrations apply emdash-db

マイグレーションファイルがない場合は、コアスキーマを直接適用します。

wrangler d1 execute emdash-db --file=./node_modules/emdash/migrations/0001_core.sql

デプロイ

Cloudflare Workers にデプロイします。

wrangler deploy

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

リードレプリカ

グローバルに分散したサイトでは、D1 の読み取りレプリケーションを有効にすると、読み取りクエリをプライマリではなく近いレプリカに振り分けられます。プライマリリージョンから遠い訪問者のレイテンシを大きく下げられます。

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

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

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

カスタムドメイン

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 を使っている場合、パスキーの代わりに認証プロバイダーとして利用できます。既存の IdP との SSO が可能です。

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 では認証とプレビュー機能に特定のシークレットが必要です。

必須のシークレット

変数用途
EMDASH_AUTH_SECRETセッション Cookie と認証トークンに署名。本番では必須。
EMDASH_PREVIEW_SECRET下書きのプレビュー URL に署名。プレビュー機能に必須。

安全なシークレットを生成:

npx emdash auth secret

Wrangler でシークレットを設定:

wrangler secret put EMDASH_AUTH_SECRET
wrangler secret put EMDASH_PREVIEW_SECRET

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

プレビューデプロイ

プレビュー用ブランチをデプロイ:

wrangler deploy --env preview

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

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

トラブルシューティング

「D1 binding not found」

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

// 一致させる: d1({ binding: "DB" })
"binding": "DB"

「R2 binding not found」

R2 バケットが正しくバインドされているか確認してください。

// 一致させる: r2({ binding: "MEDIA" })
"binding": "MEDIA"

マイグレーションエラー

D1 のマイグレーションはランタイムではなく Wrangler で実行されます。スキーマエラーが出る場合:

  1. マイグレーションが適用済みか確認: wrangler d1 migrations list emdash-db
  2. 必要なら再適用: wrangler d1 migrations apply emdash-db