ZIPと設定
管理画面に登録するZIPの構成と、wrangler.jsoncの書き方を説明します。
ZIPの構成
pnpm buildはdist/plugin.zipを出力します。
ファイルはZIPの最 上位に置きます。ZIPの中にdist/の階層は作りません。
plugin.zip
├── wrangler.jsonc Workerの設定
├── worker.js バンドル済みのWorker(ESモジュール)
└── assets/ 画面を配信する場合の静的ファイル(任意)
└── index.html /ext/{組織ID}/index.html として配信される
| 対象 | 上限 |
|---|---|
| ZIPファイル全体 | 20MB |
worker.js | 10MB |
wrangler.jsonc | 1MB |
assets/の1ファイル | 25MiB |
assets/の合計 | 25MiB |
assets/のファイル数 | 20,000 |
次のZIPは登録できません。
worker.jsまたはwrangler.jsoncがない/で始まるパス、..を含むパス、バックスラッシュ(\)を含むパスのファイルがあるassets/_headersまたはassets/_redirectsがある
Windowsの一部のZIPツールは、パスの区切りにバックスラッシュを使います。
テンプレートのpnpm buildで作成したZIPを登録してください。
wrangler.jsonc
プラットフォームはZIPに含まれるwrangler.jsoncを読み、Workerをアップロードします。
wrangler.jsoncはJSONC形式で記述でき、コメントと末尾のカンマを使えます。
読み込まれる項目
| 項目 | 必須 | 内容 |
|---|---|---|
compatibility_date | ✓ | 互換性の日付。古すぎる日付はCloudflareが拒否します |
compatibility_flags | 互換性フラグ。テンプレートはnodejs_compatを指定しています | |
durable_objects.bindings | Durable Objectsのバインディング(nameとclass_name) | |
migrations | Durable Objectsのクラスの追加・改名・削除 | |
r2_buckets | 組織のR2バケットのバインディング。1つまで宣言でき、bindingだけを読み込みます |
durable_objectsとmigrationsの書き方はDurable Objectsを、r2_bucketsの書き方はR2を参照してください。
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "my-plugin",
"main": "src/index.ts",
"compatibility_date": "2026-09-01",
"compatibility_flags": ["nodejs_compat"],
"durable_objects": {
"bindings": [{ "name": "ITEM_STORE", "class_name": "ItemStore" }]
},
"migrations": [{ "tag": "v1", "new_sqlite_classes": ["ItemStore"] }]
}
name、main、routes、account_id、envなど、上の表にない項目は読み込まれません。
Workerの名前はプラットフォームが決め、エントリーポイントは常にworker.jsです。
環境ごとの設定(env.productionなど)も適用されないため、本番の値は最上位に書いてください。
登録できない項目
次の項目を宣言したZIPは、登録時に{項目名} is not supported yetのエラーになります。
vars: {}のような空の宣言は、宣言していないものとして扱います。
| 分類 | 項目 |
|---|---|
| 環境変数 | vars |
| ストレージ | d1_databases、kv_namespaces、vectorize、hyperdrive、analytics_engine_datasets |
| 他サービスとの連携 | services、queues、workflows、pipelines、dispatch_namespaces、send_email、mtls_certificates |
| その他の機能 | ai、browser、images、secrets_store_secrets、version_metadata、unsafe、tail_consumers |
| 定期実行 | triggers(Cron Triggers) |
| 静的ファイル | assets.binding |
次の宣言も登録できません。
durable_objects.bindings[].script_name(他のWorkerのDurable Objectsの参照)- 2つ以上の
r2_buckets - Durable ObjectsとR2で同じバインディング名
プラットフォームが注入する値
アクセストークンの検証に使う値は、登録時にプラットフォームが注入します。
コードからはenvで参照します。
| 名前 | 内容 |
|---|---|
PLUGIN_TOKEN_ISSUER | トークンの発行者。組織の認証基盤のrealmのURL |
PLUGIN_TOKEN_JWKS_URL | トークンの署名を検証する公開鍵(JWKS)の取得先 |
wrangler.jsoncには書きません。- 値は組織に割り当てられた認証基盤のrealmから作られます。realmが変わった場合は、ZIPを登録し直すまで以前の値のままです。
PLUGIN_で始まる名前はプラットフォームが予約しています。バインディングやシークレットの名前に使わないでください。- 上の2つのほかに、プラットフォームが内部で使う値も注入されます。コードからは使いません。
wrangler typesはwrangler.jsoncから型を生成するため、注入される値の型は生成されません。
Envの型に手動で追加してください。
declare global {
interface Env {
PLUGIN_TOKEN_ISSUER: string
PLUGIN_TOKEN_JWKS_URL: string
}
}
export {}
ローカルのpnpm devでは値が注入されません。
.dev.varsに記述するか、--varで指定してください。
.dev.varsはテンプレートの.gitignoreに含まれており、ZIPにも含まれません。
pnpm dev --var PLUGIN_TOKEN_ISSUER:https://... --var PLUGIN_TOKEN_JWKS_URL:https://...
シークレット
外部APIのキーなどの秘匿情報はwrangler.jsoncやZIPに含めず、管理画面からシークレットとして登録します。
詳しくはシークレットを参照してください。
静的ファイルを配信する
ZIPのassets/に置いたファイルは、Workers Static Assetsとして配信されます。
独自の画面を提供する場合は、simple-api-with-react-frontendまたはsimple-api-with-vue-frontendテンプレートを使ってください。
配信の設定はプラットフォームが決めます。
wrangler.jsoncのassetsの設定は読み込まれません。
テンプレートのassetsの設定は、ローカルのpnpm devを同じ動作にするためのものです。
| 設定 | 値 | 動作 |
|---|---|---|
html_handling | none | /folderから/folder/への自動リダイレクトなどは行いません |
not_found_handling | single-page-application | どのファイルにも一致しないパスにはindex.htmlを返します |
run_worker_first | ["/api/*"] | /api/以下へのリクエストだけをWorkerで処理します |
assets/を含むZIPを登録すると、Workerに届くのは/api/以下へのリクエストだけになります。
APIのルートはすべて/api/以下に置いてください。
assets/を含まないZIPでは、すべてのパスがWorkerに届きます。
- 静的ファイルへのリクエストではWorkerが動作しないため、ログは記録されません。
- 公開URLは
/ext/{組織ID}/以下になりますが、ビルド時とWorkerは公開URLを知りません。画面のファイルやAPIは相対パスで参照してください。 - 画面はmetatell本体と同じオリジンで動作します。
localStorageなどのブラウザのストレージはmetatell本体と共有されるため、秘匿情報や個人情報を保存しないでください。
テンプレートは次のように相対パスを使っています。
index.htmlが開かれたパスから画面のルートを求め、<base>に設定する- Viteの
baseを./にしてビルドする - APIを
fetch('./api/...')で呼び出す