EmDashは、アップロードされたメディア(画像、ドキュメント、動画)を設定可能なストレージバックエンドに保存します。デプロイメントプラットフォームと要件に基づいて選択してください。
概要
| ストレージ | 最適な用途 | 機能 |
|---|---|---|
| R2 Binding | Cloudflare Workers | ゼロ設定、高速 |
| S3 | 任意のプラットフォーム | 署名付きアップロード、CDNサポート |
| Local | 開発 | シンプルなファイルシステムストレージ |
Cloudflare R2 (Binding)
最速の統合のために、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互換サービスで動作します。
以下の設定は、EmDashを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のみの機能です。
引数なしでs3()を呼び出すと、S3_*環境変数からすべてのフィールドが読み取られます:
import emdash, { s3 } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
// 引数なしのs3(): S3_*環境変数からすべてのフィールド
storage: s3(),
// または混在: 1つのフィールドを上書き、残りは環境から
// storage: s3({ publicUrl: "https://cdn.example.com" }),
}),
],
});
S3 API経由のR2
署名付きアップロードURLのような機能のために、R2でS3認証情報を使用します:
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
S3アダプターをアクセス認証情報付きの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 binding(代わりにR2認証情報でS3アダプターを使用)
- Local
Storageインターフェース
すべてのストレージアダプターは同じインターフェースを実装します:
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;
}
この一貫性により、アプリケーションコードを変更することなくストレージバックエンドを切り替えることができます。