Options de Base de Données

Sur cette page

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éesIdéal pourDéploiement
D1Cloudflare WorkersEdge, distribué globalement
PostgreSQLNode.js en productionToute plateforme avec Postgres
libSQLBases de données distantesEdge ou Node.js
SQLiteNode.js, développement localServeur 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

OptionTypePar défautDescription
bindingstringNom de binding D1 depuis wrangler.jsonc
sessionstring"disabled"Mode de réplication en lecture (voir ci-dessous)
bookmarkCookiestring"__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

ModeComportement
"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

OptionTypeDescription
urlstringURL de base de données (libsql://... ou file:...)
authTokenstringJeton 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,
});
OptionTypeDescription
connectionStringstringURL de connexion PostgreSQL
hoststringHôte de la base de données
portnumberPort de la base de données
databasestringNom de la base de données
userstringUtilisateur de la base de données
passwordstringMot de passe de la base de données
sslbooleanActiver SSL
pool.minnumberConnexions minimales du pool (par défaut 0)
pool.maxnumberConnexions 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

OptionTypeDescription
urlstringChemin 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" });