CloudflareでセルフホストAIエージェント「Moltworker」を構築した全記録
2026年に入って、AIアシスタントはもう珍しいものではなくなった。ただ、どのサービスも結局はクラウド頼みで、自分のデータがどこにあるのか、どう使われているのか、正直よくわからない。そんなモヤモヤを抱えていたときに見つけたのが、Cloudflareがオープンソースで公開している「Moltworker」だった。
MoltworkerはOpenClaw(昔はMoltbotと呼ばれていた)というパーソナルAIアシスタントを、Mac miniのような専用マシンなしで動かせるようにするプロジェクトだ。Cloudflareのエッジコンピューティング基盤を使うから、自前でサーバーを用意する必要がない。面白そうだと思って実際に構築してみたので、その過程を残しておく。
構築前に揃えておくもの
まず前提として、Moltworkerを動かすにはCloudflare Workersの有料プラン(月5ドル)が必要になる。Cloudflare Sandboxというコンテナ実行環境を使うためだ。あとはAnthropic APIキーも用意しておく。
GitHubからリポジトリをクローンして、依存関係をインストールするところから始めた。
git clone https://github.com/cloudflare/moltworker.git
cd moltworker
npm install
次にWranglerでCloudflareにログインする。ブラウザが開いて認証を求められるのだが、最初の試行ではタイムアウトしてしまった。もう一度やったら通ったので、ネットワークの調子が悪かっただけだろう。こういう一時的なトラブルは気にしても仕方がない。
認証情報はCloudflareのシークレット管理機能で保存する。まずリモートアクセス用のゲートウェイトークンを生成した。
export MOLTBOT_GATEWAY_TOKEN=$(openssl rand -hex 32)
このトークンはControl UIにアクセスするときに使う。後で必要になるから、どこかに控えておかないといけない。
Anthropic APIキーの設定にはwrangler secret putを使う。値は暗号化されてCloudflareに保存される仕組みだ。この時点ではWorkerがまだ存在しないので「新規作成するか」と聞かれるが、Yesで問題ない。
Dockerが入っていなかった
さて、いよいよデプロイだと意気込んだところで、いきなりつまずいた。「The Docker CLI could not be launched」というエラーが出たのだ。
考えてみれば当然で、Moltworkerはコンテナをビルドする必要があるから、ローカルにDockerがないと動かない。確認したら案の定、Docker Desktopが入っていなかった。Homebrewでインストールしようとしたが、sudo権限を要求されてターミナルでパスワードを打つ羽目になった。
brew install --cask docker
インストール後にDocker Desktopを起動して、デーモンが完全に立ち上がるまで待つ。docker infoで動作確認してから次に進んだ。
デプロイ、エラー、また調べる、の繰り返し
Dockerが準備できたので再びデプロイを実行。ところが、ここからが本当の試練だった。
最初に出たエラーは「Please enable R2 through the Cloudflare Dashboard」。R2はCloudflareのオブジェクトストレージで、Moltworkerのデータ保存に使われる。ダッシュボードに行ってR2を有効化した。無料枠があるから、普通に使う分には追加料金はかからない。
R2を有効にして再挑戦すると、今度は「You need a workers.dev subdomain」と言われた。Workers & Pagesのページを開けば自動的に作成されるらしい。ただ、Cloudflareのダッシュボードがリニューアルされていて、「Compute & AI」というセクションの中から「Workers & Pages」を探す必要があった。慣れていないと迷う。
サブドメインができたので再度デプロイ。ビルドは順調に進み、Dockerイメージの構築、Cloudflareレジストリへのプッシュと来たところで、最後の最後に「Unauthorized」。
調べてみると、Containers機能を使うにはWorkers有料プランが必須だった。ダッシュボードの「Containers」ページから月額5ドルのプランに加入して、ようやく先に進めた。
デプロイ成功、でもまだ終わらない
有料プランにアップグレードした後、デプロイはあっさり成功した。コンソールに新しいWorkerのURLが表示される。
https://moltbot-xxxxxxx.workers.dev
でも、これで終わりではなかった。セキュリティとデータ永続化のために、まだ設定が残っている。
Admin UIを保護するためにCloudflare Accessを設定する。Workers & Pagesでデプロイ済みのWorkerを選んで、Settings > Domains & Routesからworkers.devの行を探し、「Enable Cloudflare Access」を選択。Accessの設定にはチームドメインとApplication Audience(AUD)という二つの値が必要で、AUDはAccess設定画面から取得、チームドメインはZero Trustダッシュボードで確認できる。
npx wrangler secret put CF_ACCESS_AUD
npx wrangler secret put CF_ACCESS_TEAM_DOMAIN
コンテナは再起動するとデータが消える可能性があるから、R2ストレージとの連携も重要だ。R2ダッシュボードでAPI Tokenを新規作成し、権限を「Object Read & Write」、対象バケットを「moltbot-data」に限定した。生成されたAccess Key IDとSecret Access Key、それからCloudflareアカウントIDをシークレットとして登録する。
npx wrangler secret put R2_ACCESS_KEY_ID
npx wrangler secret put R2_SECRET_ACCESS_KEY
npx wrangler secret put CF_ACCOUNT_ID
初回アクセスでまたエラー
すべての設定を終えて、いざControl UIにアクセス。URLにゲートウェイトークンをクエリパラメータとして付ける。
https://moltbot-xxxxxxx.workers.dev/?token=<GATEWAY_TOKEN>
開いた瞬間、「Configuration Required」というエラーが出た。ANTHROPIC_API_KEYが認識されていないと言う。シークレットの一覧を見直したら、設定時に変数名と値を逆に入力していたことに気づいた。自分のミスだ。正しく設定し直して再デプロイ。
再度アクセスすると、今度は「Pairing required」と表示された。これはセキュリティ機能で、新しいデバイスからの接続には管理者の承認がいる。Admin UI(/_admin/パス)に行って、Pending Pairing Requestsから自分のデバイスを承認した。
承認してからControl UIに戻ってリロードしたら、ついにチャット画面が現れた。試しに「こんにちは」と送ったら、英語で自己紹介が返ってきた。日本語で返すように指示を出せば、それ以降は日本語で会話できるようになる。
振り返ってみて思うこと
今回の構築で感じたのは、Cloudflareのエコシステムの統合度の高さだ。Workers、R2、Access、Containersといった複数のサービスがシームレスにつながっている。ただ、その分だけ初期設定で有効にしなければならないサービスが多く、一つでも欠けるとデプロイが失敗する。エラーメッセージは親切なほうだと思うが、ダッシュボードの構成に慣れていないと該当の設定画面を見つけるのに手間取る。
シークレット管理も注意が必要だ。wrangler secret putはインタラクティブに値を入力する設計だが、スクリプト化するならパイプで値を渡すこともできる。ただし、変数名と値を取り違えないように気をつけないといけない。実際にやらかした。
あと、Dockerの存在を見落としがちだ。Cloudflare Sandboxはサーバーレスコンテナ環境だが、イメージのビルドはローカルで行われる。開発マシンにDockerが入っているか、事前に確認しておくとスムーズに進む。
月5ドルで手に入る自分専用AI
MoltworkerによるセルフホストAIの構築は、正直言って簡単ではなかった。でも一度セットアップしてしまえば、自分専用のAIアシスタントが常時動く環境が手に入る。データはCloudflareのインフラ上に保管されるし、R2との連携でコンテナが再起動してもセッション情報は維持される。
月額5ドルでエンタープライズグレードのインフラにパーソナルAIを置けるのは、なかなか魅力的だと思う。プライバシーが気になる人や、AIアシスタントを自分好みにいじりたい人には、検討してみる価値があるんじゃないだろうか。
























































