EmDashは複数のデータベースバックエンドをサポートしています。デプロイターゲットに基づいて選択してください。
概要
| データベース | 最適な用途 | デプロイメント |
|---|---|---|
| D1 | Cloudflare Workers | Edge、グローバル分散 |
| PostgreSQL | 本番環境のNode.js | Postgresを使用できる任意のプラットフォーム |
| libSQL | リモートデータベース | EdgeまたはNode.js |
| SQLite | Node.js、ローカル開発 | 単一サーバー |
Cloudflare D1
D1はCloudflareのサーバーレスSQLiteデータベースです。Cloudflare Workersにデプロイする際に使用します。
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
設定
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
binding | string | — | wrangler.jsoncからのD1バインディング名 |
session | string | "disabled" | 読み取りレプリケーションモード(以下を参照) |
bookmarkCookie | string | "__em_d1_bookmark" | セッションブックマーク用のCookie名 |
セットアップ
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db" 読み取りレプリカ
D1は読み取りレプリケーションをサポートしており、グローバル分散サイトの読み取りレイテンシを低減します。有効にすると、読み取りクエリは常にプライマリデータベースにアクセスする代わりに、近くのレプリカにルーティングされます。
EmDashはD1 Sessions APIを使用して、これを透過的に管理します。sessionオプションで有効にします:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
セッションモード
| モード | 動作 |
|---|---|
"disabled" | セッションなし。すべてのクエリがプライマリに送信されます。デフォルト。 |
"auto" | 匿名リクエストは最も近いレプリカから読み取ります。認証されたユーザーは、ブックマークCookieを介してread-your-writes整合性を取得します。 |
"primary-first" | "auto"と同様ですが、最初のクエリは常にプライマリに送信されます。非常に頻繁な書き込みがあるサイトで使用します。 |
仕組み
- 匿名訪問者は
first-unconstrainedを取得します — 読み取りは最も低いレイテンシのために最も近いレプリカに送信されます。匿名ユーザーは書き込みを行わないため、整合性の保証は必要ありません。 - 認証されたユーザー(編集者、著者)は、ブックマークベースのセッションを取得します。書き込み後、ブックマークCookieは次のリクエストが少なくともその状態を見ることを保証します。
- 書き込みリクエスト(
POST、PUT、DELETE)は常にプライマリデータベースから開始されます。 - ビルド時クエリ(Astroコンテンツコレクション)は、セッションを完全にバイパスし、プライマリを直接使用します。
libSQL
libSQLは、リモート接続をサポートするSQLiteのフォークです。Cloudflare D1なしでリモートデータベースが必要な場合に使用します。
import { libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
}),
}),
],
});
設定
| オプション | 型 | 説明 |
|---|---|---|
url | string | データベースURL(libsql://...またはfile:...) |
authToken | string | リモートデータベース用の認証トークン(ローカルの場合は任意) |
ローカル開発
開発中はローカルlibSQLファイルを使用します:
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQLは、完全なリレーショナルデータベースが必要なNode.jsデプロイメントでサポートされています。
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
設定
接続文字列または個別のパラメータで接続できます:
// 接続文字列
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// 個別のパラメータ
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| オプション | 型 | 説明 |
|---|---|---|
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) |
コネクションプーリング
アダプターは内部でpg.Poolを使用します。デプロイメントに基づいてプールサイズを調整します:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
better-sqlite3を使用したSQLiteは、Node.jsデプロイメントの最もシンプルなオプションです。
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
設定
| オプション | 型 | 説明 |
|---|---|---|
url | string | file:プレフィックス付きファイルパス |
ファイルパス
urlはfile:で始まる必要があります:
// 相対パス
database: sqlite({ url: "file:./data/emdash.db" });
// 絶対パス
database: sqlite({ url: "file:/var/data/emdash.db" });
// 環境変数から
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
マイグレーション
EmDashは、サポートされているすべてのダイアレクト(D1、SQLite、libSQL、PostgreSQL)について、最初のリクエスト時にマイグレーションを自動的に実行します。マイグレーションはemdashパッケージにバンドルされ、ビルドに埋め込まれます。
データベースが空(コレクションなし)で、セットアップウィザードが完了していない場合、EmDashは最初の起動時にシードファイルも適用します。シードは.emdash/seed.json、package.json#emdash.seedのパス、またはseed/seed.jsonから読み取られます — 最初に見つかったものが使用されます — そしてコンパイル時にビルドにインライン化されます。いずれも存在しない場合は、組み込みのデフォルトシードが使用されます。既存のデータベースに対する後続の起動では、そのコンテンツはそのまま保持されます。
環境ベースの設定
環境ごとに異なるデータベースを使用します:
import { sqlite, libsql, postgres } from "emdash/db";
import { d1 } from "@emdash-cms/cloudflare";
const database = import.meta.env.PROD ? d1({ binding: "DB" }) : sqlite({ url: "file:./data.db" });
export default defineConfig({
integrations: [emdash({ database })],
});
ビルドモードの代わりに環境変数に基づいて選択することもできます:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });