EmDash prend en charge plusieurs backends de base de données. Choisissez en fonction de votre cible de déploiement.
Vue d’ensemble
| Base de données | Idéal pour | Déploiement |
|---|---|---|
| D1 | Cloudflare Workers | Edge, distribué globalement |
| PostgreSQL | Node.js en production | Toute plateforme avec Postgres |
| libSQL | Bases de données distantes | Edge ou Node.js |
| SQLite | Node.js, développement local | Serveur unique |
Cloudflare D1
D1 est la base de données SQLite serverless de Cloudflare. Utilisez-la lors du déploiement sur Cloudflare Workers.
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
Configuration
| Option | Type | Par défaut | Description |
|---|---|---|---|
binding | string | — | Nom de binding D1 depuis wrangler.jsonc |
session | string | "disabled" | Mode de réplication en lecture (voir ci-dessous) |
bookmarkCookie | string | "__em_d1_bookmark" | Nom du cookie pour les signets de session |
Configuration initiale
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db" Réplicas de lecture
D1 prend en charge la réplication en lecture pour réduire la latence de lecture pour les sites distribués globalement. Lorsqu’elle est activée, les requêtes de lecture sont acheminées vers des réplicas proches au lieu de toujours interroger la base de données principale.
EmDash utilise l’API D1 Sessions pour gérer cela de manière transparente. Activez-la avec l’option session :
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
Modes de session
| Mode | Comportement |
|---|---|
"disabled" | Pas de sessions. Toutes les requêtes vont vers la principale. Par défaut. |
"auto" | Les requêtes anonymes lisent depuis le réplica le plus proche. Les utilisateurs authentifiés obtiennent une cohérence read-your-writes via des cookies de signet. |
"primary-first" | Comme "auto", mais la première requête va toujours vers la principale. À utiliser pour les sites avec des écritures très fréquentes. |
Fonctionnement
- Visiteurs anonymes obtiennent
first-unconstrained— les lectures vont vers le réplica le plus proche pour la latence la plus faible. Comme les utilisateurs anonymes n’écrivent jamais, ils n’ont pas besoin de garanties de cohérence. - Utilisateurs authentifiés (éditeurs, auteurs) obtiennent des sessions basées sur des signets. Après une écriture, un cookie de signet garantit que la requête suivante voit au moins cet état.
- Requêtes d’écriture (
POST,PUT,DELETE) commencent toujours à la base de données principale. - Requêtes au moment de la construction (collections de contenu Astro) contournent entièrement les sessions et utilisent directement la principale.
libSQL
libSQL est un fork de SQLite qui prend en charge les connexions distantes. Utilisez-le lorsque vous avez besoin d’une base de données distante sans 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,
}),
}),
],
});
Configuration
| Option | Type | Description |
|---|---|---|
url | string | URL de base de données (libsql://... ou file:...) |
authToken | string | Jeton d’authentification pour les bases de données distantes (optionnel pour local) |
Développement local
Utilisez un fichier libSQL local pendant le développement :
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQL est pris en charge pour les déploiements Node.js nécessitant une base de données relationnelle complète.
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
Configuration
Vous pouvez vous connecter avec une chaîne de connexion ou des paramètres individuels :
// Chaîne de connexion
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Paramètres individuels
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| Option | Type | Description |
|---|---|---|
connectionString | string | URL de connexion PostgreSQL |
host | string | Hôte de la base de données |
port | number | Port de la base de données |
database | string | Nom de la base de données |
user | string | Utilisateur de la base de données |
password | string | Mot de passe de la base de données |
ssl | boolean | Activer SSL |
pool.min | number | Connexions minimales du pool (par défaut 0) |
pool.max | number | Connexions maximales du pool (par défaut 10) |
Pooling de connexions
L’adaptateur utilise pg.Pool en interne. Ajustez la taille du pool en fonction de votre déploiement :
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
SQLite avec better-sqlite3 est l’option la plus simple pour les déploiements Node.js.
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
Configuration
| Option | Type | Description |
|---|---|---|
url | string | Chemin de fichier avec préfixe file: |
Chemin de fichier
L’url doit commencer par file: :
// Chemin relatif
database: sqlite({ url: "file:./data/emdash.db" });
// Chemin absolu
database: sqlite({ url: "file:/var/data/emdash.db" });
// Depuis une variable d'environnement
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
Migrations
EmDash exécute les migrations automatiquement à la première requête, pour chaque dialecte pris en charge (D1, SQLite, libSQL, PostgreSQL). Les migrations sont fournies avec le package emdash et intégrées dans votre build.
Si la base de données est vide (pas de collections) et que l’assistant de configuration n’a pas été complété, EmDash applique également un fichier de seed au premier démarrage. Le seed est lu depuis .emdash/seed.json, le chemin dans package.json#emdash.seed, ou seed/seed.json — celui qui est trouvé en premier — et intégré dans le build au moment de la compilation. Si aucun n’est présent, un seed par défaut intégré est utilisé. Les démarrages ultérieurs sur une base de données existante laissent son contenu intact.
Configuration basée sur l’environnement
Utilisez différentes bases de données par environnement :
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 })],
});
Le choix peut également être basé sur une variable d’environnement au lieu du mode de build :
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });