アップロードされたメディア用のストレージアダプターを 1 つ選択してください。データベースバックアップにはメディアのメタデータが含まれますが、保存されたファイルは含まれないため、ストレージバックエンドは別途バックアップしてください。
概要
| ストレージ | 使用場面 | 署名付きアップロード |
|---|---|---|
| R2 バインディング | サイトが Cloudflare Workers で実行されている場合 | 非対応 |
| S3 | Node.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" }),
}),
],
});
設定
| オプション | 型 | 説明 |
|---|---|---|
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" パブリックアクセス
パブリックバケットからメディアを提供するには、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(),
}),
],
});
設定
| オプション | 型 | 必須 | 説明 |
|---|---|---|---|
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
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",
}),
}),
],
});
設定
| オプション | 型 | 説明 |
|---|---|---|
directory | string | ファイル保存のディレクトリパス |
baseUrl | string | ファイル提供のベース 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;
}
この一貫性により、アプリケーションコードを変更せずにストレージバックエンドを切り替えることができます。