Cloudflare Workers ofrece un entorno de ejecución rápido y distribuido globalmente para EmDash. Esta guía cubre el despliegue con D1 como base de datos y R2 para el almacenamiento de medios.
Requisitos previos
- Una cuenta de Cloudflare
- Wrangler CLI instalado (
npm install -g wrangler) - Autenticado en Cloudflare (
wrangler login)
Crear recursos
1. Crear una base de datos D1
wrangler d1 create emdash-db
Anota el database_id de la salida.
2. Crear un bucket R2
wrangler r2 bucket create emdash-media
3. Crear wrangler.jsonc
Crea wrangler.jsonc en la raíz del proyecto:
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "my-emdash-site",
"compatibility_date": "2025-01-15",
"compatibility_flags": ["nodejs_compat"],
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id",
},
],
"r2_buckets": [
{
"binding": "MEDIA",
"bucket_name": "emdash-media",
},
],
}
Configurar EmDash
Actualiza la configuración de Astro para usar D1 y R2:
import { defineConfig } from "astro/config";
import cloudflare from "@astrojs/cloudflare";
import emdash from "emdash/astro";
import { d1, r2 } from "@emdash-cms/cloudflare";
export default defineConfig({
output: "server",
adapter: cloudflare(),
integrations: [
emdash({
database: d1({ binding: "DB" }),
storage: r2({ binding: "MEDIA" }),
}),
],
});
Ejecutar migraciones
Genera y aplica el esquema de la base de datos.
1. Exportar el SQL del esquema
npx emdash init --database ./data.db
2. Aplicar migraciones a D1
wrangler d1 migrations apply emdash-db
Si no tienes archivos de migración, aplica el esquema principal directamente:
wrangler d1 execute emdash-db --file=./node_modules/emdash/migrations/0001_core.sql
Desplegar
Despliega en Cloudflare Workers:
wrangler deploy
Tu sitio queda en vivo en https://my-emdash-site.<your-subdomain>.workers.dev.
Réplicas de lectura
Para sitios distribuidos globalmente, activa la replicación de lectura de D1 para enviar las consultas de lectura a réplicas cercanas en lugar de golpear siempre la base principal. Reduce mucho la latencia para visitantes lejos de la región principal.
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
storage: r2({ binding: "MEDIA" }),
}),
También debes habilitar la replicación de lectura en la propia base D1 desde el panel de Cloudflare o la API REST.
Consulta Opciones de base de datos — Réplicas de lectura para modos de sesión y consistencia basada en marcadores.
Dominio personalizado
Añade un dominio personalizado en el panel de Cloudflare:
- Ve a Workers & Pages > tu worker
- Pulsa Custom Domains > Add Custom Domain
- Introduce tu dominio y sigue las instrucciones DNS
Acceso público a R2
Para servir medios directamente desde R2 (recomendado por rendimiento):
- En el panel de Cloudflare, ve a R2 > tu bucket
- Pulsa Settings > Public access
- Activa el acceso público y anota la URL pública
- Actualiza la configuración de almacenamiento:
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxx.r2.dev"
}),
Autenticación con Cloudflare Access
Si tu organización usa Cloudflare Access, puedes usarlo como proveedor de autenticación en lugar de passkeys. Ofrece SSO con tu proveedor de identidad existente.
emdash({
database: d1({ binding: "DB" }),
storage: r2({ binding: "MEDIA" }),
auth: access({
teamDomain: "myteam.cloudflareaccess.com",
audience: "your-app-audience-tag",
roleMapping: {
"Admins": 50,
"Editors": 40,
},
}),
}),
Consulta la guía de autenticación para todas las opciones de configuración.
Variables de entorno
EmDash requiere ciertos secretos para autenticación y la función de vista previa.
Secretos obligatorios
| Variable | Propósito |
|---|---|
EMDASH_AUTH_SECRET | Firma cookies de sesión y tokens de auth. Obligatorio en producción. |
EMDASH_PREVIEW_SECRET | Firma URLs de vista previa para borradores. Obligatorio para la vista previa. |
Genera secretos seguros:
npx emdash auth secret
Define secretos con Wrangler:
wrangler secret put EMDASH_AUTH_SECRET
wrangler secret put EMDASH_PREVIEW_SECRET
Accede a las variables de entorno en la configuración con import.meta.env o el binding env de Cloudflare.
Despliegues de vista previa
Despliega una rama de vista previa:
wrangler deploy --env preview
Añade una sección de entorno en wrangler.jsonc:
{
"env": {
"preview": {
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db-preview",
"database_id": "your-preview-db-id",
},
],
},
},
}
Solución de problemas
«D1 binding not found»
Verifica que el nombre del binding en wrangler.jsonc coincida con la configuración de la base de datos:
// Debe coincidir: d1({ binding: "DB" })
"binding": "DB"
«R2 binding not found»
Comprueba que el bucket R2 esté enlazado correctamente:
// Debe coincidir: r2({ binding: "MEDIA" })
"binding": "MEDIA"
Errores de migración
Las migraciones de D1 se ejecutan con Wrangler, no en tiempo de ejecución. Si ves errores de esquema:
- Comprueba que las migraciones se aplicaron:
wrangler d1 migrations list emdash-db - Vuelve a aplicar si hace falta:
wrangler d1 migrations apply emdash-db