Skip to content

philtzjp/opencodex

 
 

Repository files navigation

OpenClaw on Cloudflare Workers

OpenClaw パーソナルAIアシスタントを Cloudflare Sandbox コンテナで実行します。

実験的プロジェクト: これは概念実証(PoC)です。公式サポートはなく、予告なく動作しなくなる可能性があります。

必要なもの

アーキテクチャ

ブラウザ
   │
   ▼
┌─────────────────────────────────────┐
│     Cloudflare Worker (Hono)        │
│  - サンドボックスでOpenClawを起動     │
│  - HTTP/WebSocketリクエストをプロキシ  │
│  - OAuthトークンを管理               │
│  - シークレットを環境変数として渡す     │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│     Cloudflare Sandbox コンテナ      │
│  ┌───────────────────────────────┐  │
│  │     OpenClaw Gateway          │  │
│  │  - Control UI(ポート18789)    │  │
│  │  - WebSocket RPCプロトコル      │  │
│  │  - エージェントランタイム        │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

クイックスタート

1. クローンとインストール

git clone https://github.com/cloudflare/moltworker.git
cd moltworker
npm install

2. AIプロバイダーの設定

いずれか1つを選択:

# 選択肢A: Anthropic APIキー
npx wrangler secret put ANTHROPIC_API_KEY

# 選択肢B: OpenAI APIキー
npx wrangler secret put OPENAI_API_KEY

# 選択肢C: Codex OAuth(ChatGPTサブスクリプション、APIキー不要)
npx wrangler secret put CODEX_OAUTH_ENABLED
# 入力: true
# デプロイ後にAdmin UIから接続(下記「Codex OAuth」セクション参照)

# 選択肢D: Cloudflare AI Gateway(下記「AI Gateway」セクション参照)

3. ゲートウェイトークンの設定

export MOLTBOT_GATEWAY_TOKEN=$(openssl rand -hex 32)
echo "ゲートウェイトークン: $MOLTBOT_GATEWAY_TOKEN"
echo "$MOLTBOT_GATEWAY_TOKEN" | npx wrangler secret put MOLTBOT_GATEWAY_TOKEN

4. デプロイ

npm run deploy

5. アクセス

Control UIを開く:

https://your-worker.workers.dev/?token=YOUR_GATEWAY_TOKEN

初回リクエストはコンテナ起動のため1〜2分かかります。

重要: Control UIを使用する前に、Cloudflare Accessの設定と、/_admin/ でのデバイスペアリングが必要です。

Cloudflare Workers へのデプロイ

前提条件

  1. Workers Paid プランの Cloudflare アカウント
  2. Wrangler CLInpm install -g wrangler
  3. ダッシュボードで Cloudflare Containers を有効化

デプロイ手順

# Cloudflareに認証(初回のみ)
npx wrangler login

# 必須シークレットを設定
npx wrangler secret put ANTHROPIC_API_KEY          # または選択したAIプロバイダー
npx wrangler secret put MOLTBOT_GATEWAY_TOKEN      # Control UIのアクセストークン
npx wrangler secret put CF_ACCESS_TEAM_DOMAIN      # 例: myteam.cloudflareaccess.com
npx wrangler secret put CF_ACCESS_AUD              # Application Audience タグ

# ビルドしてデプロイ
npm run deploy

更新

git pull
npm install
npm run deploy

設定変更が反映されない場合は、Dockerfile のキャッシュバストコメントを更新してリデプロイしてください。

コンテナコスト

standard-1 インスタンス(1/2 vCPU、4 GiB メモリ)で24時間稼働した場合の概算月額:

リソース 概算コスト
メモリ(4 GiB、24時間) ~$26/月
CPU(利用率約10%) ~$2/月
ディスク(8 GB) ~$1.50/月
Workers Paid プラン $5/月
合計 ~$34.50/月

コストを削減するには、SANDBOX_SLEEP_AFTER(例: 10m)を設定してアイドル時にコンテナをスリープさせます。1日4時間稼働なら合計約$10〜11/月になります。

Codex OAuth(ChatGPTサブスクリプション)

ChatGPT Plus/Pro/Team サブスクリプションを使って、APIキーなしでOpenClawを動かせます。PKCE(S256)によるCodex OAuthフローを使用します。

セットアップ

npx wrangler secret put CODEX_OAUTH_ENABLED
# 入力: true

npm run deploy

接続手順

  1. Admin UIを開く:https://your-worker.workers.dev/_admin/
  2. OpenAI Provider (Codex OAuth) セクションで Connect OpenAI (Codex) をクリック
  3. 認証リンクをクリックしてブラウザでOpenAIのログインページを開く
  4. ログインしてアプリケーションを承認
  5. localhost のURLにリダイレクトされる(ページは読み込まれません — これは正常です)
  6. ブラウザのアドレスバーからURL全体をコピー
  7. Admin UIのテキストフィールドに貼り付けて Complete Connection をクリック

ゲートウェイが新しい認証情報で自動的に再起動します。

仕組み

  • OAuthアクセストークンはコンテナに OPENAI_API_KEY として渡される
  • トークンは有効期限の5分前に自動リフレッシュ(リフレッシュ中はゲートウェイが一時的に再起動)
  • トークンはコンテナのファイルシステムに保存され、R2が設定されている場合はバックアップされる
  • 静的な OPENAI_API_KEY シークレットが設定されている場合、そちらがOAuthより優先される

管理

Admin UIから以下の操作が可能:

  • Refresh Token — アクセストークンを手動リフレッシュ
  • Disconnect — OAuth認証情報を削除してゲートウェイを再起動

カスタムクライアントID

デフォルトのCodex CLIクライアントの代わりにカスタムOAuthクライアントIDを使用する場合:

npx wrangler secret put OPENAI_OAUTH_CLIENT_ID

Cloudflare Access の設定

Cloudflare Access は管理UI(/_admin/)、APIルート(/api/*)、デバッグエンドポイント(/debug/*)を保護します。

1. workers.dev で Access を有効化

  1. Workers & Pages ダッシュボードにアクセス
  2. Workerを選択
  3. Settings > Domains & Routesworkers.dev の行の ... をクリック
  4. Enable Cloudflare Access をクリック
  5. Zero Trust > Access > Applications でアクセスを許可するユーザーを設定(メール、Google、GitHub等)
  6. Application Audience (AUD) タグをコピー

2. シークレットを設定

npx wrangler secret put CF_ACCESS_TEAM_DOMAIN
# 入力: myteam.cloudflareaccess.com

npx wrangler secret put CF_ACCESS_AUD
# 入力: Application Audience タグ

3. リデプロイ

npm run deploy

デバイスペアリング

新しいデバイスがゲートウェイに接続する際、Admin UIでの承認が必要です:

  1. デバイスがゲートウェイに接続
  2. 承認されるまで接続は保留
  3. 管理者が /_admin/ でデバイスを承認
  4. デバイスがペアリングされ、自由に接続可能に

有効なゲートウェイトークンがあっても、新しいデバイスには明示的な承認が必要です。

ローカル開発では .dev.varsDEV_MODE=true を設定することで、Access認証とデバイスペアリングの両方をスキップできます。

永続ストレージ(R2)

デフォルトではコンテナ再起動時にデータは失われます。R2を有効にして永続化:

npx wrangler secret put R2_ACCESS_KEY_ID       # R2 APIトークンから取得
npx wrangler secret put R2_SECRET_ACCESS_KEY   # R2 APIトークンから取得
npx wrangler secret put CF_ACCOUNT_ID          # CloudflareアカウントID

R2 APIトークンは R2 > Overview > Manage R2 API Tokens で作成し、moltbot-data バケットに対して Object Read & Write 権限を付与してください。

データは5分ごとにR2に同期され、コンテナ起動時に復元されます。Admin UIから手動バックアップも実行できます。

Cloudflare AI Gateway

Cloudflare AI Gateway 経由でAIリクエストをルーティングし、分析・キャッシュ・レート制限を利用:

npx wrangler secret put CLOUDFLARE_AI_GATEWAY_API_KEY   # プロバイダーのAPIキー
npx wrangler secret put CF_AI_GATEWAY_ACCOUNT_ID        # CloudflareアカウントID
npx wrangler secret put CF_AI_GATEWAY_GATEWAY_ID        # ゲートウェイID

デフォルトモデルを変更するには CF_AI_GATEWAY_MODEL(形式: provider/model-id)を設定:

npx wrangler secret put CF_AI_GATEWAY_MODEL
# 入力: workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast

チャットチャンネル

# Telegram
npx wrangler secret put TELEGRAM_BOT_TOKEN

# Discord
npx wrangler secret put DISCORD_BOT_TOKEN

# Slack
npx wrangler secret put SLACK_BOT_TOKEN
npx wrangler secret put SLACK_APP_TOKEN

ブラウザ自動化(CDP)

Chrome DevTools Protocol によるブラウザ自動化を有効にする:

npx wrangler secret put CDP_SECRET        # 認証用の共有シークレット
npx wrangler secret put WORKER_URL        # https://your-worker.workers.dev
npm run deploy

エンドポイント: /cdp/json/version/cdp/json/list/cdp/json/new/cdp/devtools/browser/{id}(WebSocket)。すべて ?secret=<CDP_SECRET> が必要です。

ローカル開発

cp .dev.vars.example .dev.vars
# .dev.vars にAPIキーと DEV_MODE=true を設定

npm run start    # wrangler dev(ローカルWorker)
npm run dev      # Vite開発サーバー(クライアントのみ)
npm test         # テスト実行

注意: wrangler dev ではWebSocketプロキシに制限があります。完全な機能を利用するにはCloudflareにデプロイしてください。

シークレット一覧

シークレット 必須 説明
MOLTBOT_GATEWAY_TOKEN はい ゲートウェイアクセストークン(?token= で渡す)
CF_ACCESS_TEAM_DOMAIN はい* Cloudflare Access チームドメイン
CF_ACCESS_AUD はい* Cloudflare Access アプリケーションオーディエンス
ANTHROPIC_API_KEY はい** Anthropic APIキー
OPENAI_API_KEY はい** OpenAI APIキー
CODEX_OAUTH_ENABLED はい** true でCodex OAuthを有効化
OPENAI_OAUTH_CLIENT_ID いいえ カスタムOAuthクライアントID(デフォルト: Codex CLI)
CLOUDFLARE_AI_GATEWAY_API_KEY はい** AI GatewayプロバイダーAPIキー
CF_AI_GATEWAY_ACCOUNT_ID はい** AI Gateway用CloudflareアカウントID
CF_AI_GATEWAY_GATEWAY_ID はい** AI Gateway ID
CF_AI_GATEWAY_MODEL いいえ モデル変更: provider/model-id
ANTHROPIC_BASE_URL いいえ カスタムAnthropic APIベースURL
R2_ACCESS_KEY_ID いいえ 永続化用R2アクセスキー
R2_SECRET_ACCESS_KEY いいえ 永続化用R2シークレットキー
CF_ACCOUNT_ID いいえ CloudflareアカウントID(R2用)
SANDBOX_SLEEP_AFTER いいえ コンテナスリープタイムアウト: never または 10m1h
TELEGRAM_BOT_TOKEN いいえ Telegramボットトークン
DISCORD_BOT_TOKEN いいえ Discordボットトークン
SLACK_BOT_TOKEN いいえ Slackボットトークン
SLACK_APP_TOKEN いいえ Slackアプリトークン
CDP_SECRET いいえ CDP認証用共有シークレット
WORKER_URL いいえ WorkerのパブリックURL(CDP用)
DEV_MODE いいえ 認証+デバイスペアリングをスキップ(ローカル開発用)
DEBUG_ROUTES いいえ /debug/* ルートを有効化

*DEV_MODE=true の場合は不要 **AIプロバイダー設定は少なくとも1つ必要

トラブルシューティング

  • 初回リクエストが遅い — コールドスタートに1〜2分かかります。SANDBOX_SLEEP_AFTER=never でコンテナを常時稼働にできます。
  • ゲートウェイが起動しないnpx wrangler secret list でシークレットを確認、npx wrangler tail でログを確認。
  • 管理ルートでアクセス拒否CF_ACCESS_TEAM_DOMAINCF_ACCESS_AUD が正しく設定されているか確認。
  • R2がマウントされない — 3つのR2シークレットがすべて設定されているか確認。R2は本番環境でのみ動作し、wrangler dev では使えません。
  • Codex OAuthのリダイレクトが失敗する — localhostのリダイレクトURLはブラウザで読み込まれません。これは正常です — URLをコピーしてAdmin UIに貼り付けてください。
  • ローカルでWebSocketの問題wrangler dev にはWebSocketの制限があります。完全な機能を利用するにはCloudflareにデプロイしてください。
  • Windows: exit code 126 — GitがシェルスクリプトをCRLFで改行している可能性があります。git config --global core.autocrlf input を設定してください。

リンク

About

CloudflareのMoltworkerをCodex OAuthで動くようにするForkです。

Resources

License

Contributing

Stars

Watchers

Forks

Contributors

Languages

  • TypeScript 73.6%
  • Shell 13.9%
  • JavaScript 4.3%
  • HTML 3.5%
  • CSS 3.3%
  • HCL 0.9%
  • Dockerfile 0.5%