コンテンツへスキップ

Cloudflare Workers 上の Web 層

機能を一部に限定した Quire Web 層を Cloudflare Workers で実行します。

Markdown で表示

設計は docs/architecture/23-ops.md のセクション 6 にあります。Workers では機能を一部に限定した Web 層を実行します。Workers で全機能をそろえることは対象外です (PRD セクション 12)。この環境でできないことは起動時に名前を明記して拒否されます。

このリリースの状態

設定は用意されています (apps/web/wrangler.jsonc、cloudflare-module Nitro プリセット、Hyperdrive ブリッジ、起動時チェック)。Worker には R2 用の S3 互換ストレージ (QUIRE_STORAGE_DRIVER=s3)、リクエスト間で動作するリアルタイムドライバー (QUIRE_REALTIME_DRIVER=durable_objects または centrifugo)、共有キャッシュ (QUIRE_CACHE_DRIVER=postgres または valkey)、HTTP メールプロバイダーが必要です。設定がない場合は Worker の起動を拒否し、不足している設定名をログに表示します。Durable Objects ドライバーは apps/realtime-worker のリアルタイム Worker を利用します (チャネルごとに Durable Object を作り、配信、プレゼンス、履歴を処理します。切断は利用者ごとのオブジェクトで処理します)。以下の手順で併せてデプロイするか、Centrifugo を使ってください。

各コンポーネント

コンポーネント Cloudflare 上の実行先
web nodejs_compat を使う Worker
Postgres Hyperdrive 経由の外部 DB: アプリケーションロール用 HYPERDRIVE、同一 DB のレポートロール用 REPORT_HYPERDRIVE。起動時に接続文字列を DATABASE_URL と QUIRE_REPORT_DATABASE_URL にコピーします
ファイル S3 API 経由の R2 (S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com); FILES binding でバケットを接続
バックグラウンドジョブ 書き込みと同時に登録するジョブには Hyperdrive 経由の pg-boss を使います。連携 worker で QUIRE_QUEUE_DRIVER=cloudflare にすると、軽量ジョブ (順序を問わない通知、webhook 配信) は Cloudflare Queues 経由になり Postgres をポーリングしません。両方を連携 worker が実行します
リアルタイム Durable Objects を使うリアルタイム Worker apps/realtime-worker
worker、scheduler、collab、content、ClamAV、Gotenberg、ffmpeg 連携コンテナホスト。Worker では実行できません
トレース wrangler.jsonc で有効にする Workers observability

REPORT_HYPERDRIVE は HYPERDRIVE が示す物理 DB のレポートロールを提供します。以下の説明のとおり、この環境では追加の物理 DB に固定されたテナントを扱いません。

この環境でできないこと

起動時にすべての問題を列挙して拒否します。

  • SMTP は使えません。 QUIRE_EMAIL_PROVIDER_CONFIG に HTTP プロバイダーを指定します。
  • ローカルディスクは使えません。 QUIRE_STORAGE_DRIVER にオブジェクトストレージを指定します。
  • プロセス内リアルタイム機能やキャッシュは使えません。 Worker はリクエスト間でメモリーを共有しないため、QUIRE_REALTIME_DRIVER=inprocess と QUIRE_CACHE_DRIVER=memory は拒否されます。
  • Worker で ClamAV、Gotenberg、ffmpeg は使えません。 Worker に設定した CLAMAV_URL、GOTENBERG_URL、FFMPEG_PATH は拒否されます。代わりに連携 worker に設定してください。
  • 専用 DB の組織は利用できません。 Worker の Hyperdrive binding はデプロイ時に固定されるため、独自 DB を持つ組織には明確な「ここでは利用できません」ページが表示されます。Compose または Vercel で提供してください。

拒否はされませんが、Workers では事前レンダリングと段階的な静的再生成が動作しません。フレームワークのドキュメントに記載があっても同じです。すべてのルートはリクエストごとにレンダリングします。

この環境ではトランザクションを短くし、ネットワーク呼び出しをまたいで保持しないでください。接続がプールに戻ると Hyperdrive がセッション状態をリセットするため、テナントコンテキストはトランザクションごとに設定します。

デプロイ

  1. リソースを作成します。
    bun run --bun wrangler hyperdrive create quire-app --connection-string="postgres://quire_app:...@db.example.com:5432/quire"
    bun run --bun wrangler hyperdrive create quire-report --connection-string="postgres://quire_report:...@db.example.com:5432/quire"
    bun run --bun wrangler r2 bucket create quire-files
    bun run --bun wrangler queues create quire-jobs
    2 つの Hyperdrive ID を apps/web/wrangler.jsonc に設定します。
  2. bun run --bun wrangler secret put <NAME> を apps/web から 1 つずつ実行して、QUIRE_SECRET_KEY、QUIRE_MASTER_KEY、QUIRE_EMAIL_PROVIDER_CONFIG、S3_ACCESS_KEY_ID、S3_SECRET_ACCESS_KEY、QUIRE_COLLAB_SIGNING_KEY、QUIRE_REALTIME_WORKER_SECRET を設定します。通常の設定 (QUIRE_APP_ORIGIN、QUIRE_CONTENT_ORIGIN、QUIRE_PLATFORM_DOMAINS、QUIRE_DATABASE_ID、S3_ENDPOINT、S3_BUCKET、QUIRE_COLLAB_URL) は vars に設定します。
  3. apps/web からビルドしてデプロイします。
    NITRO_PRESET=cloudflare-module bun run build
    bun run --bun wrangler deploy
  4. リアルタイム Worker をデプロイします。Web 層の QUIRE_REALTIME_WORKER_SECRET と、トークンシークレットを QUIRE_REALTIME_TOKEN_SECRET に設定します。Web 層は独自の QUIRE_REALTIME_TOKEN_SECRET、未設定なら QUIRE_SECRET_KEY を使ってリアルタイムトークンに署名するため、同じ値を設定してください。Web 層の QUIRE_REALTIME_WORKER_URL には Worker のアドレスを指定します。
    cd apps/realtime-worker
    bun run --bun wrangler secret put QUIRE_REALTIME_WORKER_SECRET
    bun run --bun wrangler secret put QUIRE_REALTIME_TOKEN_SECRET
    bun run --bun wrangler deploy
  5. Cloudflare Queues で軽量ジョブを実行する場合、軽量キューごとにキューを作成し、Queues の読み取り・書き込み権限を持つ API token とともに連携 worker に次を設定します。
    bun run --bun wrangler queues create quire-events-notifications
    bun run --bun wrangler queues create quire-events-notifications-dead
    bun run --bun wrangler queues create quire-events-webhooks
    bun run --bun wrangler queues create quire-events-webhooks-dead
    QUIRE_QUEUE_DRIVER=cloudflare、CLOUDFLARE_ACCOUNT_ID、CLOUDFLARE_QUEUES_TOKEN、必要なら QUIRE_QUEUE_PREFIX (既定値 quire-) を設定します。
  6. Vercel ガイドの手順 3 と同じように連携ホストを実行します。Worker の各デプロイ前に、そこでマイグレーションを実行します。

設定が拒否されると bun run --bun wrangler tail に Web 層が Cloudflare で起動しなかったこと と、不足設定の一覧が表示されます。

ナビゲーション

入力して検索…

↑↓ 移動↵ 選択Esc 閉じる