EmDash unterstützt mehrere Datenbank-Backends. Wählen Sie basierend auf Ihrem Deployment-Ziel.
Übersicht
| Datenbank | Am besten für | Deployment |
|---|---|---|
| D1 | Cloudflare Workers | Edge, global verteilt |
| PostgreSQL | Produktions-Node.js | Jede Plattform mit Postgres |
| libSQL | Remote-Datenbanken | Edge oder Node.js |
| SQLite | Node.js, lokale Entwicklung | Einzelner Server |
Cloudflare D1
D1 ist Cloudflares serverlose SQLite-Datenbank. Verwenden Sie sie beim Deployment auf Cloudflare Workers.
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
Konfiguration
| Option | Typ | Standard | Beschreibung |
|---|---|---|---|
binding | string | — | D1-Binding-Name aus wrangler.jsonc |
session | string | "disabled" | Lese-Replikationsmodus (siehe unten) |
bookmarkCookie | string | "__em_d1_bookmark" | Cookie-Name für Session-Lesezeichen |
Einrichtung
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db" Lese-Replikas
D1 unterstützt Lese-Replikation, um die Leselatenz für global verteilte Websites zu reduzieren. Wenn aktiviert, werden Leseabfragen zu nahegelegenen Replikas geroutet, anstatt immer die primäre Datenbank anzusprechen.
EmDash verwendet die D1 Sessions API, um dies transparent zu verwalten. Aktivieren Sie sie mit der session-Option:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
Session-Modi
| Modus | Verhalten |
|---|---|
"disabled" | Keine Sessions. Alle Abfragen gehen zur Primärdatenbank. Standard. |
"auto" | Anonyme Anfragen lesen vom nächstgelegenen Replikat. Authentifizierte Benutzer erhalten Read-Your-Writes-Konsistenz über Bookmark-Cookies. |
"primary-first" | Wie "auto", aber die erste Abfrage geht immer zur Primärdatenbank. Verwenden Sie dies für Websites mit sehr häufigen Schreibvorgängen. |
Funktionsweise
- Anonyme Besucher erhalten
first-unconstrained— Lesevorgänge gehen zum nächstgelegenen Replikat für die niedrigste Latenz. Da anonyme Benutzer nie schreiben, benötigen sie keine Konsistenzgarantien. - Authentifizierte Benutzer (Redakteure, Autoren) erhalten Bookmark-basierte Sessions. Nach einem Schreibvorgang stellt ein Bookmark-Cookie sicher, dass die nächste Anfrage mindestens diesen Status sieht.
- Schreibanfragen (
POST,PUT,DELETE) starten immer bei der primären Datenbank. - Build-Zeit-Abfragen (Astro-Content-Collections) umgehen Sessions vollständig und verwenden direkt die Primärdatenbank.
libSQL
libSQL ist ein Fork von SQLite, der Remote-Verbindungen unterstützt. Verwenden Sie es, wenn Sie eine Remote-Datenbank ohne Cloudflare D1 benötigen.
import { libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
}),
}),
],
});
Konfiguration
| Option | Typ | Beschreibung |
|---|---|---|
url | string | Datenbank-URL (libsql://... oder file:...) |
authToken | string | Auth-Token für Remote-Datenbanken (optional für lokale) |
Lokale Entwicklung
Verwenden Sie eine lokale libSQL-Datei während der Entwicklung:
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQL wird für Node.js-Deployments unterstützt, die eine vollständige relationale Datenbank benötigen.
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
Konfiguration
Sie können mit einem Connection-String oder einzelnen Parametern verbinden:
// Connection-String
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Einzelne Parameter
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| Option | Typ | Beschreibung |
|---|---|---|
connectionString | string | PostgreSQL-Verbindungs-URL |
host | string | Datenbank-Host |
port | number | Datenbank-Port |
database | string | Datenbankname |
user | string | Datenbankbenutzer |
password | string | Datenbankpasswort |
ssl | boolean | SSL aktivieren |
pool.min | number | Minimale Pool-Verbindungen (Standard 0) |
pool.max | number | Maximale Pool-Verbindungen (Standard 10) |
Connection Pooling
Der Adapter verwendet pg.Pool unter der Haube. Passen Sie die Pool-Größe basierend auf Ihrem Deployment an:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
SQLite mit better-sqlite3 ist die einfachste Option für Node.js-Deployments.
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
Konfiguration
| Option | Typ | Beschreibung |
|---|---|---|
url | string | Dateipfad mit file:-Präfix |
Dateipfad
Die url muss mit file: beginnen:
// Relativer Pfad
database: sqlite({ url: "file:./data/emdash.db" });
// Absoluter Pfad
database: sqlite({ url: "file:/var/data/emdash.db" });
// Aus Umgebungsvariable
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
Migrationen
EmDash führt Migrationen automatisch bei der ersten Anfrage aus, für jeden unterstützten Dialekt (D1, SQLite, libSQL, PostgreSQL). Migrationen sind mit dem emdash-Paket gebündelt und in Ihren Build eingebettet.
Wenn die Datenbank leer ist (keine Collections) und der Setup-Assistent noch nicht abgeschlossen wurde, wendet EmDash beim ersten Start auch eine Seed-Datei an. Der Seed wird aus .emdash/seed.json, dem Pfad in package.json#emdash.seed oder seed/seed.json gelesen — je nachdem, welcher zuerst gefunden wird — und zur Kompilierzeit in den Build eingebunden. Wenn keiner vorhanden ist, wird ein eingebauter Standard-Seed verwendet. Nachfolgende Starts gegen eine bestehende Datenbank lassen deren Inhalt unverändert.
Umgebungsbasierte Konfiguration
Verwenden Sie verschiedene Datenbanken pro Umgebung:
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 })],
});
Die Auswahl kann auch auf einer Umgebungsvariable statt dem Build-Modus basieren:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });