Desplegar en Cloudflare

En esta página

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:

  1. Ve a Workers & Pages > tu worker
  2. Pulsa Custom Domains > Add Custom Domain
  3. Introduce tu dominio y sigue las instrucciones DNS

Acceso público a R2

Para servir medios directamente desde R2 (recomendado por rendimiento):

  1. En el panel de Cloudflare, ve a R2 > tu bucket
  2. Pulsa Settings > Public access
  3. Activa el acceso público y anota la URL pública
  4. 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

VariablePropósito
EMDASH_AUTH_SECRETFirma cookies de sesión y tokens de auth. Obligatorio en producción.
EMDASH_PREVIEW_SECRETFirma 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:

  1. Comprueba que las migraciones se aplicaron: wrangler d1 migrations list emdash-db
  2. Vuelve a aplicar si hace falta: wrangler d1 migrations apply emdash-db