コンテンツにスキップ

設定リファレンス

EmDashは、統合用のastro.config.mjsとコンテンツコレクション用のsrc/live.config.tsの2つのファイルを通じて設定されます。

EmDashをAstro統合として設定します:

astro.config.mjs
import { defineConfig } from "astro/config";
import emdash, { local, r2, s3 } from "emdash/astro";
import { sqlite, libsql, d1 } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
plugins: [],
}),
],
});

必須。 データベースアダプターの設定。

// 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 (import from @emdash-cms/cloudflare)
database: d1({ binding: "DB" });

詳細はデータベースオプションを参照してください。

必須。 メディアストレージアダプターの設定。

// Local filesystem (development)
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
});
// R2 binding (Cloudflare Workers)
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev", // optional
});
// 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", // optional, default: "auto"
publicUrl: "https://cdn.example.com", // optional
});

詳細はストレージオプションを参照してください。

オプション。 EmDashプラグインの配列。

import seoPlugin from "@emdash-cms/plugin-seo";
plugins: [seoPlugin()];

オプション。 認証設定。

auth: {
// Self-signup configuration
selfSignup: {
domains: ["example.com"],
defaultRole: 20, // Contributor
},
// OAuth providers
oauth: {
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
},
},
// Session configuration
session: {
maxAge: 30 * 24 * 60 * 60, // 30 days
sliding: true, // Reset expiry on activity
},
// OR use Cloudflare Access (exclusive mode)
cloudflareAccess: {
teamDomain: "myteam.cloudflareaccess.com",
audience: "your-app-audience-tag",
autoProvision: true,
defaultRole: 30,
syncRoles: false,
roleMapping: {
"Admins": 50,
"Editors": 40,
},
},
}

ユーザーのメールドメインが許可されている場合、自己登録を許可します。

オプションタイプデフォルト説明
domainsstring[][]許可されたメールドメイン
defaultRolenumber20自己登録ユーザーのロール
selfSignup: {
domains: ["example.com", "acme.org"],
defaultRole: 20, // Contributor
}

OAuthログインプロバイダーを設定します。

oauth: {
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
},
}

セッション設定。

オプションタイプデフォルト説明
maxAgenumber2592000 (30d)セッションの有効期間(秒)
slidingbooleantrueアクティビティ時に有効期限をリセット

パスキーの代わりにCloudflare Accessを認証プロバイダーとして使用します。

オプションタイプデフォルト説明
teamDomainstringrequiredあなたのAccessチームドメイン
audiencestringrequiredアプリケーションオーディエンス (AUD) タグ
autoProvisionbooleantrue初回ログイン時にユーザーを作成
defaultRolenumber30新規ユーザーのデフォルトロール
syncRolesbooleanfalse各ログイン時にロールを更新
roleMappingobject—IdPグループをロールにマッピング

オプション。 完全なブラウザ向けオリジン(スキーム + ホスト + オプションポート、パスなし)を渡すことで、WebAuthnの**rpIdとorigin**がユーザーのブラウザがclientData.originで送信するものと一致するようにします。

デフォルトでは、パスキーは**Astro.url** / request.urlに従います。TLS終端リバースプロキシの背後では、アプリは内部ホップでhttp://**を参照することが多く、タブは**https://**,**であるか、再構築されたホストが公開名と一致しないため、パスキー検証が失敗します。passkeyPublicOriginをユーザーがアドレスバーに入力するオリジン(例:https://cms.example.com``またはhttps://cms.example.com:8443“)に設定してください。

この統合は、ロード時にこの値を検証します:**http:またはhttps:プロトコルを持つ有効なURLでなければならず、origin**に正規化されます。

emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
passkeyPublicOrigin: "https://cms.example.com",
});

Astroは、公開ホストが許可されている場合にのみ**X-Forwarded-*を反映します。ユーザーがアクセスするホスト名(およびスキーム)に対してsecurity.allowedDomainsを設定してください。astro devでは、ViteがプロキシのHostヘッダーを受け入れるように、一致するvite.server.allowedHosts**を追加してください。

まず**allowedDomains(および転送ヘッダー)を修正することを推奨します。再構築されたURLが依然としてブラウザのオリジンと異なる場合(典型的にはTLSが前面で終端され、上流リクエストがhttp://****のままである場合)に**passkeyPublicOrigin`**を使用してください。

前面にTLSがある場合、開発サーバーをループバックにバインドする(astro dev --host 127.0.0.1)ことがしばしば十分です:プロキシはローカルで接続し、**passkeyPublicOrigin**は公開HTTPSオリジンと一致します。

js title="astro.config.mjs (excerpt)"
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",
}),
passkeyPublicOrigin: "https://cms.example.com",
}),
],
});

emdash/dbからインポートします:

import { sqlite, libsql, postgres, d1 } from "emdash/db";

better-sqlite3を使用するSQLiteデータベース。

オプションタイプ説明
urlstringfile:プレフィックス付きのファイルパス
sqlite({ url: "file:./data.db" });

libSQLデータベース。

オプションタイプ説明
urlstringデータベースURL
authTokenstring認証トークン(ローカルファイルの場合はオプション)
libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
});

接続プーリングを備えたPostgreSQLデータベース。

オプションタイプ説明
connectionStringstringPostgreSQL接続URL
hoststringデータベースホスト
portnumberデータベースポート
databasestringデータベース名
userstringデータベースユーザー
passwordstringデータベースパスワード
sslbooleanSSLを有効化
pool.minnumber最小プールサイズ(デフォルト: 0)
pool.maxnumber最大プールサイズ(デフォルト: 10)
postgres({ connectionString: process.env.DATABASE_URL });

Cloudflare D1データベース。@emdash-cms/cloudflareからインポートします。

オプション型デフォルト説明
bindingstring—wrangler.jsonc からの D1 バインディング名
sessionstring"disabled"読み取りレプリカモード: "disabled"、"auto"、または "primary-first"
bookmarkCookiestring"__ec_d1_bookmark"セッションブックマーク用の Cookie 名
// Basic
d1({ binding: "DB" });
// 読み取りレプリカを使用する場合
d1({ binding: "DB", session: "auto" });

session が "auto" または "primary-first" の場合、EmDash は D1 Sessions API を使用して読み取りクエリを近くのレプリカにルーティングします。認証済みユーザーはブックマークベースの「読み取り時書き込み一貫性」を取得します。詳細は データベースオプション — 読み取りレプリカ を参照してください。

emdash/astro からインポート:

import emdash, { local, r2, s3 } from "emdash/astro";

ローカルファイルシステムストレージ。

オプション型説明
directorystringディレクトリパス
baseUrlstringファイル配信用のベース URL
local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
});

Cloudflare R2 バインディング。

オプション型説明
bindingstringR2 バインディング名
publicUrlstringオプションの公開 URL
r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev",
});

S3 互換ストレージ。

オプション型説明
endpointstringS3 エンドポイント URL
bucketstringバケット名
accessKeyIdstringアクセスキー
secretAccessKeystringシークレットキー
regionstringリージョン (デフォルト: "auto")
publicUrlstringオプションの CDN URL
s3({
endpoint: "https://xxx.r2.cloudflarestorage.com",
bucket: "media",
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
publicUrl: "https://cdn.example.com",
});

src/live.config.ts で EmDash ローダーを設定:

ts title="src/live.config.ts"
import { defineLiveCollection } from "astro:content";
import { emdashLoader } from "emdash/runtime";
export const collections = {
_emdash: defineLiveCollection({
loader: emdashLoader(),
}),
};

emdashLoader() 関数はオプションの設定を受け付けます:

emdashLoader({
// Currently no options - reserved for future use
});

EmDash は以下の環境変数を尊重します:

変数名説明
EMDASH_DATABASE_URLデータベース URL を上書き
EMDASH_AUTH_SECRETパスキー認証用のシークレット
EMDASH_PREVIEW_SECRETプレビュートークン生成用のシークレット
EMDASH_URLスキーマ同期用のリモート EmDash URL

認証シークレットを生成するには:

Terminal window
npx emdash auth secret

package.json 内のオプション設定:

json title="package.json"
{
"emdash": {
"label": "私のブログテンプレート",
"description": "すっきりしたミニマルなブログテンプレート",
"seed": ".emdash/seed.json",
"url": "https://my-site.pages.dev",
"preview": "https://emdash-blog.pages.dev"
}
}
オプション説明
label表示用のテンプレート名
descriptionテンプレートの説明
seedシード JSON ファイルへのパス
urlスキーマ同期用のリモート URL
previewテンプレートプレビュー用のデモサイト URL

EmDash は .emdash/types.ts に型を生成します。tsconfig.json に追加:

json title="tsconfig.json"
{
"compilerOptions": {
"paths": {
"@emdash-cms/types": ["./.emdash/types.ts"]
}
}
}

型を生成するには:

Terminal window
npx emdash types