コンテンツにスキップ

ストレージオプション

EmDashはアップロードされたメディア(画像、ドキュメント、動画)を設定可能なストレージバックエンドに保存します。デプロイメントプラットフォームと要件に基づいて選択してください。

ストレージ最適な用途特徴
R2 BindingCloudflare Workers設定不要、高速
S3任意のプラットフォーム署名付きアップロード、CDNサポート
Local開発環境シンプルなファイルシステムストレージ

Cloudflare Workersにデプロイする場合は、R2バインディングを使用して最速の統合を実現します。

astro.config.mjs
import emdash from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
storage: r2({ binding: "MEDIA" }),
}),
],
});
オプションタイプ説明
bindingstringwrangler.jsoncからのR2バインディング名
publicUrlstringバケットのオプションの公開URL

Wrangler設定にR2バインディングを追加します:

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

公開メディアURLの場合は、R2バケットで公開アクセスを有効にします:

  1. Cloudflareダッシュボード > R2 > 対象のバケットに移動
  2. 設定で公開アクセスを有効化
  3. 設定に公開URLを追加:
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev",
});

S3アダプターは、Cloudflare R2(S3 API経由)、MinIO、およびその他の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
}),
}),
],
});
オプションタイプ説明
endpointstringS3エンドポイントURL
bucketstringバケット名
accessKeyIdstringアクセスキー
secretAccessKeystringシークレットキー
regionstringリージョン(デフォルト: "auto")
publicUrlstringオプションのCDNまたは公開URL

署名付きアップロード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 > R2 APIトークンの管理で、R2 API認証情報を生成します。

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

開発環境にはローカルストレージを使用します。ファイルはディスク上のディレクトリに保存されます。

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",
}),
}),
],
});
オプションタイプ説明
directorystringファイル保存用のディレクトリパス
baseUrlstringファイル配信のベースURL

baseUrlは、カスタム静的ファイルサーバーを設定しない限り、EmDashのメディアファイルエンドポイント(/_emdash/api/media/file)と一致させる必要があります。

環境に応じてストレージバックエンドを切り替えます:

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

S3アダプターは署名付きアップロードURLをサポートしており、クライアントがサーバーを経由せずに直接ストレージにアップロードできるようにします。これにより、大きなファイルのパフォーマンスが向上します。

署名付きアップロードは、S3アダプターを使用すると自動的に有効になります。管理インターフェースは、利用可能な場合にこれらを使用します。

署名付きアップロードをサポートするアダプター:

  • S3(S3 API経由のR2を含む)

署名付きアップロードをサポートしないアダプター:

  • R2 binding(代わりにR2認証情報を使用したS3アダプターを使用してください)
  • Local

すべてのストレージアダプターは同じインターフェースを実装しています:

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;
}

この一貫性により、アプリケーションコードを変更せずにストレージバックエンドを切り替えることができます。