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 :
- Allez dans Workers & Pages > votre worker
- Cliquez Custom Domains > Add Custom Domain
- Saisissez votre domaine et suivez les instructions DNS
Accès public R2
Pour servir les médias directement depuis R2 (recommandé pour les performances) :
- Tableau de bord Cloudflare > R2 > votre bucket
- Settings > Public access
- Activez l’accès public et notez l’URL publique
- 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
| Variable | Rôle |
|---|---|
EMDASH_AUTH_SECRET | Signe les cookies de session et les jetons d’auth. Requis en production. |
EMDASH_PREVIEW_SECRET | Signe 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 :
- Vérifiez que les migrations ont été appliquées :
wrangler d1 migrations list emdash-db - Réappliquez si besoin :
wrangler d1 migrations apply emdash-db