このサイトは非公式の日本語訳です。Cloudflare・EmDashプロジェクトが運営するサイトではありません。

このページで決めること:EmDashのサイトで、どのデータベースとメディアの置き場所(メディアストレージ)を使うか

決める前に知っておくこと

EmDashは、データベースとメディアストレージを別々に設定します。

  • データベース:コンテンツモデル、エントリー、ユーザー、設定、プラグインのデータを保存します。
  • メディアストレージ:アップロードした画像やファイルの本体を保存します。データベースに入るのはメディアの情報(メタデータ)だけです。

使えるデータベースとメディアストレージは、実行環境によって決まります。

種類 選択肢 動く実行環境
データベース Cloudflare D1 Cloudflare Workers
データベース Hyperdrive(既存のPostgreSQLにWorkersからつなぐ) Cloudflare Workers
データベース SQLite Node.js、ローカルでの開発
データベース PostgreSQL Node.js
データベース libSQL(リモート接続できるSQLite互換のデータベース) Node.js
メディア R2のバインディング Cloudflare Workers
メディア S3互換(AWS S3、R2のS3 API、MinIOなど) Node.js
メディア ローカルのディスク Node.js、ローカルでの開発

Cloudflareでは、データベースの読み取りを減らすために、KVにクエリ結果を保存するオブジェクトキャッシュ(kvCache())も使えます。

公式の推奨

  • データベースのバックアップにはメディアのファイル本体が含まれないため、メディアストレージは別にバックアップします。(公式「メディアストレージの選択」)
  • R2を公開用のカスタムドメインで配信する場合、そのドメインからはバケット内のすべてのオブジェクトに到達できます。自動のJSONバックアップは同じバケットの backups/ に保存されるため、この部分を公開ドメインから見える状態にしてはいけません。非公開のバケットとEmDashのメディア用ルートを使うか、公開する範囲をメディアに限ります。(公式「Cloudflareへのデプロイ」「メディアストレージの選択」「バックアップと復旧」)
  • Cloudflareの r2.dev の開発用URLにはレート制限があり、本番の配信用ではありません。(公式「メディアストレージの選択」)
  • SQLiteは永続的なディスクが必要で、一時的なストレージしかない環境では、追加の設定なしには動きません。(公式「データベースの選択」)

選択肢の比較:データベース

A. SQLite B. Cloudflare D1 C. libSQL D. PostgreSQL
概要 Node.jsに組み込まれたSQLiteで、サーバーのディスク上のファイルに保存する CloudflareのサーバーレスのSQLiteデータベース。Cloudflare版テンプレートの既定 リモート接続できるSQLite互換のデータベース 本格的なリレーショナルデータベース。WorkersからはHyperdrive経由で使う
向いている場合 Node.jsのプロセス1つで、永続的なディスクがある Cloudflare Workersで動かす Node.jsで、D1を使わずにリモートのデータベースを使いたい 複数のNode.jsのプロセスで1つのデータベースを共有する。既存のPostgreSQLを使う
注意点 書き込めるディスク1つと、データベースのバックアップの運用が必要 Targeted Placementと読み取りレプリカは同時に使わない 接続用のURLと認証トークンの管理が必要 EmDashがテーブルを作成・変更するため、スキーマを持つ権限が付いたロールが必要。ロールを変えると移行に失敗することがある
費用と手間 サーバーの料金に含まれる 無料プラン:1日500万行の読み取り、10万行の書き込み、合計5GBまで。有料プラン:月250億行の読み取り、5,000万行の書き込み、5GBを含み、超えた分は従量課金 利用するサービスの料金による(EmDash・Cloudflareの公式ページに記載なし) 利用するサービスの料金による(EmDash・Cloudflareの公式ページに記載なし)
根拠にした公式ページ データベースの選択、Node.jsへのデプロイ データベースの選択、Cloudflareへのデプロイ、Cloudflare「Workers Pricing」 データベースの選択 データベースの選択

選択肢の比較:メディアストレージ

A. ローカルのディスク B. Cloudflare R2(バインディング) C. S3互換
概要 サーバーのディスク上のディレクトリに保存する WorkersからR2のバインディングで読み書きする。アクセスキーは不要 Node.jsから、AWS S3、R2のS3 API、MinIOなどに保存する
向いている場合 開発用、または永続的なディスクを持つNode.jsのサーバー1台で動かす Cloudflare Workersで動かす Node.jsで、メディアをサーバーのディスクと切り離して保存したい。ブラウザーから直接アップロードさせたい
注意点 署名付きアップロードURLに対応しない。サーバーのディスクと一緒にバックアップが必要 署名付きアップロードURLに対応しない。公開用ドメインを付ける場合は backups/ を公開しない @aws-sdk/client-s3 などを別途インストールする。認証情報を実行時の環境変数で渡す
費用と手間 サーバーの料金に含まれる 無料枠:月10GB分の保存、Class A操作100万回、Class B操作1,000万回。超えた保存は1GBあたり月0.015ドル。R2からのデータ転送(egress)は無料 利用するサービスの料金による(R2のS3 APIを使う場合はR2の料金)
根拠にした公式ページ メディアストレージの選択 メディアストレージの選択、Cloudflare「R2 Pricing」 メディアストレージの選択

料金は2026年9月にCloudflare公式の料金ページで確認した値です。KV(オブジェクトキャッシュ)の含まれる量は、無料プランで1日10万回の読み取りと1,000回の書き込み・削除、有料プランで月1,000万回の読み取りと100万回の書き込み・削除、保存1GBです。

別の選択肢が合う条件

Node.jsのサーバー1台で動かすなら、SQLiteとローカルのディスクの組み合わせが最も少ない設定で済みます。複数のNode.jsのプロセスで動かす場合や、メディアをサーバーと切り離したい場合は、PostgreSQLまたはlibSQLとS3互換のストレージが合います。Cloudflare Workersで既存のPostgreSQLを使いたい場合は、Hyperdriveを使う方法があります。

根拠にした公式ページ