Options de Stockage

Sur cette page

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.

Vue d’Ensemble

StockageIdéal PourFonctionnalités
R2 BindingCloudflare WorkersZéro configuration, rapide
S3Toute plateformeUploads signés, support CDN
LocalDéveloppementStockage fichier simple

Cloudflare R2 (Binding)

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

import emdash from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";

export default defineConfig({
	integrations: [
		emdash({
			storage: r2({ binding: "MEDIA" }),
		}),
	],
});

Configuration

OptionTypeDescription
bindingstringNom du binding R2 depuis wrangler.jsonc
publicUrlstringURL publique optionnelle pour le bucket

Installation

Ajoutez le binding R2 à votre configuration Wrangler :

wrangler.jsonc

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

wrangler.toml

[[r2_buckets]]
binding = "MEDIA"
bucket_name = "emdash-media"

Accès Public

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

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

Stockage Compatible S3

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

La configuration suivante pointe EmDash vers un bucket compatible S3 :

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

Configuration

OptionTypeRequisDescription
endpointstringouiURL de l’endpoint S3
bucketstringouiNom du bucket
accessKeyIdstringnon*Clé d’accès
secretAccessKeystringnon*Clé secrète
regionstringnonRégion (défaut: "auto")
publicUrlstringnonCDN optionnel ou URL publique

* accessKeyId et secretAccessKey doivent être fournis ensemble, ou tous deux omis.

Résolution de la configuration S3 depuis les variables d’environnement

Tout champ omis de s3({...}) est lu depuis la variable d’environnement S3_* correspondante au démarrage du processus. Cela vous permet de construire une image de conteneur une fois et d’injecter les identifiants au démarrage sans reconstruction. Les valeurs explicites dans s3({...}) ont toujours la priorité sur les variables d’environnement.

Variable d’environnementChampNotes
S3_ENDPOINTendpointDoit être une URL http/https valide
S3_BUCKETbucket
S3_ACCESS_KEY_IDaccessKeyId
S3_SECRET_ACCESS_KEYsecretAccessKey
S3_REGIONregionDéfaut: "auto"
S3_PUBLIC_URLpublicUrlPréfixe CDN optionnel

Les variables d’environnement sont lues depuis process.env au démarrage du processus. Ceci est une fonctionnalité Node uniquement.

Appeler s3() sans arguments lit chaque champ depuis les variables d’environnement S3_* :

import emdash, { s3 } from "emdash/astro";

export default defineConfig({
	integrations: [
		emdash({
			// s3() sans arguments : tous les champs depuis les variables d'environnement S3_*
			storage: s3(),

			// Ou mixte : remplacer un champ, le reste depuis l'environnement
			// storage: s3({ publicUrl: "https://cdn.example.com" }),
		}),
	],
});

R2 via l’API S3

Utilisez les identifiants S3 avec R2 pour des fonctionnalités comme les URLs d’upload 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 > Manage R2 API Tokens.

MinIO

Pointez l’adaptateur S3 vers un endpoint MinIO avec ses identifiants d’accès :

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

Système de Fichiers Local

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

import emdash, { local } from "emdash/astro";

export default defineConfig({
	integrations: [
		emdash({
			storage: local({
				directory: "./uploads",
				baseUrl: "/_emdash/api/media/file",
			}),
		}),
	],
});

Configuration

OptionTypeDescription
directorystringChemin du répertoire pour le stockage des fichiers
baseUrlstringURL de base pour servir les fichiers

La baseUrl doit correspondre à l’endpoint de fichiers médias d’EmDash (/_emdash/api/media/file) sauf si vous configurez un serveur de fichiers statiques personnalisé.

Configuration Basée sur l’Environnement

Changez de backends de stockage en fonction de l’environnement :

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

Uploads Signés

L’adaptateur S3 supporte les URLs d’upload 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 gros fichiers.

Les uploads signés sont automatiques lors de l’utilisation de l’adaptateur S3. L’interface d’administration les utilise quand disponibles.

Adaptateurs qui supportent les uploads signés :

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

Adaptateurs qui ne supportent pas les uploads signés :

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

Interface Storage

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 backends de stockage sans modifier le code de l’application.