Aller au contenu

Options de Stockage

EmDash stocke les médias téléchargés (images, documents, vidéos) dans un backend de stockage configurable. Choisissez en fonction de votre plateforme de déploiement et de vos besoins.

StockageIdéal pourFonctionnalités
Liaison R2Cloudflare WorkersConfiguration zéro, rapide
S3Toute plateformeTéléchargements signés, support CDN
LocalDéveloppementStockage simple sur système de fichiers

Utilisez les liaisons R2 lors du déploiement sur Cloudflare Workers pour l’intégration la plus rapide.

astro.config.mjs
import emdash from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
storage: r2({ binding: "MEDIA" }),
}),
],
});
OptionTypeDescription
bindingstringNom de la liaison R2 depuis wrangler.jsonc
publicUrlstringURL publique optionnelle pour le bucket

Ajoutez la liaison R2 à votre configuration Wrangler :

{
"r2_buckets": [
{
"binding": "MEDIA",
"bucket_name": "emdash-media"
}
]
}

Pour les URL de médias publics, activez l’accès public sur votre bucket R2 :

  1. Allez dans Cloudflare Dashboard > R2 > votre bucket
  2. Activez l’accès public sous Paramètres
  3. Ajoutez l’URL publique à votre configuration :
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev",
});

L’adaptateur S3 fonctionne avec Cloudflare R2 (via l’API S3), MinIO et d’autres services compatibles S3.

js title="astro.config.mjs"
import emdash, { s3 } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
storage: s3({
endpoint: process.env.S3_ENDPOINT,
bucket: process.env.S3_BUCKET,
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: "auto", // Optional, defaults to "auto"
publicUrl: process.env.S3_PUBLIC_URL, // Optional CDN URL
}),
}),
],
});
OptionTypeDescription
endpointstringURL du point de terminaison S3
bucketstringNom du bucket
accessKeyIdstringClé d’accès
secretAccessKeystringClé secrète
regionstringRégion (par défaut : "auto")
publicUrlstringURL CDN ou publique optionnelle

Utilisez les identifiants S3 avec R2 pour des fonctionnalités comme les URL de téléchargement signées :

storage: s3({
endpoint: "https://<account-id>.r2.cloudflarestorage.com",
bucket: "emdash-media",
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
publicUrl: "https://pub-xxxx.r2.dev",
});

Générez les identifiants API R2 dans le tableau de bord Cloudflare sous R2 > Gérer les jetons API R2.

storage: s3({
endpoint: "https://minio.example.com",
bucket: "emdash-media",
accessKeyId: process.env.MINIO_ACCESS_KEY,
secretAccessKey: process.env.MINIO_SECRET_KEY,
publicUrl: "https://minio.example.com/emdash-media",
});

Utilisez le stockage local pour le développement. Les fichiers sont stockés dans un répertoire sur le disque.

js title="astro.config.mjs"
import emdash, { local } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
}),
],
});
OptionTypeDescription
directorystringChemin du répertoire pour le stockage des fichiers
baseUrlstringURL de base pour servir les fichiers

Le baseUrl doit correspondre au point de terminaison des fichiers multimédias d’EmDash (/_emdash/api/media/file) sauf si vous configurez un serveur de fichiers statiques personnalisé.

Basculez les backends de stockage en fonction de l’environnement :

js title="astro.config.mjs"
import emdash, { s3, local } from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
const storage = import.meta.env.PROD
? r2({ binding: "MEDIA" })
: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
});
export default defineConfig({
integrations: [emdash({ storage })],
});

L’adaptateur S3 prend en charge les URL de téléchargement signées, permettant aux clients de télécharger directement vers le stockage sans passer par votre serveur. Cela améliore les performances pour les fichiers volumineux.

Les téléchargements signés sont automatiques lors de l’utilisation de l’adaptateur S3. L’interface d’administration les utilise lorsqu’ils sont disponibles.

Adaptateurs qui prennent en charge les téléchargements signés :

  • S3 (y compris R2 via l’API S3)

Adaptateurs qui ne prennent pas en charge les téléchargements signés :

  • Liaison R2 (utilisez plutôt l’adaptateur S3 avec les identifiants R2)
  • Local

Tous les adaptateurs de stockage implémentent la même interface :

interface Storage {
upload(options: {
key: string;
body: Buffer | Uint8Array | ReadableStream;
contentType: string;
}): Promise<UploadResult>;
download(key: string): Promise<DownloadResult>;
delete(key: string): Promise<void>;
exists(key: string): Promise<boolean>;
list(options?: ListOptions): Promise<ListResult>;
getSignedUploadUrl(options: SignedUploadOptions): Promise<SignedUploadUrl>;
getPublicUrl(key: string): string;
}

Cette cohérence permet de changer de backend de stockage sans modifier le code de l’application.