ストレージオプション

このページ

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

概要

ストレージ最適な用途機能
R2 BindingCloudflare 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" }),
		}),
	],
});

設定

オプション説明
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互換サービスで動作します。

以下の設定は、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
			}),
		}),
	],
});

設定

オプション必須説明
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_URLpublicUrlオプションの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",
			}),
		}),
	],
});

設定

オプション説明
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 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;
}

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