本記事の内容
WindowsでWSL2 + Ubuntu-24.04(Distro: OpenClaw)で OpenClawの環境を構築し、ローカルのLM Studio(OpenAI互換)をモデルにし、Slack(Socket Mode)で @メンション応答させるまでの手順メモです。OpenClawはセキュリティの観点でいろいろ情報が漏れやすいので、できるだけアクセスや破壊できそうなものを絞りこみ、環境構築を行ってみます。
ゴール
- WSL2 上の独立したディストリで OpenClaw を稼働
- モデルは LM Studio(OpenAI互換
.../v1、openai/gpt-oss-20b ) - Slack から @OpenClaw ping でLLMが応答してくれる
1) OpenClaw 用WSLディストリ作成(Windows PowerShell)
まずはUbuntu-24.04を独立したディストリとしてインストールします。今まで使っているディストリとは分けた仮想環境を作り、情報を漏洩・破壊しないようにしましょう。
# インストール
wsl --install -d Ubuntu-24.04 --name OpenClaw --no-launch
# 起動
wsl -d OpenClaw
初回セットアップ(重要)
ディストリを起動すると、Ubuntuの初期ユーザーが尋ねられます。sudoが使えるユーザーですので、このユーザーは環境セットアップ・管理者用として作成します。
- ユーザー名:
clawadmin - パスワード:任意(sudo用)
2) 最低限パッケージ導入(WSL内:clawadmin)
clawadminユーザーで最低限のパッケージをインストールします。
sudo apt-get update
sudo apt-get install -y curl ca-certificates unzip xz-utils git jq ripgrep
3) 実行ユーザー openclaw を作成(WSL内:clawadmin)
次にsudoの権限のない、OpenClawを起動するユーザーを作成していきます。
sudo adduser --disabled-password --gecos "" openclaw
sudo gpasswd -d openclaw sudo 2>/dev/null || true
openclawユーザーでディストリ内に入ります
wsl -d OpenClaw -u openclaw
4) Node/npm を openclaw のユーザー配下に導入(WSL内:openclaw)
OpenClaw は npmでインストールします。Node が必要です。fnmをインストールしておきましょう。openclawユーザーのパスにも設定しておきます。
curl -fsSL https://fnm.vercel.app/install | bash
echo 'export PATH="$HOME/.local/share/fnm:$PATH"' >> ~/.bashrc
echo 'eval "$(fnm env --use-on-cd)"' >> ~/.bashrc
# login shell でも .bashrc を読む(wsl起動方式差でPATHがズレる対策)
printf '\nif [ -f ~/.bashrc ]; then . ~/.bashrc; fi\n' >> ~/.profile
source ~/.profile
fnm install 22.12.0
fnm default 22.12.0
node -v
npm -v
npm global を openclaw 配下へ固定:
mkdir -p ~/.npm-global
npm config set prefix "$HOME/.npm-global"
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
npm prefix -g
5) Python/uv を openclaw のユーザー配下に導入(WSL内:openclaw)
あわせて、Python/uv 環境もスキルで良く利用されるのでインストールしておきます。
curl -LsSf https://astral.sh/uv/install.sh | sh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
uv --version
uv python install 3.12
6) OpenClaw 本体をインストール(WSL内:openclaw)
それではOpenClaw本体をインストールします。
npm install -g openclaw@latest
openclaw --version
7) LM Studio 側の準備(Windows)
LLMはWindowsにインストールしているLM Studioを使います。LM Studio の OpenAIのAPI互換サーバを /v1 で待受けさせます。WSL側からLLMがアクセスできるかを確認しておきます。
WSL側で疎通確認(例):
curl -s "http://<LMSTUDIO_HOST_IP>:1234/v1/models" | jq ".data[0:5]"
例:http://192.168.11.10:1234/v1/models が返っていればOK。
8) Slack App 設定
次はSlackの設定をしておきます。Slackの設定は少し面倒くさいのですが、1. App Tokenの取得 と 2.Bot Tokenの取得 のが目標になります。Slackのいいところは課金がかなり緩く無料枠の大きいところ、あとメッセージの受信通知を受ける際に公開サーバーを用意する必要がないことですかね。
ただ、設定画面がわかりにくいので、ちょっと頑張りましょう。
8-1) Slack に専用チャンネルを作る(例:#claw)
bot の誤爆を避けたいので、専用チャンネルを1個作ってそこだけ許可が安全です。
Slack で「チャンネルを追加」→ 新しいチャンネルをしてください。
名前:claw(例)
公開/非公開:最初は **公開(Public)**が楽(非公開でも可。その場合は後で message.groups を購読するなどが必要になりがち)
8-2) Slack App を作る(管理画面)
Slack アプリ管理画面(Apps)で Create New App → From scratch
App Name:OpenClaw(任意)
対象 Workspace を選択して作成します。
8-3) Socket Mode を有効化する(公開Webhook不要)
Socket Mode を使うと、Slack が WebSocket 経由でイベントを送ってくれるので、サーバーを立てて外部に公開URLを生やさずに済みます。
左メニュー Socket Mode → Enable Socket Mode: ON
8-4) App Token(xapp-…)を発行する
まずは一つ目のトークンです。Socket Mode には App-Level Token(xapp) が必要です。
左メニュー Basic Information
下へスクロールして App-Level Tokens
Generate Token and Scopes
Token Name:socket など任意
Scope:connections:write
Generate → xapp-... をコピーして保管
8-5) Bot Token(xoxb-…)を発行する(Scopes → Install)
Bot Token は アプリを Workspace にインストールすると発行されます(OAuth の流れ)。
8-5-1) Bot Token Scopes を追加
左メニュー OAuth & Permissions → Scopes → Bot Token Scopes で追加。
最小セット(メンションに反応して返信するだけ):
- chat:write(返信する)
- app_mentions:read(メンションイベントを受け取る)
チャンネル内の会話も読ませたいなら追加:
- channels:history(パブリックチャンネルの履歴)
DM も見たいなら追加:
- im:history(DMの履歴)
8-5-2) Install to Workspace(ここで xoxb トークン生成)
同じ OAuth & Permissions ページ上部付近の
Install to Workspace(または Reinstall)を押して許可。
インストール後、同ページに Bot User OAuth Token(xoxb-...) が表示されます。 これをコピー。
重要:Scopes を追加した後は、必ず Reinstall しないとトークン側に権限が反映されません(多くの人がここで詰まります)。
8-6) Event Subscriptions を設定
Socket Modeでも Events API を有効化して購読イベントを登録しないと、チャンネル投稿が届きません。
左メニュー Event Subscriptions
Enable Events: ON
Subscribe to bot events を開く
Add Bot User Event で追加
メンション応答だけなら最低限これ:
- app_mention
チャンネル内の通常投稿も拾いたいなら:
- message.channels
非公開チャンネルなら:
- message.groups
DMなら:
- message.im
追加したら Save Changes。保存後に「Reinstall required」など出たら、そのまま Reinstall(権限反映のため)を実行。
8-7) bot を #claw に招待
Slack の #claw で:
/invite @OpenClaw(あなたの bot 名)
招待されてないと「読めない/反応しない」になることがあります。
8-8) チャンネルID(C…)を確認する
OpenClaw の allowlist は チャンネルID指定が最も確実です。
方法A:ブラウザURLから拾う(公式)
Slack をブラウザで開いたとき URL が https://app.slack.com/client/TXXXXXXX/CXXXXXXX の形式になり、 末尾の C... がチャンネルID です。
方法B:archivesリンクから拾う
チャンネルのリンクは .../archives/ 形式になります( が C…)。(実務でよく使われるやり方です)
- 最終的に手元に揃うもの(OpenClaw に入れる値)
App Token:xapp-...(Socket Mode用)
Bot Token:xoxb-...(投稿/読み取り用)
Channel ID:C...(allowlist用)
かなり面倒でしたが、ここでできた2つのトークンをしっかりメモっておきましょう!
9) openclaw onbardで初回設定
それではOpenClawに必要な情報がそろったところで、初期設定を進めましょう。
それではディストリビューションに入ります。
> wsl -d OpenClaw -u openclaw
onboardで初期設定を行います。
> opencode onboard
下記のように回答していきます。
9-1) QuickStart vs Advanced
QuickStart(defaults) でOK
既定で「ローカルGateway」「ポート18789」「loopback」「Token認証(ローカルでも生成)」「Tailscale露出Off」になります。
9-2) Model/Auth
ここはLM Studioを使うのでいったんSkipします。
9-3) Workspace(作業ディレクトリ)
そのままでいいです。
9-4) Gateway(ポート/バインド/認証)
安全寄りの答えはこれ:
- Port:18789 のまま
- Bind:loopback(127.0.0.1)
- Auth:Token を有効のまま(ローカルでもトークン推奨)
- Tailscale exposure:いったん Off(必要になったら後で)
9-5) Channels(Slack など)
ここは SlackだけやればOK。
Slack を選びます。Socket Mode で作った
- App Token:xapp-...(scope connections:write)
- Bot Token:xoxb-...
9-6) Daemon install
まずは検証だけなら:No(手動で起動
いったん、これまでで半自動で設定ファイルができました。
10) LM Studioの設定
ここまで来ると、設定ファイル:~/.openclaw/openclaw.jsonができています。最後にこれを微修正します。
重要:構造
-
models.providersは トップレベル -
agents.defaults.model.primaryで default モデル指定 - Slack allowlist は チャンネルID(C...)指定が確実
テンプレ(トークンは必ず自分の値に置換、外部に貼らない):
{
agents: {
defaults: {
workspace: "/home/openclaw/.openclaw/workspace",
model: { primary: "lmstudio/openai/gpt-oss-20b" }
}
},
models: {
providers: {
lmstudio: {
baseUrl: "http://<LMSTUDIO_HOST_IP>:1234/v1",
apiKey: "LMSTUDIO", // LM Studio側で認証ONなら一致 / OFFならダミー可
api: "openai-completions",
models: [
{
id: "openai/gpt-oss-20b",
name: "LM Studio GPT-OSS 20B",
contextWindow: 131072,
maxTokens: 4096 // 最初は4096推奨(必要なら増やす)
}
]
}
}
},
gateway: {
mode: "local",
auth: { mode: "token", token: "<GATEWAY_TOKEN>" },
port: 18789,
bind: "loopback"
},
channels: {
slack: {
enabled: true,
botToken: "xoxb-...",
appToken: "xapp-...",
groupPolicy: "allowlist",
channels: {
"<SLACK_CHANNEL_ID>": { allow: true } // 例: C0123ABCDE (#claw)
}
}
}
}
JSON妥当性チェック:
jq . ~/.openclaw/openclaw.json > /dev/null && echo OK
※トークン漏えい防止:
chmod 600 ~/.openclaw/openclaw.jsonchmod 700 ~/.openclaw
10) 起動(systemdなし:foreground運用)
2とおりの起動がありますが、チャット画面を出す場合はdashboardで起動します。
A) Dashboard を出す(別タブ)
wsl -d OpenClaw -u openclaw -- bash -lc 'openclaw dashboard --no-open'
このコマンドで表示された URL(#token=... 付き)をブラウザで開けばチャット画面が見えるはずです。
B) Gatewayを foreground で起動(ターミナル保持)
Webのチャット画面が要らない場合はこちら。
wsl -d OpenClaw -u openclaw -- bash -lc 'openclaw gateway run'
11) 動作確認
次のようなコマンドがあります。
WSL内(openclaw):
openclaw status --deep
openclaw channels status --probe
openclaw models status --probe
まとめ
このあたりはChatGPTなどと相談しながら進めましょう。
あとは/mnt/c/を外してしまえば、環境を限定し、何かを壊してしまうというのをだいぶ避けられるのかなと思います。お疲れさまでした。