EmDash はアップロードされたメディア(画像、ドキュメント、動画)を設定可能なストレージバックエンドに保存します。デプロイプラットフォームと要件に応じて選択してください。
概要
| ストレージ | 最適な用途 | 特長 |
|---|---|---|
| R2 バインディング | Cloudflare Workers | 設定不要、高速 |
| S3 | あらゆるプラットフォーム | 署名付きアップロード、CDN 対応 |
| ローカル | 開発 | シンプルなファイルシステムストレージ |
Cloudflare R2(バインディング)
Cloudflare Workers へデプロイする場合、R2 バインディングが最速の統合方法です。
import emdash from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
storage: r2({ binding: "MEDIA" }),
}),
],
});
設定
| オプション | 型 | 説明 |
|---|---|---|
binding | string | wrangler.jsonc の R2 バインディング名 |
publicUrl | string | バケットの公開 URL(任意) |
セットアップ
Wrangler 設定に R2 バインディングを追加します:
wrangler.jsonc
{
"r2_buckets": [
{
"binding": "MEDIA",
"bucket_name": "emdash-media"
}
]
} wrangler.toml
[[r2_buckets]]
binding = "MEDIA"
bucket_name = "emdash-media" パブリックアクセス
メディア URL を公開するには、R2 バケットでパブリックアクセスを有効にします:
- Cloudflare ダッシュボード > R2 > 対象バケット
- 設定でパブリックアクセスを有効化
- 公開 URL を設定に追加:
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev",
});
S3 互換ストレージ
S3 アダプターは Cloudflare R2(S3 API 経由)、MinIO、その他の 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
}),
}),
],
});
設定
| オプション | 型 | 必須 | 説明 |
|---|---|---|---|
endpoint | string | はい | S3 エンドポイント URL |
bucket | string | はい | バケット名 |
accessKeyId | string | いいえ* | アクセスキー |
secretAccessKey | string | いいえ* | シークレットキー |
region | string | いいえ | リージョン(デフォルト: "auto") |
publicUrl | string | いいえ | CDN または公開 URL(任意) |
* accessKeyId と secretAccessKey は両方とも指定するか、両方とも省略する必要があります。
環境変数から S3 設定を解決する
s3({...}) で省略されたフィールドは、プロセス起動時に対応する S3_* 環境変数から
読み取られます。これにより、コンテナイメージを一度ビルドし、起動時に認証情報を注入
できるため、再ビルドが不要になります。s3({...}) で明示的に指定した値は常に環境変数
より優先されます。
| 環境変数 | フィールド | 備考 |
|---|---|---|
S3_ENDPOINT | endpoint | 有効な http/https URL であること |
S3_BUCKET | bucket | |
S3_ACCESS_KEY_ID | accessKeyId | |
S3_SECRET_ACCESS_KEY | secretAccessKey | |
S3_REGION | region | デフォルト "auto" |
S3_PUBLIC_URL | publicUrl | CDN プレフィックス(任意) |
環境変数はプロセス起動時に process.env から読み取られます。これは Node 専用の機能です。
import emdash, { s3 } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
// s3() with no args: all fields from S3_* environment variables
storage: s3(),
// Or mix: override one field, rest from environment
// storage: s3({ publicUrl: "https://cdn.example.com" }),
}),
],
});
S3 API 経由の R2
署名付きアップロード URL などの機能のために、S3 認証情報で R2 を使用します:
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",
});
Cloudflare ダッシュボードの R2 > Manage R2 API Tokens で R2 API 認証情報を生成します。
MinIO
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",
});
ローカルファイルシステム
開発にはローカルストレージを使用します。ファイルはディスク上のディレクトリに保存されます。
import emdash, { local } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
}),
],
});
設定
| オプション | 型 | 説明 |
|---|---|---|
directory | string | ファイル保存ディレクトリ |
baseUrl | string | ファイル配信のベース URL |
カスタムの静的ファイルサーバーを設定しない限り、baseUrl は EmDash のメディアファイルエンドポイント(/_emdash/api/media/file)と一致させてください。
環境ベースの設定
環境に応じてストレージバックエンドを切り替えます:
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 })],
});
署名付きアップロード
S3 アダプターは署名付きアップロード URL をサポートし、クライアントがサーバーを経由せずにストレージへ直接アップロードできます。大きなファイルのパフォーマンスが向上します。
S3 アダプター使用時、署名付きアップロードは自動的に利用可能です。管理インターフェースは対応時にこれを使用します。
署名付きアップロードをサポートするアダプター:
- S3(S3 API 経由の R2 を含む)
サポートしないアダプター:
- R2 バインディング(代わりに R2 認証情報を使った S3 アダプターを使用)
- ローカル
ストレージインターフェース
すべてのストレージアダプターは同じインターフェースを実装します:
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;
}
統一されたインターフェースにより、アプリケーションコードを変更せずにストレージバックエンドを切り替えられます。