Déployer sur Cloudflare

Sur cette page

Cloudflare Workers offre un runtime rapide et distribué mondialement pour EmDash. Ce guide couvre le déploiement avec D1 pour la base de données et R2 pour le stockage média.

Prérequis

  • Un compte Cloudflare
  • Wrangler CLI installé (npm install -g wrangler)
  • Authentifié sur Cloudflare (wrangler login)

Créer les ressources

1. Créer une base D1

wrangler d1 create emdash-db

Notez le database_id dans la sortie.

2. Créer un bucket R2

wrangler r2 bucket create emdash-media

3. Créer wrangler.jsonc

Créez wrangler.jsonc à la racine du projet :

{
	"$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",
		},
	],
}

Configurer EmDash

Mettez à jour la configuration Astro pour D1 et 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" }),
		}),
	],
});

Exécuter les migrations

Générez et appliquez le schéma de base.

1. Exporter le SQL du schéma

npx emdash init --database ./data.db

2. Appliquer les migrations sur D1

wrangler d1 migrations apply emdash-db

Sans fichiers de migration, appliquez le schéma principal directement :

wrangler d1 execute emdash-db --file=./node_modules/emdash/migrations/0001_core.sql

Déployer

Déployez sur Cloudflare Workers :

wrangler deploy

Votre site est en ligne à https://my-emdash-site.<your-subdomain>.workers.dev.

Réplicas en lecture

Pour les sites distribués mondialement, activez la réplication en lecture D1 pour router les lectures vers des réplicas proches plutôt que toujours vers la base primaire. Cela réduit fortement la latence pour les visiteurs loin de la région primaire.

emdash({
	database: d1({
		binding: "DB",
		session: "auto",
	}),
	storage: r2({ binding: "MEDIA" }),
}),

Vous devez aussi activer la réplication en lecture sur la base D1 elle-même dans le tableau de bord Cloudflare ou via l’API REST.

Voir Options base de données — Réplicas en lecture pour les modes de session et la cohérence par signets.

Domaine personnalisé

Ajoutez un domaine personnalisé dans le tableau de bord Cloudflare :

  1. Allez dans Workers & Pages > votre worker
  2. Cliquez Custom Domains > Add Custom Domain
  3. Saisissez votre domaine et suivez les instructions DNS

Accès public R2

Pour servir les médias directement depuis R2 (recommandé pour les performances) :

  1. Tableau de bord Cloudflare > R2 > votre bucket
  2. Settings > Public access
  3. Activez l’accès public et notez l’URL publique
  4. Mettez à jour la config de stockage :
storage: r2({
  binding: "MEDIA",
  publicUrl: "https://pub-xxx.r2.dev"
}),

Authentification Cloudflare Access

Si votre organisation utilise Cloudflare Access, vous pouvez l’utiliser comme fournisseur d’authentification à la place des passkeys. Cela permet le SSO avec votre fournisseur d’identité existant.

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

Voir le guide d’authentification pour toutes les options.

Variables d’environnement

EmDash nécessite certains secrets pour l’authentification et l’aperçu.

Secrets requis

VariableRôle
EMDASH_AUTH_SECRETSigne les cookies de session et les jetons d’auth. Requis en production.
EMDASH_PREVIEW_SECRETSigne les URLs d’aperçu pour les brouillons. Requis pour l’aperçu.

Générez des secrets sûrs :

npx emdash auth secret

Définissez les secrets avec Wrangler :

wrangler secret put EMDASH_AUTH_SECRET
wrangler secret put EMDASH_PREVIEW_SECRET

Accédez aux variables via import.meta.env ou le binding env Cloudflare.

Déploiements d’aperçu

Déployez une branche d’aperçu :

wrangler deploy --env preview

Ajoutez une section d’environnement dans wrangler.jsonc :

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

Dépannage

« D1 binding not found »

Vérifiez que le nom du binding dans wrangler.jsonc correspond à la configuration de la base :

// Doit correspondre : d1({ binding: "DB" })
"binding": "DB"

« R2 binding not found »

Vérifiez que le bucket R2 est correctement lié :

// Doit correspondre : r2({ binding: "MEDIA" })
"binding": "MEDIA"

Erreurs de migration

Les migrations D1 passent par Wrangler, pas à l’exécution. En cas d’erreurs de schéma :

  1. Vérifiez que les migrations ont été appliquées : wrangler d1 migrations list emdash-db
  2. Réappliquez si besoin : wrangler d1 migrations apply emdash-db