セルフホストマシン ↗ 経由で、Cloudflare 上に Cursor Cloud Agents を実行します。デプロイに割り当てられた各 Cursor セッションは、Cloudflare Containers 上の分離されたコンテナで動きます。
Cursor はエージェントループ、推論、計画をホストします。Cloudflare は、コマンド、ファイル編集、リポジトリ操作、その他のツールを、自分で制御するインフラ内で実行します。
次が必要です。
- セルフホストマシンが有効な Cursor Enterprise プラン
- agent スコープを持つ Cursor チームのサービスアカウント API キー
- Containers と R2 を使える Cloudflare Workers Paid アカウント
- Node.js 20 ↗ 以降
- デプロイとローカル開発用の稼働中の Docker ↗ デーモン
チームプールを作るには、シェルで CURSOR_API_KEY を設定します。その後、Cursor Agent CLI でローカルの worker を起動します。
CURSOR_API_KEY="$CURSOR_API_KEY" agent worker --pool cloudflare-test startこのコマンドはプールを登録し、一時的にローカルマシンを worker として接続します。Cursor にプールが表示されたら、Ctrl+C で worker を止め、unset CURSOR_API_KEY を実行します。CURSOR_POOL 用にプール名を控えます。Cloudflare デプロイを試すあいだは、ローカル worker を止めたままにして、エージェントリクエストを奪わないようにします。
詳細は Cursor team pools ↗ を参照してください。
テンプレートは、Worker、Durable Object 名前空間、コンテナアプリケーション、R2 バケットバインディング、cron トリガーをデプロイします。
-
テンプレートをクローンし、依存関係をインストールします。
git clone https://github.com/anysphere/cloudflare-workers.git cd cloudflare-workers npm install -
Cloudflare アカウントにログインします。
npx wrangler login -
任意のリポジトリスナップショット用に R2 バケットを作成します。
npx wrangler r2 bucket create cursor-pool-worker-snapshots別のバケット名を使う場合は、
wrangler.jsoncのbucket_nameを更新します。 -
必要な Cursor のサービスアカウントキーを Worker シークレットとして保存します。
npx wrangler secret put CURSOR_API_KEYagent スコープを持つチームのサービスアカウントキーを入力します。個人用 API キーはプール worker では使えません。
-
プライベートリポジトリにアクセスする場合は、Git の認証情報を Worker シークレットとして保存します。
npx wrangler secret put GIT_USERNAME npx wrangler secret put GIT_TOKENGitHub では、
GIT_USERNAMEをx-access-tokenにします。GIT_TOKENには、エージェントが使うリポジトリへアクセスできるトークンを設定します。 -
wrangler.jsoncで、vars.CURSOR_POOLを Cursor のチームプール名に設定します。{ "vars": { "CURSOR_POOL": "default" } } -
containers[].max_instancesを、デプロイが支える同時リクエストの最大数に設定します。 -
Worker とコンテナをデプロイします。
npx wrangler deployWrangler はイメージをビルドし、Worker、Durable Object、コンテナアプリケーション、cron トリガーをデプロイします。
新しいコンテナイメージのロールアウトは、稼働中のコンテナを停止します。更新をデプロイする前に、進行中の Cursor セッションが終わるのを待ってください。
リポジトリ固定のエージェントは、Git リモートで作業を振り分けます。チームプール名は、追加の振り分け条件になります。
-
Cursor Cloud Agents ↗ を開きます。
-
エージェントを開始し、リポジトリを選びます。
-
Self-hosted を選び、続けて
CURSOR_POOLに設定した名前を選びます。 -
Cursor がセッションをデプロイに割り当てるまで待ちます。その後、Worker がセッション用のコンテナを起動します。最初のスケジュール済みコントローラー実行は、開始まで最大 5 分かかることがあります。
リクエストはリポジトリ URL を渡します。コンテナはそのリポジトリを $HOME/workspaces/repo-0 に復元またはクローンします。その後、Cursor worker を起動します。
agent worker --worker-dir "$HOME/workspaces/repo-0" --pool "$CURSOR_POOL" start --verboseCursor worker は、リポジトリラベルを Git リモートから導出します。repo= ラベルを手動で設定しないでください。
任意リポジトリのエージェントは、チームプール名で作業を振り分けます。空の作業ディレクトリで始まり、Git リモートはありません。
-
Cursor Cloud Agents ↗ を開きます。
-
エージェントを開始し、Any repo グループを選びます。
-
CURSOR_POOLに設定したチームプール名を選びます。
コンテナは Git リモートなしで $HOME/workspaces/repo-0 を作成します。セッション中に、エージェントまたはプロジェクトフックがリポジトリをクローンできます。
リポジトリスナップショットは、リポジトリ固定エージェント向けの任意キャッシュです。スナップショットは、クローン後の作業ツリーを R2 に保存します。任意リポジトリのエージェントはこのキャッシュを使いません。
-
スナップショット用ルートを保護するシークレットを保存します。
npx wrangler secret put SNAPSHOT_AUTH_TOKEN -
wrangler.jsoncで、vars.WORKER_PUBLIC_URLをデプロイした Worker URL に設定します。{ "vars": { "CURSOR_POOL": "default", "WORKER_PUBLIC_URL": "https://cursor-pool-workers.<ACCOUNT_SUBDOMAIN>.workers.dev" } } -
更新した設定をデプロイします。
npx wrangler deploy
キャッシュミス時は通常の Git クローンを行います。エージェントの起動は妨げません。
テンプレートは、割り当てられた Cursor セッションごとに 1 つのコンテナを管理します。
- 一覧: cron トリガーが 5 分ごとに動きます。Worker は
CURSOR_POOLを待っているセッションを一覧します。 - ストリーム: Worker は、次のスケジュール実行まで Cursor の server-sent events ストリームを開いたままにします。
- 割り当て: Worker は、一意の worker ID で待機中のセッションを受け付けます。Cursor はそのセッションを Worker に排他割り当てするため、重複処理を防ぎます。
- 起動: Durable Object が、セッション環境とリポジトリ情報付きでコンテナを 1 つ起動します。
- 停止: 設定したアイドルタイムアウト後にコンテナは終了します。Durable Object は最大実行時間も適用します。
コンテナは Cursor へのアウトバウンド接続を開きます。コンテナにインバウンドポートや公開 IP アドレスは不要です。
Worker が公開するのは、ヘルス用と任意のスナップショット用ルートだけです。エージェントループとセッションのオーケストレーションは Cursor が担います。
コントローラーとコンテナのログをストリームするには、次を実行します。
npx wrangler tailコンテナインスタンスを一覧するには、次を実行します。
npx wrangler containers listローカル開発でスケジュール済みコントローラー実行を 1 回試すには、スケジュールイベントのテスト付きで wrangler を起動します。
npx wrangler dev --test-scheduled別のターミナルで、スケジュール済みルートを呼び出します。
curl "http://localhost:8787/cdn-cgi/local/scheduled?cron=*/5+*+*+*+*"cron 間隔を変える場合は、wrangler.jsonc の triggers.crons と src/config.ts の CONTROLLER_RUN_BUDGET_MS の両方を更新します。
| 症状 | 原因 | 対処 |
|---|---|---|
| セッションが割り当てられない | cron が動かない、キーがない、またはチームプール名が一致しない | npx wrangler tail を実行します。コントローラー実行、401 レスポンス、設定したチームプール名を確認します。 |
コントローラーが 401 を返す |
キーが個人用、または agent スコープがない | CURSOR_API_KEY を、agent スコープを持つチームのサービスアカウントキーに置き換えます。 |
| リポジトリ向けにチームプールが表示されない | worker がリポジトリラベルなしで起動した | Any repo を選ぶか、設定済みの Git リモート付きでリポジトリ固定エージェントを開始します。 |
| セッションは割り当てられるが起動しない | コンテナが起動できない、リポジトリをクローンできない、または認証できない | npx wrangler containers list を実行し、npx wrangler tail を確認します。容量と Git シークレットを確認します。 |
コンテナが Error: Container exited with unexpected exit code: 1 で終了し、それより前のログに cursor-agent CLI not found on PATH がある |
Cloudflare WARP やほかの TLS 検査プロキシが、Docker による Cursor CLI のダウンロードを妨げた可能性があります。ガードのないシェルパイプラインはインストール失敗を隠し、不完全なイメージを作ることがあります。 | npx wrangler tail を実行し、直前のコンテナログを確認します。Cursor CLI がない場合は、WARP を切断し、Docker のビルドキャッシュを消して、もう一度 npx wrangler deploy を実行します。または、組織のルート証明書を信頼するよう Docker を設定します。 |
| 最初のリポジトリ起動が遅い | スナップショットキャッシュが空、または未設定 | WORKER_PUBLIC_URL と SNAPSHOT_AUTH_TOKEN の両方を設定するか、コールドな Git クローンを許容します。 |