EmDash admite múltiples backends de base de datos. Elige según tu objetivo de despliegue.
Descripción General
| Base de Datos | Mejor Para | Despliegue |
|---|---|---|
| D1 | Cloudflare Workers | Edge, distribuido globalmente |
| PostgreSQL | Node.js producción | Cualquier plataforma con Postgres |
| libSQL | Bases de datos remotas | Edge o Node.js |
| SQLite | Node.js, desarrollo local | Servidor único |
Cloudflare D1
D1 es la base de datos SQLite serverless de Cloudflare. Úsala al desplegar en Cloudflare Workers.
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
Configuración
| Opción | Tipo | Por Defecto | Descripción |
|---|---|---|---|
binding | string | — | Nombre del binding D1 desde wrangler.jsonc |
session | string | "disabled" | Modo de replicación de lectura (ver abajo) |
bookmarkCookie | string | "__em_d1_bookmark" | Nombre de cookie para marcadores de sesión |
Configuración
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" Crear una Base de Datos D1
wrangler d1 create emdash-db
Réplicas de Lectura
D1 admite replicación de lectura para reducir la latencia de lectura en sitios distribuidos globalmente. Cuando está habilitada, las consultas de lectura se enrutan a réplicas cercanas en lugar de alcanzar siempre la base de datos primaria.
EmDash utiliza la API D1 Sessions para gestionar esto de forma transparente. Actívala con la opción session:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
Modos de Sesión
| Modo | Comportamiento |
|---|---|
"disabled" | Sin sesiones. Todas las consultas van al primario. Por defecto. |
"auto" | Las solicitudes anónimas leen desde la réplica más cercana. Los usuarios autenticados obtienen consistencia read-your-writes a través de cookies de marcadores. |
"primary-first" | Como "auto", pero la primera consulta siempre va al primario. Úsalo para sitios con escrituras muy frecuentes. |
Cómo Funciona
- Los visitantes anónimos obtienen
first-unconstrained— las lecturas van a la réplica más cercana para la latencia más baja. Como los usuarios anónimos nunca escriben, no necesitan garantías de consistencia. - Los usuarios autenticados (editores, autores) obtienen sesiones basadas en marcadores. Después de una escritura, una cookie de marcador asegura que la siguiente solicitud vea al menos ese estado.
- Las solicitudes de escritura (
POST,PUT,DELETE) siempre comienzan en la base de datos primaria. - Las consultas en tiempo de compilación (colecciones de contenido Astro) omiten completamente las sesiones y usan el primario directamente.
libSQL
libSQL es un fork de SQLite que admite conexiones remotas. Úsalo cuando necesites una base de datos remota sin 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,
}),
}),
],
});
Configuración
| Opción | Tipo | Descripción |
|---|---|---|
url | string | URL de la base de datos (libsql://... o file:...) |
authToken | string | Token de autenticación para bases de datos remotas (opcional para local) |
Desarrollo Local
Usa un archivo libSQL local durante el desarrollo:
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQL es compatible con despliegues Node.js que necesitan una base de datos relacional completa.
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
Configuración
Puedes conectarte con una cadena de conexión o parámetros individuales:
// Cadena de conexión
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Parámetros individuales
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| Opción | Tipo | Descripción |
|---|---|---|
connectionString | string | URL de conexión PostgreSQL |
host | string | Host de la base de datos |
port | number | Puerto de la base de datos |
database | string | Nombre de la base de datos |
user | string | Usuario de la base de datos |
password | string | Contraseña de la base de datos |
ssl | boolean | Habilitar SSL |
pool.min | number | Conexiones de pool mínimas (por defecto 0) |
pool.max | number | Conexiones de pool máximas (por defecto 10) |
Agrupación de Conexiones
El adaptador usa pg.Pool internamente. Ajusta el tamaño del pool según tu despliegue:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
SQLite con better-sqlite3 es la opción más simple para despliegues Node.js.
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
Configuración
| Opción | Tipo | Descripción |
|---|---|---|
url | string | Ruta de archivo con prefijo file: |
Ruta de Archivo
La url debe comenzar con file::
// Ruta relativa
database: sqlite({ url: "file:./data/emdash.db" });
// Ruta absoluta
database: sqlite({ url: "file:/var/data/emdash.db" });
// Desde variable de entorno
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
Migraciones
EmDash maneja automáticamente las migraciones para SQLite, libSQL y PostgreSQL. Para D1, ejecuta las migraciones a través de Wrangler.
Verificar Estado de Migraciones
npx emdash init --database ./data.db
Este comando:
- Crea el archivo de base de datos si es necesario
- Ejecuta las migraciones pendientes
- Informa del estado actual de las migraciones
Archivos de Migración
Las migraciones vienen incluidas con EmDash. Para ejecutarlas manualmente:
# SQLite/libSQL - las migraciones se ejecutan automáticamente
# D1 - ejecutar a través de wrangler
wrangler d1 migrations apply DB
Configuración Basada en Entorno
Usa diferentes bases de datos por entorno:
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 })],
});
O cambia según las variables de entorno:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });