EmDash supporta più backend di database. Scegli in base al tuo target di deployment.
Panoramica
| Database | Ideale per | Deployment |
|---|---|---|
| D1 | Cloudflare Workers | Edge, distribuito globalmente |
| PostgreSQL | Node.js in produzione | Qualsiasi piattaforma con Postgres |
| libSQL | Database remoti | Edge o Node.js |
| SQLite | Node.js, sviluppo locale | Server singolo |
Cloudflare D1
D1 è il database SQLite serverless di Cloudflare. Usalo quando esegui il deployment su Cloudflare Workers.
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
Configurazione
| Opzione | Tipo | Predefinito | Descrizione |
|---|---|---|---|
binding | string | — | Nome binding D1 da wrangler.jsonc |
session | string | "disabled" | Modalità replica di lettura (vedi sotto) |
bookmarkCookie | string | "__em_d1_bookmark" | Nome cookie per i segnalibri di sessione |
Configurazione Iniziale
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db" Repliche di Lettura
D1 supporta la replica di lettura per ridurre la latenza di lettura per siti distribuiti globalmente. Quando abilitata, le query di lettura vengono instradate verso repliche vicine invece di colpire sempre il database primario.
EmDash utilizza l’API D1 Sessions per gestire questo in modo trasparente. Abilitala con l’opzione session:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
Modalità di Sessione
| Modalità | Comportamento |
|---|---|
"disabled" | Nessuna sessione. Tutte le query vanno al primario. Predefinito. |
"auto" | Le richieste anonime leggono dalla replica più vicina. Gli utenti autenticati ottengono coerenza read-your-writes tramite cookie di segnalibro. |
"primary-first" | Come "auto", ma la prima query va sempre al primario. Usa per siti con scritture molto frequenti. |
Come Funziona
- Visitatori anonimi ottengono
first-unconstrained— le letture vanno alla replica più vicina per la latenza più bassa. Poiché gli utenti anonimi non scrivono mai, non necessitano di garanzie di coerenza. - Utenti autenticati (editori, autori) ottengono sessioni basate su segnalibri. Dopo una scrittura, un cookie di segnalibro garantisce che la richiesta successiva veda almeno quello stato.
- Richieste di scrittura (
POST,PUT,DELETE) iniziano sempre al database primario. - Query al momento del build (collezioni di contenuti Astro) bypassano completamente le sessioni e usano direttamente il primario.
libSQL
libSQL è un fork di SQLite che supporta connessioni remote. Usalo quando hai bisogno di un database remoto senza 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,
}),
}),
],
});
Configurazione
| Opzione | Tipo | Descrizione |
|---|---|---|
url | string | URL database (libsql://... o file:...) |
authToken | string | Token di autenticazione per database remoti (opzionale per locale) |
Sviluppo Locale
Usa un file libSQL locale durante lo sviluppo:
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQL è supportato per deployment Node.js che necessitano di un database relazionale completo.
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
Configurazione
Puoi connetterti con una stringa di connessione o parametri individuali:
// Stringa di connessione
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Parametri individuali
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| Opzione | Tipo | Descrizione |
|---|---|---|
connectionString | string | URL di connessione PostgreSQL |
host | string | Host del database |
port | number | Porta del database |
database | string | Nome del database |
user | string | Utente del database |
password | string | Password del database |
ssl | boolean | Abilita SSL |
pool.min | number | Connessioni minime del pool (predefinito 0) |
pool.max | number | Connessioni massime del pool (predefinito 10) |
Pooling delle Connessioni
L’adapter usa pg.Pool internamente. Regola la dimensione del pool in base al tuo deployment:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
SQLite con better-sqlite3 è l’opzione più semplice per deployment Node.js.
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
Configurazione
| Opzione | Tipo | Descrizione |
|---|---|---|
url | string | Percorso file con prefisso file: |
Percorso File
L’url deve iniziare con file::
// Percorso relativo
database: sqlite({ url: "file:./data/emdash.db" });
// Percorso assoluto
database: sqlite({ url: "file:/var/data/emdash.db" });
// Da variabile d'ambiente
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
Migrazioni
EmDash esegue le migrazioni automaticamente alla prima richiesta, per ogni dialetto supportato (D1, SQLite, libSQL, PostgreSQL). Le migrazioni sono incluse nel pacchetto emdash e incorporate nella tua build.
Se il database è vuoto (nessuna collezione) e la procedura guidata di configurazione non è stata completata, EmDash applica anche un file di seed al primo avvio. Il seed viene letto da .emdash/seed.json, il percorso in package.json#emdash.seed, o seed/seed.json — quello che viene trovato per primo — e incorporato nella build al momento della compilazione. Se nessuno è presente, viene usato un seed predefinito incorporato. Gli avvii successivi su un database esistente lasciano il suo contenuto intatto.
Configurazione Basata sull’Ambiente
Usa database diversi per ambiente:
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 })],
});
La scelta può anche basarsi su una variabile d’ambiente invece della modalità di build:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });