EmDashをCloudflare(Workers + D1 + R2)にデプロイする
EmDashはCloudflareのエッジ環境でも動きます。Workers・D1・R2 それぞれの役割と、ローカル開発と本番を切り替えるデプロイ構成を、実際のコードとともに解説します。

EmDash の大きな魅力のひとつが「ポータブル」であること。Node.js のサーバーでも、Cloudflare のエッジ環境でも動きます。なかでも Cloudflare は、世界中に分散した拠点から高速に配信でき、無料枠も手厚いため、個人サイトや小規模サイトと相性が良い選択肢です。
3つの役割:Workers・D1・R2
Cloudflare で EmDash を動かすときは、3つのサービスを組み合わせます。

- Workers:プログラムを実行する場所。世界中のエッジで動き、起動が速い
- D1:エッジで動く SQLite データベース。コンテンツを保存する
- R2:画像などのメディア保管庫。S3互換で、転送料(egress)がかからない
ローカルと本番を切り替える
開発はローカル(Node + SQLite)、本番は Cloudflare、と環境を切り替えると快適です。環境変数で出し分ける構成にしておくと、同じコードで両方を扱えます。
// 本番Cloudflareは DEPLOY_TARGET=cloudflare、ローカルは未設定(Node)
const isCloudflare = process.env.DEPLOY_TARGET === "cloudflare";
let adapter, database, storage;
if (isCloudflare) {
const { default: cloudflare } = await import("@astrojs/cloudflare");
const { d1, r2 } = await import("@emdash-cms/cloudflare");
adapter = cloudflare();
database = d1({ binding: "DB" }); // D1
storage = r2({ binding: "MEDIA" }); // R2
} else {
const { default: node } = await import("@astrojs/node");
const { sqlite } = await import("emdash/db");
adapter = node({ mode: "standalone" });
database = sqlite({ url: "file:./data.db" });
}デプロイの流れ
実際のデプロイは、おおむね次のステップで進みます。

コストの目安
Workers・D1・R2 にはいずれも無料枠があり、小規模なサイトであれば無料枠の範囲で運用できることも多いです(具体的な料金は規模やアクセス数によります)。ただし無料枠には1日あたりの読み書き回数などの上限があります。サーバー代を抑えつつ、高速・安全に公開したい場合に有力な構成です。
「Cloudflareでの公開まで任せたい」というご依頼にも対応しています。お問い合わせからご相談ください。