ZeroClawをローカルデプロイしていじってみた

📢 この記事は gemini-3.5-flash によって翻訳されました

少し前に OpenClaw が話題になった時、デプロイに Node.js を使うのを見て「ちょっと使いたくないな…」って思ってたんだ。実際、当時は色んな脆弱性が見つかって、その懸念は当たってた。でも今は、優秀なフォーク(派生プロジェクト)がたくさん出ている。僕は軽量さにこだわりたいから、今回は比較的軽い「ZeroClaw」を選んでみたよ。

せっかく自分専用の AI アシスタントを導入するんだから、データはクラウドに送りたくないよね。というわけで、今回の目標は「完全ローカルで動くプライベートアシスタント」を構築すること!

全体像

データを完全にローカルで完結させるために、モデルは Ollama を使ってローカルで動かす。通信には NAS 上に立てた Matrix サーバーを使って、スマホや PC からは Element っていうアプリで接続するよ。Element には Web 版もあるんだけど、なぜか設定エラーが頻発したから、今回は一旦諦めた。

あとは、コンテナを複数起動する設定や、MCP(Model Context Protocol)サーバーの構築にも挑戦してみた。今回はコンテナ環境ってこともあって、ZeroClaw にはフル権限を与えているよ。

ZeroClaw をビルドする

まずは Rust をインストールする。 https://rustup.rs/ にアクセスして rustup-init.exe をダウンロードして実行しよう。選択肢が出てきたら、デフォルトの「1」を選べばOK。途中、Visual Studio と関連コンポーネントのインストールが必要になるよ。

次に、ZeroClaw の公式コードをクローンする。

1
git clone https://github.com/zeroclaw-labs/zeroclaw

それから setup.bat を実行してインストールを開始する。インストールしたいバージョンを聞かれるから、よく分からなければ標準インストール(Standard)を選んでね。

ちなみに、Windows でインストールするときにパス関連の問題があったんだけど、それを修正したのは僕なんだ。記念すべき初 PR(プルリク)だよ(●’◡’●)

あと、公式の環境変数 PATH への書き込み処理にちょっと問題がある。インストールが終わったら、PowerShell を開いて以下のコマンドを実行してね(このくらいの細かいバグは PR 送るの面倒だったからここで解決しちゃう)。

1
2
3
4
5
6
# クリーンな「ユーザー環境変数 PATH」を読み込み、末尾に zeroclaw のパスを追加してレジストリに書き戻す
$currentPath = [Environment]::GetEnvironmentVariable("Path", "User")
if ($currentPath -notlike "*\.zeroclaw\bin*") {
    [Environment]::SetEnvironmentVariable("Path", $currentPath + ";$HOME\.zeroclaw\bin", "User")
    Write-Host "PATHの書き込みに成功したよ!ターミナルを再起動して反映させてね。" -ForegroundColor Green
}

実行が終わったら、一度ターミナルを閉じよう。

ローカルでモデルをデプロイする

パッケージ管理ツールの Scoop をインストールする。PowerShell を開いて、以下のコマンドを実行してね。

1
2
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression

次に、バケット(ソフトウェアリポジトリ)を追加して、ollama をインストールする。

1
2
scoop bucket add extras
scoop install ollama-full

Qwen2.5-coder-7b-instruct-Q4_K_M モデルを起動する(ZeroClaw のインストール後に実行しても大丈夫)。

1
ollama run qwen2.5-coder:7b

success と表示されて、対話モード(プロンプト)に入ったらデプロイ完了。デフォルトでは http://127.0.0.1:11434 で動いているよ。

Matrix のデプロイ

Docker を使って Synapse(Matrix サーバー)をデプロイし、Element から接続できるようにする。

まずは設定ファイルを生成する。

1
2
3
4
5
docker run --rm \
    -v ./data:/data \
    -e SYNAPSE_SERVER_NAME=localhost \
    -e SYNAPSE_REPORT_STATS=no \
    matrixdotorg/synapse:latest generate

次に、data/homeserver.yaml を開いて設定を調整しよう。例えばこんな感じ:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 新規ユーザーの登録を許可する(構築後に自分の管理者アカウントを登録したら、セキュリティのために false に戻して再起動してね)
enable_registration: true

# 認証なしのパブリック登録を受け入れるリスクを承諾する設定(ローカル環境なら安全)
enable_registration_without_verification: true

# エンドツーエンド暗号化(E2EE)を有効にすることを強く推奨。これでデータベースを直接覗かれても暗号化されたままになる
encryption_enabled: true

# 完全なローカルLAN内だけで遊ぶ場合、外部の Matrix サーバーと連携(Federation)する必要はないので、federation のリスナーをオフにするか、デフォルトのままにしておこう

次に docker-compose.yml を作成する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  synapse:
    image: matrixdotorg/synapse:latest
    container_name: matrix-synapse
    restart: unless-stopped
    volumes:
      - ./data:/data
    ports:
      - "8008:8008"
    environment:
      - TZ=Asia/Tokyo

コンテナを立ち上げる。

1
docker compose up -d

Element 公式サイト にアクセスしてクライアントをダウンロードし、自分で立てたサーバーに接続してアカウントを登録したら、会話を始めよう。

Claw 専用のアカウントを一つ作成しよう。設定メニューを全部開いて、「ヘルプと情報」の一番下にある Access Token をメモする。また、「暗号化(Encryption)」からリカバリーキー(recover key)を、「プロフィール(アカウント)」画面からユーザーネーム(これが user-id になるよ)をそれぞれ控えておいてね。

ZeroClaw の設定

対話型の設定インターフェースを起動する。

1
zeroclaw onboard

ここでは自分の環境に合わせて選択していけばOK。重要な部分だけかいつまんで説明するね。

プロバイダーに Ollama を選び、カスタムモデル名を入力する。APIキーは適当で大丈夫(例えば sk-local など)。モデルを選択したら、後はデフォルト設定で進めていけばいい。ただし、sandbox-enabled は有効(true)にすることをおすすめするよ。sandbox-backend には docker を指定してね。

Claw の設定では、interrupt-on-new-message を有効にしておくのがおすすめ。これを入れておくと、新しいメッセージを送信したときに現在のタスクを中断させることができるんだ。

エージェントを起動する。

1
zeroclaw agent --agent <エージェント名>

Matrix を監視するチャンネルを起動する。

1
zeroclaw channel start

Matrix 設定における注意点

どこか設定を間違えたのか分からないんだけど、許可ユーザー用のグループを作成する必要があった。設定ファイルに以下を追加してね。

1
2
3
4
[peer_groups.matrix_{group}]
channel = "matrix.{group}"
agents = ["init"]
external_peers = ["@yexca:yexca-matrix-server"]

もちろん、その他の設定はモジュールごとに対話型インターフェース(CUI/GUI)で調整できるよ。

  • エージェント
1
zeroclaw onboard agents
  • チャンネル
1
zeroclaw onboard channels

ローカル MCP

ローカルの様々なサービスと連携させるために、自分で MCP サーバーを書いてみた。今のところ、画像生成、TTS(音声合成)、プリンターサービスを含めているよ。

そのうち画像生成は、ローカル(ComfyUI 経由)と OpenAI の image2 への接続を用意してみた。他のサービスはまだテストしていないんだ。というのも、どの TTS サービスを導入するかまだ決めていないし、プリンター連携についても「あれば便利だけど、絶対に必要ってわけでもないかな」っていう程度だからね。

詳しくは僕の GitHub リポジトリを見てみてね。

読み込み中...
- -

Docker での複数インスタンス起動

現在の ZeroClaw は、Matrix チャンネルで1つのアカウントしか監視できない仕様になっている。そこで、コンテナを複数起動(多開)することで、異なる複数の Matrix アカウントに対応できるようにしてみた。ついでに、不定期のウェイクアップや複数メッセージ検知といったサービスも組み込んでいる。ただ、公式の Docker イメージはいまだに 0.7.5 で止まっているから(たぶん 0.8.0 が出たら更新されるんだろうね)、このイメージは自分でローカルビルドしたものを使っている。0.7.5 以降は設定ファイルの仕様が大きく変わっているから、今から構築するなら公式の 0.7.5 イメージを使うのはあまりおすすめしないかな。

読み込み中...
- -

アクセス統計

2025-02-08 からのアクセス統計

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。 | yexca によって改修されています。