このページで決めること:EmDashのサイトを、どこで動かすか

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

EmDashはAstroのサイトに組み込むCMSで、ページをアクセスのたびにサーバーで描画します(Astroの設定は output: "server")。そのため、サーバーのプログラムを動かし続けられる実行環境が必要です。公式ドキュメントには、次の2つのデプロイ先が示されています。

実行環境 データベース メディア 定期処理(予約公開など) サンドボックス型プラグイン
Cloudflare Workers D1(またはHyperdrive経由のPostgreSQL) R2 Cron Trigger Worker Loader(Workersの有料プランが必要)
Node.js(22.16以上) SQLite、PostgreSQL、libSQL ローカルのディスク、S3互換 組み込みのスケジューラー(プロセスが動いている間だけ) @emdash-cms/sandbox-workerdworkerd を子プロセスで動かす)

Cloudflare版の公式テンプレートは、Worker Loaderのバインディングをコメントアウトした状態で作られるため、そのままならWorkersの無料プランでデプロイできます。サンドボックス型プラグインを使う場合は、Worker Loaderのバインディング(LOADER)を有効にし、有料プランにします。

公式の推奨

  • Cloudflare Workersは、既定では訪問者の近くでWorkerを動かします。EmDashはサーバーで描画するときにD1と何度もやり取りするため、Targeted PlacementでWorkerをD1のプライマリーの近くで動かします。Targeted Placementと同時にD1の読み取りレプリカは有効にせず、EmDashの session 設定は既定の "disabled" のままにします。(公式「Cloudflareへのデプロイ」)
  • 秘密の値は、Workersでは pnpm wrangler secret put <NAME> で、Node.jsではホスティング事業者のシークレット管理機能で登録します。astro.config.mjswrangler.jsoncimport.meta.env には書きません。(公式「Cloudflareへのデプロイ」「シークレットとキーの管理」)
  • Node.jsで本番運用する場合は、少なくとも1つのNode.jsのプロセスを常に動かしておきます。すべてのプロセスが止まると、予約公開などの定期処理も止まります。(公式「Node.jsへのデプロイ」)

選択肢の比較

A. Cloudflare Workers(無料プラン) B. Cloudflare Workers(有料プラン) C. Node.jsのサーバー
概要 Cloudflare版テンプレートを、そのままWorkersの無料プランにデプロイする Aと同じ構成で、有料プランにしてWorker Loaderを有効にする VPSやNode.jsのホスティングで、node ./dist/server/entry.mjs を常に動かす
向いている場合 サンドボックス型プラグインを使わない。アクセスが少ない サンドボックス型プラグインを使う。アクセスが無料枠を超える 自分で管理するサーバーで動かしたい。既存のPostgreSQLなどを使いたい
注意点 サンドボックス型プラグインは動かない(インストール・更新は SANDBOX_NOT_AVAILABLE になる)。1リクエストあたりのCPU時間は10ms 使用量に応じた料金が加わる。Dynamic Workers(サンドボックス型プラグイン)の料金も加わる サーバーの管理、ディスクの永続化、データベースとメディアのバックアップを自分で受け持つ
費用と手間 無料。リクエストは1日10万件まで 月額5ドルから。月1,000万リクエストとCPU時間3,000万ミリ秒を含み、超えた分は従量課金 契約するサーバーの料金による。サーバーの管理の手間が加わる
根拠にした公式ページ Cloudflareへのデプロイ、プラグインのインストール、Cloudflare「Workers Pricing」「Limits」 Cloudflareへのデプロイ、プラグインサンドボックス、Cloudflare「Workers Pricing」「Dynamic Workers Pricing」 Node.jsへのデプロイ、プラグインサンドボックス

料金は2026年9月にCloudflare公式の料金ページで確認した値です。D1、R2、KVの料金はDBとファイル置き場の選び方にまとめています。

別の選択肢が合う条件

サンドボックス型プラグインを使わず、アクセスが無料枠に収まるサイトなら、Aで運用できます。自分で管理するサーバーがある場合や、既存のPostgreSQLを使いたい場合は、Cが合います。複数のNode.jsのプロセスで動かす場合は、SQLiteではなくPostgreSQLかlibSQLを使います。

根拠にした公式ページ