ストレージオプション

このページ

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

設定

オプション説明
bindingstringwrangler.jsonc の R2 バインディング名
publicUrlstringバケットの公開 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 バケットでパブリックアクセスを有効にします:

  1. Cloudflare ダッシュボード > R2 > 対象バケット
  2. 設定でパブリックアクセスを有効化
  3. 公開 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
			}),
		}),
	],
});

設定

オプション必須説明
endpointstringはいS3 エンドポイント URL
bucketstringはいバケット名
accessKeyIdstringいいえ*アクセスキー
secretAccessKeystringいいえ*シークレットキー
regionstringいいえリージョン(デフォルト: "auto"
publicUrlstringいいえCDN または公開 URL(任意)

* accessKeyIdsecretAccessKey は両方とも指定するか、両方とも省略する必要があります。

環境変数から S3 設定を解決する

s3({...}) で省略されたフィールドは、プロセス起動時に対応する S3_* 環境変数から 読み取られます。これにより、コンテナイメージを一度ビルドし、起動時に認証情報を注入 できるため、再ビルドが不要になります。s3({...}) で明示的に指定した値は常に環境変数 より優先されます。

環境変数フィールド備考
S3_ENDPOINTendpoint有効な http/https URL であること
S3_BUCKETbucket
S3_ACCESS_KEY_IDaccessKeyId
S3_SECRET_ACCESS_KEYsecretAccessKey
S3_REGIONregionデフォルト "auto"
S3_PUBLIC_URLpublicUrlCDN プレフィックス(任意)

環境変数はプロセス起動時に 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",
			}),
		}),
	],
});

設定

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

統一されたインターフェースにより、アプリケーションコードを変更せずにストレージバックエンドを切り替えられます。