Skip to content

Deploy Cloudflare Workers

Rumia Channel edited this page Sep 30, 2026 · 5 revisions

Cloudflare Workers へデプロイする

worker_entry/ の workers-rs Worker を Cloudflare へ配備する。fetch / scheduled / queue イベントを公開し、core の narou_rs (feature worker-runtime) と組み合わせて動く。

配備のスイッチ: リポジトリ変数 SORAHOST が T の間はこの CI は止まる。 Workers を動かすには SORAHOST を F か未設定にする (詳細は Deployment)。

設定は 3 か所に分かれる

置き場 何を置く 誰が読む
GitHub Environment Cloudflare CI が使う値 (CLOUDFLARE_* / NAROU_* / SORAHOST_PROXY_* / ドメイン) platform.yml の worker-deploy-*
GitHub Repository variable SORAHOST = F または未設定 CI の分岐
Worker secret / [vars] 実行時に Worker が読む値 ランタイム (CI が焼き込むか、手で wrangler secret put)

一番の混乱ポイント: GitHub 側は NAROU_S3_*、Worker 側は S3_*。接頭辞が違う。 GitHub の NAROU_S3_ENDPOINT は Worker では S3_ENDPOINT になる (下の対応表)。

値の流れ

flowchart LR
  subgraph SRC["値の出どころ"]
    A["Cloudflare ダッシュボード<br>API トークン / Account ID<br>ドメイン / service token"]
    B["自分で決める値<br>NAROU_ADMIN_TOKEN / NAROU_RS_LOGIN_KEY / S3"]
    C["SORAHOST リレー<br>エンドポイント / 合言葉"]
  end
  subgraph GH["GitHub Environment `Cloudflare`"]
    D["secrets / vars"]
  end
  subgraph CI["CI: deploy_worker.py"]
    E["provision → render → migrate → deploy → smoke"]
  end
  subgraph CF["Cloudflare"]
    F["[vars] / Worker secret<br>crontab/queue/DO/Assets"]
    G["wrangler.ci.toml<br>route / workers_dev"]
  end
  A -->|"CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID / *_DOMAIN"| D
  B -->|"NAROU_ADMIN_TOKEN / NAROU_RS_LOGIN_KEY / NAROU_S3_*"| D
  C -->|"SORAHOST_PROXY_ENDPOINT / _KEY / _TOKEN"| D
  D --> E
  E -->|"wrangler deploy --secrets-file"| F
  E -->|"custom domain / workers_dev"| G
  F -->|"S3_* / NAROU_ADMIN_TOKEN / NAROU_RS_LOGIN_KEY"| CF
Loading

手順 (順に)

Step 0: 前提

  • Cloudflare アカウントと D1 / Queues / (任意) Secrets Store / Access が使えること
  • 独自ドメインを Cloudflare で管理していること (custom domain を使う場合)
  • リポジトリ変数 SORAHOST が F または未設定 (T だとこの CI は走らない)

Step 1: GitHub の Environment Cloudflare に資格情報を置く

GitHub リポジトリ → Settings → Environments → Cloudflare (無ければ作る) に次を置く。 必須は CLOUDFLARE_API_TOKEN と CLOUDFLARE_ACCOUNT_ID の 2 つだけ。

種類 名前 必須 どこから取るか
secret CLOUDFLARE_API_TOKEN ✅ Cloudflare → My Profile → API Tokens。「Edit Cloudflare Workers」相当に D1 / Queues / Secrets Store を足したトークン
secret CLOUDFLARE_ACCOUNT_ID ✅ Cloudflare ダッシュボードのアカウント ID

これだけあれば develop push で D1 / Queue / migration / deploy / smoke まで自動で流れる。 資格情報が無いリポジトリ (fork など) では理由を出してデプロイだけ省略される (テストは走る)。

Step 2: 認証の形を決める

Worker API の Bearer 認証と、前段の Zero Trust (Access) のどちらで守るかを選ぶ。

選び方 置く値
Access を前段に置く (推奨) NAROU_AUTH_REQUIRED=false (var) → NAROU_ADMIN_TOKEN 不要。custom domain + Access を組む
Bearer で守る NAROU_ADMIN_TOKEN (secret) に長いランダム文字列。NAROU_AUTH_REQUIRED は true (既定) のまま

NAROU_AUTH_REQUIRED=true で NAROU_ADMIN_TOKEN 未設定だと fail-closed (500 authentication_not_configured) になるので、どちらかは必ず決める。

Step 3: S3 (挿絵) を設定する

挿絵は D1 ではなく S3 互換ストレージに置く。2 モードある。

(a) 値を GitHub から渡す (既定)

種類 名前 必須
var NAROU_S3_ENDPOINT ✅
var NAROU_S3_REGION ✅
var NAROU_S3_BUCKET ✅
var NAROU_S3_PREFIX 任意
secret NAROU_S3_ACCESS_KEY_ID / NAROU_S3_SECRET_ACCESS_KEY ✅

(b) Secrets Store に置く

Cloudflare 側に既存の Secrets Store を使う場合:

種類 名前 必須 値
var NAROU_SECRETS_STORE_ID ✅ store の ID
var NAROU_S3_*_SECRET_NAME (5 つ) ✅ Cloudflare 側の secret 名

(b) は 5 つ全部揃えて書く (欠けると失敗)。NAROU_ADMIN_TOKEN / NAROU_RS_LOGIN_KEY も ストアに置きたいときは NAROU_ADMIN_TOKEN_SECRET_NAME / NAROU_RS_LOGIN_KEY_SECRET_NAME を足す。

Step 4: (任意) ドメインと Access

種類 名前 必須 意味
secret SERVICE_DOMAIN production 必須 custom domain (ホスト名のみ。ログでは伏せる)
secret DEVELOP_DOMAIN 任意 develop の custom domain (未設定なら workers.dev)
var NAROU_WORKERS_DEV 任意 workers.dev の開閉。Access が境界なら false で迂回口を塞ぐ
secret CF_ACCESS_CLIENT_ID / CF_ACCESS_CLIENT_SECRET 任意 Access の service token (smoke を custom domain 越しに通す)

Step 5: (任意) ログイン Cookie の鍵・リレー

種類 名前 必須 意味
secret NAROU_RS_LOGIN_KEY 任意 Cookie AEAD 鍵 (base64)。native の .narou/login.key と同値で共有
secret SORAHOST_PROXY_ENDPOINT / SORAHOST_PROXY_KEY 任意 取得リレー。リレー側 .env の SORAHOST_PROXY_KEY と同じ値

Step 6: 配備する

develop へ push / タグ push (v*) / workflow_dispatch で流れる。 provision → render → migrate → deploy --secrets-file → smoke の順。

  • テストジョブ (native / native-gpl / wasm / worker / worker-contract / license) が緑のときだけ動く
  • smoke の宛先は NAROU_DEPLOY_URL → custom domain → wrangler が報告した URL の順

名前の対応 (GitHub ⇄ Worker) — ここが一番の勘所

GitHub 側の NAROU_S3_* / NAROU_* と、Worker が実際に読む S3_* / NAROU_* の対応。 接頭辞が落ちる・残る・変わるので混同しない。

GitHub 側 (Environment Cloudflare) Worker が読む名前 置き方
NAROU_S3_ENDPOINT S3_ENDPOINT [vars] に焼き込み
NAROU_S3_REGION S3_REGION [vars]
NAROU_S3_BUCKET S3_BUCKET [vars]
NAROU_S3_PREFIX S3_PREFIX [vars]
NAROU_S3_ACCESS_KEY_ID S3_ACCESS_KEY_ID Worker secret
NAROU_S3_SECRET_ACCESS_KEY S3_SECRET_ACCESS_KEY Worker secret
NAROU_ADMIN_TOKEN NAROU_ADMIN_TOKEN Worker secret (--secrets-file)
NAROU_RS_LOGIN_KEY NAROU_RS_LOGIN_KEY Worker secret
NAROU_AUTH_REQUIRED NAROU_AUTH_REQUIRED [vars]
NAROU_S3_*_SECRET_NAME S3_*_STORE binding Secrets Store 参照

native (SORAHOST) 側の S3_* は別物。S3_ENDPOINT という名前は両方に出るが、 native は環境変数 S3_ENDPOINT を直接読み、Worker は GitHub の NAROU_S3_ENDPOINT が binding S3_ENDPOINT になる。混同しないこと。

GitHub 側の値 一覧 (Environment Cloudflare)

secret

名前 必須 用途と挙動
CLOUDFLARE_API_TOKEN ✅ wrangler 用 API トークン。D1 / Queue の provision、migrations、deploy に使う
CLOUDFLARE_ACCOUNT_ID ✅ アカウント ID。CLOUDFLARE_ACCOUT_ID でも動く
SERVICE_DOMAIN production production の custom domain (ホスト名のみ)
DEVELOP_DOMAIN develop 任意 develop の custom domain
NAROU_ADMIN_TOKEN Zero Trust が境界なら不要 Worker API Bearer。auth 有効で未設定ならデプロイを失敗させる
NAROU_RS_LOGIN_KEY 任意 Cookie AEAD 鍵 (base64)
NAROU_S3_ACCESS_KEY_ID / NAROU_S3_SECRET_ACCESS_KEY 任意 S3 資格情報
CF_ACCESS_CLIENT_ID / CF_ACCESS_CLIENT_SECRET 任意 Access の service token
SORAHOST_PROXY_ENDPOINT / SORAHOST_PROXY_KEY 任意 取得リレー

var

名前 必須 用途と挙動
NAROU_AUTH_REQUIRED 任意 Bearer 検査の on/off (既定 true)
NAROU_WORKERS_DEV 任意 workers.dev の開閉 (route があれば false)
NAROU_S3_ENDPOINT / NAROU_S3_REGION / NAROU_S3_BUCKET (a) で必須 S3 接続先
NAROU_S3_PREFIX 任意 キー前置 (既定 narou/<target>。設定しない)
NAROU_SECRETS_STORE_ID (b) で必須 Secrets Store ID
NAROU_S3_*_SECRET_NAME (5 つ) (b) で必須 Cloudflare 側の secret 名
NAROU_ADMIN_TOKEN_SECRET_NAME / NAROU_RS_LOGIN_KEY_SECRET_NAME 任意 ストアに置くとき
NAROU_D1_BASE_NAME / NAROU_JOB_QUEUE_BASE 任意 リソース名の接頭辞
NAROU_DEPLOY_URL 任意 smoke の宛先
NAROU_SMOKE 任意 0 で smoke 省略 (既定 1)

Worker が実行時に読む名前

名前 必須 意味
NAROU_ADMIN_TOKEN Bearer 認証時 Bearer 照合 (定数時間比較)。auth 有効で未設定ならデプロイを失敗させる
NAROU_RS_LOGIN_KEY 任意 Cookie AEAD 鍵
NAROU_AUTH_REQUIRED 任意 true で Bearer 必須
S3_ENDPOINT / S3_REGION / S3_BUCKET / S3_PREFIX (a) モード時 S3 接続先
S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY (a) モード時 S3 資格情報
S3_*_STORE (b) モード時 Secrets Store 経由の binding
SORAHOST_PROXY_ENDPOINT / SORAHOST_PROXY_KEY 任意 取得リレー

使うリソース (target 名から導出)

リソース 名前の規則 用途
D1 <base>-<target> (既定 narou-rs-develop / -production) メタデータ・本文・設定 (DB)
Queue narou-jobs-<target> ジョブの発行 (NAROU_JOBS)
DLQ narou-jobs-<target>-dlq 上限超過メッセージの退避
Durable Object RATE_LIMITER (SiteRateLimiter) per-site ペーシングを直列化
Durable Object PUSH_HUB (PushHub) WebSocket 配信 hub

ローカルで試す

cd worker_entry
node build_assets.mjs                 # public/ を作る (必須)
npx wrangler dev --config wrangler.toml
  • .dev.vars に NAROU_ADMIN_TOKEN を置く (無いと起動時に作られる)
  • 画面まで見るときは .dev.vars に NAROU_AUTH_REQUIRED=false を足す (fetch は Bearer を付けられない)
  • tests/run.mjs が ビルド → ローカル D1 migration → wrangler dev → 契約テスト を流す
  • ソース変更後は public/ 削除に失敗して無言で止まることがある (Windows の EBUSY)。起動し直す

関連