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.

Aperçu

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

OptionTypeDéfautDescription
bindingstringNom de binding D1 depuis wrangler.jsonc
sessionstring"disabled"Mode de réplication lecture (voir ci-dessous)
bookmarkCookiestring"__em_d1_bookmark"Nom du cookie pour les signets de session

Configuration

wrangler.jsonc

{
  "d1_databases": [
    {
      "binding": "DB",
      "database_name": "emdash-db",
      "database_id": "your-database-id"
    }
  ]
}

wrangler.toml

[[d1_databases]]
binding = "DB"
database_name = "emdash-db"
database_id = "your-database-id"

Créer une base de données D1

wrangler d1 create emdash-db

Réplicas en lecture

D1 prend en charge la réplication en lecture pour réduire la latence de lecture des sites distribués globalement. Lorsqu’elle est activée, les requêtes de lecture sont acheminées vers les réplicas proches au lieu de toujours atteindre la base de données primaire.

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 au primaire. 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 au primaire. À utiliser pour les sites avec des écritures très fréquentes.

Comment ça fonctionne

  • Les visiteurs anonymes obtiennent first-unconstrained — les lectures vont au 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.
  • Les utilisateurs authentifiés (éditeurs, auteurs) obtiennent des sessions basées sur des signets. Après une écriture, un cookie de signet garantit que la prochaine requête verra au moins cet état.
  • Les requêtes d’écriture (POST, PUT, DELETE) commencent toujours à la base de données primaire.
  • Les requêtes au moment du build (collections de contenu Astro) contournent complètement les sessions et utilisent directement le primaire.

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 la base de données (libsql://... ou file:...)
authTokenstringJeton d’authentification pour bases 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 de pool minimum (défaut 0)
pool.maxnumberConnexions de pool maximum (défaut 10)

Mise en pool 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 gère automatiquement les migrations pour SQLite, libSQL et PostgreSQL. Pour D1, exécutez les migrations via Wrangler.

Vérifier le statut des migrations

npx emdash init --database ./data.db

Cette commande:

  1. Crée le fichier de base de données si nécessaire
  2. Exécute les migrations en attente
  3. Rapporte le statut actuel des migrations

Fichiers de migration

Les migrations sont livrées avec EmDash. Pour les exécuter manuellement:

# SQLite/libSQL - les migrations s'exécutent automatiquement

# D1 - exécuter via wrangler
wrangler d1 migrations apply DB

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 })],
});

Ou basculez en fonction des variables d’environnement:

const database = process.env.DATABASE_URL
	? postgres({ connectionString: process.env.DATABASE_URL })
	: sqlite({ url: "file:./data.db" });