Repository navigation
Deploy Cloudflare Workers
worker_entry/ の workers-rs Worker を Cloudflare へ配備する。fetch / scheduled /
queue イベントを公開し、core の narou_rs (feature worker-runtime) と組み合わせて動く。
配備のスイッチ: リポジトリ変数
SORAHOSTがTの間はこの CI は止まる。 Workers を動かすにはSORAHOSTをFか未設定にする (詳細は Deployment)。
| 置き場 | 何を置く | 誰が読む |
|---|---|---|
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
- Cloudflare アカウントと D1 / Queues / (任意) Secrets Store / Access が使えること
- 独自ドメインを Cloudflare で管理していること (custom domain を使う場合)
- リポジトリ変数
SORAHOSTがFまたは未設定 (Tだとこの CI は走らない)
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 |
これだけあれば
developpush で D1 / Queue / migration / deploy / smoke まで自動で流れる。 資格情報が無いリポジトリ (fork など) では理由を出してデプロイだけ省略される (テストは走る)。
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 (500authentication_not_configured) になるので、どちらかは必ず決める。
挿絵は D1 ではなく S3 互換ストレージに置く。2 モードある。
| 種類 | 名前 | 必須 |
|---|---|---|
| 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
|
✅ |
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を足す。
| 種類 | 名前 | 必須 | 意味 |
|---|---|---|---|
| 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 越しに通す) |
| 種類 | 名前 | 必須 | 意味 |
|---|---|---|---|
| secret | NAROU_RS_LOGIN_KEY |
任意 | Cookie AEAD 鍵 (base64)。native の .narou/login.key と同値で共有 |
| secret |
SORAHOST_PROXY_ENDPOINT / SORAHOST_PROXY_KEY
|
任意 | 取得リレー。リレー側 .env の SORAHOST_PROXY_KEY と同じ値
|
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 側の 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が bindingS3_ENDPOINTになる。混同しないこと。
| 名前 | 必須 | 用途と挙動 |
|---|---|---|
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
|
任意 | 取得リレー |
| 名前 | 必須 | 用途と挙動 |
|---|---|---|
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) |
| 名前 | 必須 | 意味 |
|---|---|---|
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
|
任意 | 取得リレー |
| リソース | 名前の規則 | 用途 |
|---|---|---|
| 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)。起動し直す
- Deployment / Environment-Variables / Deploy-SORAHOST
- 設計・全一覧:
docs/cloudflare-workers-migration-plan.md§2.2.8
sorahost/README.mddocs/cloudflare-workers-migration-plan.md-
COMMANDS.md/AGENTS.md