EmDashは2つのファイルで設定されます:インテグレーション用の astro.config.mjs とコンテンツコレクション用の src/live.config.ts です。
Astroインテグレーション
astro.config.mjs でEmDashをAstroインテグレーションとして設定します:
import { defineConfig } from "astro/config";
import emdash, { local, s3 } from "emdash/astro";
import { sqlite, libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
plugins: [],
}),
],
});
インテグレーションオプション
database
必須。 データベースアダプター設定。アダプターを選択します:
// SQLite (Node.js)
database: sqlite({ url: "file:./data.db" });
// PostgreSQL
database: postgres({ connectionString: process.env.DATABASE_URL });
// libSQL
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
});
// Cloudflare D1(@emdash-cms/cloudflareからインポート)
database: d1({ binding: "DB" });
詳細はデータベースオプションを参照してください。
storage
必須。 メディアストレージアダプター設定。アダプターを選択します:
// ローカルファイルシステム(開発用)
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
});
// R2バインディング(Cloudflare Workers)
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev", // オプション
});
// S3互換(任意のプラットフォーム)
storage: s3()
// または明示的な値で
storage: s3({
endpoint: "https://s3.amazonaws.com",
bucket: "my-bucket",
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: "us-east-1", // オプション、デフォルト: "auto"
publicUrl: "https://cdn.example.com", // オプション
});
詳細はストレージオプションを参照してください。
objectCache
オプション。 コンテンツと設定のクエリ結果をキー/バリューストアにキャッシュし、リクエストごとにデータベースクエリなしで読み取りを提供します。省略時は無効です。アダプターを選択します:
// Cloudflare KV(すべてのisolate間で共有)
import { kvCache } from "@emdash-cms/cloudflare";
objectCache: kvCache({ binding: "CACHE" });
// インメモリ(Node.js / 開発用)
import { memoryCache } from "emdash/astro";
objectCache: memoryCache();
plugins
オプション。 EmDashプラグインの配列:
import seoPlugin from "@emdash-cms/plugin-seo";
plugins: [seoPlugin()];
fonts
オプション。 管理画面のフォント設定。
デフォルトでEmDashはAstro Font API経由でNoto Sansを読み込みます。フォントはビルド時にGoogleからダウンロードされ、セルフホストされます。ベースフォントはラテン、キリル、ギリシャ、デーバナーガリー、ベトナム文字をカバーします。
追加の文字体系のサポートを追加するには、スクリプト名を渡します:
emdash({
fonts: {
scripts: ["arabic", "japanese"],
},
})
利用可能なスクリプトは arabic、armenian、bengali、chinese-simplified、chinese-traditional、chinese-hongkong、devanagari、ethiopic、farsi、georgian、gujarati、gurmukhi、hebrew、japanese、kannada、khmer、korean、lao、malayalam、myanmar、oriya、sinhala、tamil、telugu、thai、tibetan です。
フォント注入を完全に無効にしシステムフォントを使用するには false に設定します:
emdash({
fonts: false,
})
auth
オプション。 認証アダプター。EmDashの組み込みログインはパスキーを使用します。auth を設定すると外部プロバイダーに置き換わります。Cloudflare Accessアダプター access() は @emdash-cms/cloudflare から提供されます:
import { access } from "@emdash-cms/cloudflare";
emdash({
auth: access({
teamDomain: "myteam.cloudflareaccess.com",
audience: "your-app-audience-tag",
roleMapping: {
Admins: 50,
Editors: 40,
},
}),
});
access() のオプション:
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
teamDomain | string | 必須 | Cloudflare Accessチームドメイン |
audience | string | — | Application Audience (AUD) タグ |
audienceEnvVar | string | "CF_ACCESS_AUDIENCE" | ランタイムにaudienceタグを読み取る環境変数 |
autoProvision | boolean | true | 初回ログイン時にEmDashユーザーを作成 |
defaultRole | number | 30 | roleMapping にマッチしないユーザーのロールレベル |
syncRoles | boolean | false | プロビジョニング時だけでなく毎回ログイン時に roleMapping を再適用 |
roleMapping | object | — | IdPグループ名をEmDashロールレベルにマッピング |
authProviders
オプション。 プラグイン可能なログインプロバイダーの配列:
import { github } from "emdash/auth/providers/github";
import { google } from "emdash/auth/providers/google";
import { atproto } from "@emdash-cms/auth-atproto";
emdash({
authProviders: [github(), google(), atproto()],
});
組み込みプロバイダー:
github()—EMDASH_OAUTH_GITHUB_CLIENT_ID/EMDASH_OAUTH_GITHUB_CLIENT_SECRETを読み取ります。google()—EMDASH_OAUTH_GOOGLE_CLIENT_ID/EMDASH_OAUTH_GOOGLE_CLIENT_SECRETを読み取ります。atproto()— Atmosphereアカウントログイン(BlueSkyとATプロトコルネットワーク)。環境変数不要。{ allowedDIDs, allowedHandles, defaultRole }を受け付けます。
siteUrl
オプション。 サイトの公開ブラウザ向けオリジン(スキーム + ホスト + オプションポート、パスなし)。
TLS終端リバースプロキシの背後では、Astro.url は公開アドレス(https://cms.example.com)ではなく内部アドレス(http://localhost:4321)を返します。これはパスキー、CSRFオリジンマッチング、OAuthリダイレクト、ログインリダイレクト、MCP検出、スナップショットエクスポート、サイトマップ、robots.txt、JSON-LD構造化データを壊します。siteUrl を設定してすべてを一度に修正します。
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
siteUrl: "https://cms.example.com",
});
設定で siteUrl が設定されていない場合、EmDashは順番に環境変数をチェックします:EMDASH_SITE_URL、次に SITE_URL。
マルチオリジンパスキー検証
siteUrl は単一の正規オリジンを定義します。allowedOrigins または EMDASH_ALLOWED_ORIGINS 環境変数で追加の受け入れオリジンを宣言します:
emdash({
siteUrl: "https://example.com",
allowedOrigins: ["https://preview.example.com"],
})
リバースプロキシ設定
import { defineConfig } from "astro/config";
import emdash, { local } from "emdash/astro";
import { sqlite } from "emdash/db";
export default defineConfig({
security: {
allowedDomains: [
{ hostname: "cms.example.com", protocol: "https" },
{ hostname: "cms.example.com", protocol: "http" },
],
},
vite: {
server: {
allowedHosts: ["cms.example.com"],
},
},
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
siteUrl: "https://cms.example.com",
}),
],
});
trustedProxyHeaders
オプション。 リバースプロキシの背後でクライアントIP解決のために信頼するヘッダー。auth レートリミットとパブリックコメントエンドポイントで使用されます。
emdash({
database: sqlite({ url: "file:./data.db" }),
trustedProxyHeaders: ["x-real-ip"],
});
maxUploadSize
オプション。 メディアファイルアップロードの最大許容サイズ(バイト)。デフォルトは 52_428_800(50 MB):
emdash({
maxUploadSize: 100 * 1024 * 1024, // 100 MB
});
toolbar
オプション。 エディターツールバーの配信方法を制御します。デフォルトは "server"。
| 値 | 動作 |
|---|---|
"server"(デフォルト) | ツールバーは認証済みエディター向けの各HTMLレスポンスにサーバーサイドで注入されます。 |
"client" | パブリックHTMLはすべての訪問者で同一。小さなブートストラップスクリプトが “Edit” ピルを表示します。 |
false | ツールバーもブートストラップスクリプトもレンダリングしません。 |
experimental
オプション。 マイナーリリースで動作やフォーマットが変更される可能性のあるオプトイン機能。
experimental.registry
オプション。 管理ダッシュボードのプラグインブラウズとインストールフローをフェデレーテッドなプラグインレジストリに向けます。
emdash({
sandboxRunner: "@emdash-cms/sandbox-cloudflare",
experimental: {
registry: {
aggregatorUrl: "https://registry.emdashcms.com",
acceptLabelers: "did:plc:emdashverification",
policy: {
minimumReleaseAge: "48h",
minimumReleaseAgeExclude: ["did:plc:yourfirstpartydid"],
},
},
},
});
データベースアダプター
import { sqlite, libsql, postgres } from "emdash/db";
sqlite(config)
| オプション | 型 | 説明 |
|---|---|---|
url | string | file: プレフィックス付きファイルパス |
libsql(config)
| オプション | 型 | 説明 |
|---|---|---|
url | string | データベースURL |
authToken | string | 認証トークン(ローカルファイルではオプション) |
postgres(config)
| オプション | 型 | 説明 |
|---|---|---|
connectionString | string | PostgreSQL接続URL |
host | string | データベースホスト |
port | number | データベースポート |
database | string | データベース名 |
user | string | データベースユーザー |
password | string | データベースパスワード |
ssl | boolean | SSLを有効化 |
pool.min | number | 最小プールサイズ(デフォルト: 0) |
pool.max | number | 最大プールサイズ(デフォルト: 10) |
d1(config)
Cloudflare D1。@emdash-cms/cloudflare からインポート。
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
binding | string | — | wrangler.jsonc のD1バインディング名 |
session | string | "disabled" | リードレプリケーションモード |
bookmarkCookie | string | "__em_d1_bookmark" | セッションブックマークのCookie名 |
ストレージアダプター
import emdash, { local, s3 } from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
local(config)
| オプション | 型 | 説明 |
|---|---|---|
directory | string | ディレクトリパス |
baseUrl | string | ファイル配信のベースURL |
r2(config)
| オプション | 型 | 説明 |
|---|---|---|
binding | string | R2バインディング名 |
publicUrl | string | オプションの公開URL |
s3(config?)
S3互換ストレージ。すべてのフィールドはオプションです。
前提条件: @aws-sdk/client-s3 と @aws-sdk/s3-request-presigner をインストール。
| オプション | 型 | 説明 |
|---|---|---|
endpoint | string | S3エンドポイントURL (S3_ENDPOINT) |
bucket | string | バケット名 (S3_BUCKET) |
accessKeyId | string | アクセスキー (S3_ACCESS_KEY_ID) |
secretAccessKey | string | シークレットキー (S3_SECRET_ACCESS_KEY) |
region | string | リージョン、デフォルト "auto" (S3_REGION) |
publicUrl | string | オプションのCDN URL (S3_PUBLIC_URL) |
オブジェクトキャッシュアダプター
kvCache(config)
Cloudflare KVバックエンド。@emdash-cms/cloudflare からインポート。
kvCache({
binding: "CACHE",
defaultTtl: 3600,
revalidate: 1000,
timeout: 2000,
keyPrefix: "em",
})
memoryCache(config?)
Node.js用インプロセスバックエンド。emdash/astro からインポート。
memoryCache({
defaultTtl: 3600,
revalidate: 1000,
maxEntries: 1000,
keyPrefix: "em",
})
ライブコレクション
import { defineLiveCollection } from "astro:content";
import { emdashLoader } from "emdash/runtime";
export const collections = {
_emdash: defineLiveCollection({
loader: emdashLoader(),
}),
};
ローダーオプション
emdashLoader() 関数は引数を取りません:
emdashLoader();
環境変数
| 変数 | 説明 |
|---|---|
EMDASH_SITE_URL | 公開ブラウザ向けオリジン(SITE_URL にフォールバック) |
EMDASH_ALLOWED_ORIGINS | パスキー検証で受け入れる追加オリジンのカンマ区切りリスト |
EMDASH_DATABASE_URL | データベースURLの上書き |
EMDASH_ENCRYPTION_KEY | プラグインシークレットの保存時暗号化用キー |
EMDASH_PREVIEW_SECRET | プレビューHMACシークレットのオプションオーバーライド |
EMDASH_IP_SALT | コメンターIPハッシュソルトのオプションオーバーライド |
EMDASH_AUTH_SECRET | レガシー。設定時IP-saltソースとして使用。 |
EMDASH_TURNSTILE_SECRET_KEY | Cloudflare Turnstileシークレットキー |
EMDASH_URL | スキーマ同期用のリモートEmDash URL |
npx emdash secrets generate
package.json設定
{
"emdash": {
"label": "My Blog Template",
"seed": ".emdash/seed.json",
"url": "https://my-site.pages.dev"
}
}
TypeScript設定
{
"compilerOptions": {
"paths": {
"@emdash-cms/types": ["./.emdash/types.ts"]
}
}
}
npx emdash types