メディアストレージの選択

このページ

アップロードされたメディア用のストレージアダプターを 1 つ選択してください。データベースバックアップにはメディアのメタデータが含まれますが、保存されたファイルは含まれないため、ストレージバックエンドは別途バックアップしてください。

概要

ストレージ使用場面署名付きアップロード
R2 バインディングサイトが Cloudflare Workers で実行されている場合非対応
S3Node.js サイトが AWS S3、R2 の S3 API、MinIO、または互換ストレージを使用対応
ローカルNode.js サイトに書き込み可能な永続ボリュームがある場合非対応

Cloudflare R2 バインディング

Cloudflare Workers で R2 バインディングアダプターを使用します。バインディングがランタイムでアクセスを提供するため、サイトは 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"

パブリックアクセス

パブリックバケットからメディアを提供するには、Cloudflare API でカスタムドメインを接続し、そのオリジンを publicUrl として設定します。Cloudflare の r2.dev 開発 URL はレート制限があり、本番トラフィック向けではありません。

storage: r2({
	binding: "MEDIA",
	publicUrl: "https://media.example.com",
});

同じバケットが自動 JSON バックアップを保存する場合、パブリックバケットオリジンは backups/ 下のオブジェクトを公開する可能性があります。プライベートバケットと EmDash のメディアルートを使用するか、パブリックオリジンをメディアオブジェクトに制限してください。バックアップを参照してください。

S3 互換ストレージ

S3 アダプターは Node.js で Cloudflare R2 の S3 API、AWS S3、MinIO、互換サービスと動作します。

以下の設定は、Node.js プロセス起動時に S3_* 変数からエンドポイント、バケット、認証情報、リージョン、オプションのパブリック URL を解決します:

import emdash, { s3 } from "emdash/astro";

export default defineConfig({
	integrations: [
		emdash({
			storage: s3(),
		}),
	],
});

設定

オプション必須説明
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

R2 への直接署名付きアップロードが必要な場合、Node.js で S3 アダプターを使用します。Cloudflare API または CLI でスコープ付き R2 API 認証情報を作成し、以下のランタイム変数を設定します:

S3_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
S3_BUCKET=emdash-media
S3_ACCESS_KEY_ID=<r2-access-key-id>
S3_SECRET_ACCESS_KEY=<r2-secret-access-key>
S3_REGION=auto
S3_PUBLIC_URL=https://media.example.com

実際の値は Node.js ホスティングプラットフォームのシークレットマネージャーに保管してください。パブリック URL はオプションであり、アップロードに使用される S3 API エンドポイントを置き換えるものではありません。

MinIO

同じランタイム変数を MinIO に向けます。S3_ENDPOINT を MinIO API オリジンに、S3_BUCKET をバケット名に、2 つの認証情報変数をスコープ付き MinIO アクセスキーに設定します。そのオリジンがバケットのオブジェクトを公開的に提供する場合のみ S3_PUBLIC_URL を設定してください。

ローカルファイルシステム

開発や永続ディスクを持つ単一の Node.js サーバーにローカルストレージを使用します。ファイルはそのディスク上のディレクトリに保存されます。

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) と一致させてください。

環境ごとに別のストレージを使用する

以下の設定は開発中にローカルディレクトリを使用し、Cloudflare 本番ビルドで R2 を使用します:

import emdash, { 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;
}

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