はじめに
今回Macbook上に自分だけのChatGPTライクなAI駆動Chat環境を構築しました。
社内で使われているChat型AIシステムが Open WebUI をベースにしていることを知り、「自分でも同じ仕組みを構築して、稼働検証しながら中身を学びたい」と思ったのがきっかけです。
やってみると、OSSを組み合わせるだけで、ローカルMacに完全オフラインで動くChatGPTライクな環境が驚くほど簡単に作れました(Claude codeを使って)。クラウドにデータを送らず、API課金もなく、UIはほぼChatGPTです。
この記事では、その構築手順と、途中でハマったポイントを共有します。
- 対象読者:ローカルLLMに興味がある人/Open WebUIの仕組みを知りたい人
- 所要時間:30分〜1時間(モデルのダウンロード時間込み)
使ったOSSの紹介
Open WebUI
Open WebUI は、LLM向けのセルフホスト型WebUIです。見た目や操作感はChatGPTそっくりで、チャット履歴、複数モデルの切り替え、RAG(ドキュメント読み込み)、ユーザー管理などを備えています。バックエンドとして Ollama や OpenAI互換API に接続できます。
Ollama
Ollama は、ローカルでLLMを動かすためのランタイムです。ollama pull llama3.2 のようにコマンド一発でモデルを取得でき、localhost:11434 でOpenAI互換に近いAPIを提供します。MacではApple Silicon(Metal)を使って高速に推論できます。
Colima(Docker Desktopの代替)
Colima は、Mac上でDockerを動かすための無料・OSSのコンテナランタイムです。docker / docker compose コマンドがそのまま使え、Docker Desktopのような商用ライセンスの制約がありません。
💡 なぜColima?
Docker Desktopは従業員251人以上または年商1000万ドル以上の企業では有料ライセンスが必要です。社内環境で気軽に検証するなら、ライセンスフリーなColimaが安心です。Docker Desktopをお使いの方は、Colimaのインストール部分を読み替えてください(後述のとおり接続設定は共通です)。
構成図
今回は Ollamaはホスト(Mac)に直接インストールし、Open WebUIだけをコンテナで動かす構成にします。こうするとOllamaがApple SiliconのGPUをフルに使えます。
前提環境
この記事は以下のバージョンで検証しました。
| ソフト | バージョン |
|---|---|
| macOS | Apple Silicon (arm64) |
| Colima | 0.10.3 |
| Docker CLI | 29.6.1(サーバ 29.5.2) |
| Docker Compose | 5.3.0 |
| Ollama | 0.30.11 |
| モデル | llama3.2(3.2B, Q4_K_M) |
Homebrewが入っている前提で進めます。
手順
1. Colima と Docker CLI のインストール
brew install colima docker docker-compose
docker compose(Composeプラグイン)を認識させるため、~/.docker/config.json に以下を追記します。
{
"cliPluginsExtraDirs": [
"/opt/homebrew/lib/docker/cli-plugins"
]
}
2. Colima を起動
colima start --cpu 4 --memory 6
動作確認します。
docker version
docker run --rm hello-world # "Hello from Docker!" が出ればOK
3. Ollama を起動してモデルを取得
ここが最初のハマりどころです。Ollamaはデフォルトで 127.0.0.1(localhostのみ)で待ち受けるため、コンテナ内からは接続できません。全インターフェースで待ち受けるよう OLLAMA_HOST=0.0.0.0 を指定して起動します。
# 既存のOllamaが起動していれば一度止めてから
OLLAMA_HOST=0.0.0.0:11434 ollama serve
別ターミナルでモデルを取得します(llama3.2は約2GB)。
ollama pull llama3.2
ollama list # llama3.2:latest が表示されればOK
💡 常用するなら
launchctl setenv OLLAMA_HOST "0.0.0.0:11434"などで環境変数を永続化しておくと便利です。
4. docker-compose.yml を作成
作業ディレクトリに docker-compose.yml を作ります。
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080" # ホスト3000 → コンテナ8080
environment:
# コンテナからホストのOllamaを指す
- OLLAMA_BASE_URL=http://host.docker.internal:11434
- WEBUI_AUTH=True
extra_hosts:
# ★Colimaで必須:host.docker.internal をホストに解決させる
- "host.docker.internal:host-gateway"
volumes:
- open-webui:/app/backend/data # 履歴・設定を永続化
restart: unless-stopped
volumes:
open-webui:
⚠️ 2つ目のハマりどころ:
host.docker.internal
Docker Desktopではhost.docker.internalが自動で使えますが、Colimaではextra_hostsにhost.docker.internal:host-gatewayを明示しないと解決されません。これを入れると、Colima・Docker Desktopのどちらでも同じ設定で動きます。
5. Open WebUI を起動
docker compose up -d
docker compose ps # STATUS が healthy になればOK
初回はイメージのダウンロードに数分かかります。
Open WebUIのソースコードはGitHubで管理されていて、ビルドされたDockerイメージはGitHub Container Registry(GHCR)に公開されています。そのイメージをDownloadしてコンテナを起動する、という動きが裏で起きています。Dockerの仕組み、本当にすごいと思います![]()
動作検証
ブラウザでアクセス
http://localhost:3000 を開くと、Open WebUIのログイン画面が表示されます。初回は管理者アカウント(メール・パスワード)を作成します。ログイン後、右上のモデル選択に llama3.2 が出ていれば接続成功です。あとはChatGPTと同じように会話するだけ。
コマンドで接続を確認する
UIを開かずとも、コンテナ内からホストのOllamaに到達できるかで接続を検証できます。
# コンテナ内からOllamaのモデルリストAPIを叩く
docker exec open-webui \
curl -s http://host.docker.internal:11434/api/tags
さらに、実際に推論させてみます。
docker exec open-webui curl -s http://host.docker.internal:11434/api/generate \
-d '{"model":"llama3.2","prompt":"日本語で一言、自己紹介して。","stream":false}'
私の環境では次のような応答が返り、コンテナ → ホストOllama → llama3.2 の経路がすべて繋がっていることを確認できました。
{"model":"llama3.2","response":"私は機械のAIであり、人と話し合うためのサポートをします。","done":true, ...}
ハマりどころまとめ
| ハマり | 原因 | 対処 |
|---|---|---|
| コンテナからOllamaに繋がらない | Ollamaが 127.0.0.1 のみで待ち受け |
OLLAMA_HOST=0.0.0.0:11434 で起動 |
host.docker.internal が解決できない |
Colimaは自動対応しない | compose に extra_hosts: host.docker.internal:host-gateway
|
docker compose が見つからない |
Composeプラグインのパス未登録 |
~/.docker/config.json に cliPluginsExtraDirs を追加 |
| Docker Desktopのライセンスが気になる | 商用は有料 | Colimaに置き換え(コマンドは同じ) |
Gemmaで does not support tools エラー |
Gemmaはツール呼び出し非対応なのにネイティブFunction Callingが送られる | Function Callingを Legacy に設定(後述) |
ハマりどころ詳説:does not support tools(Gemma系で発生)
llama3.2 では問題なく動くのに、gemma2:2b などGemma系に切り替えた途端、チャットを送るだけで次のエラーが出て会話できないことがあります。
registry.ollama.ai/library/gemma2:2b does not support tools
原因
このエラーは Open WebUI ではなく Ollama本体が返すエラーです。モデルの対応機能を調べると一目瞭然で、Gemma系は tools(ツール呼び出し/Function Calling)に対応していません。
# capabilities に "tools" があるか確認
curl -s http://localhost:11434/api/show -d '{"model":"gemma2:2b"}' \
| python3 -c "import sys,json; print(json.load(sys.stdin)['capabilities'])"
# → ['completion'] ← toolsが無い
# llama3.2 は ['completion', 'tools'] なので動く
問題は、ユーザーがツールを一切有効にしていなくても、Open WebUI が Web検索やスキルなどの「組み込みツール」をネイティブ方式でOllamaに送ろうとする点です。Function Calling の設定が Legacy 以外(Default / Native)だとこの経路に入り、tools非対応のGemmaで弾かれます。
⚠️ 紛らわしいのが、
Defaultを選んでも内部的には「非-Legacy=ネイティブ扱い」になり、エラーは消えません。唯一Legacyだけがツールを送らない設定です。
対処:Function Calling を「Legacy」にする
Function Calling はクリックするたびに Default → Native → Legacy → Default… と循環します。「Legacy」と表示されるまで切り替えてください。設定場所は用途で選べます。
-
このチャットだけ:右上の Controls(⚙)→ Advanced Params → Function Calling →
Legacy -
モデルの既定にする(常用ならおすすめ):管理者パネル → 設定 → モデル → 対象モデル → Advanced Params → Function Calling →
Legacy -
全体の既定:設定 → 一般 → 詳細パラメータ → Function Calling →
Legacy
llama3.2 のような tools対応モデルは Default のままで問題ありません。ツール機能を使わないGemma系だけ Legacy にすればOKです。
まとめ
- Open WebUI × Ollama で、ローカルMacにChatGPTそっくりの環境が数十分で作れました。
- Ollamaをホスト側に置くことで、Apple SiliconのGPUを活かして快適に動きます。
- Docker Desktopの代わりに Colima を使えば、ライセンスを気にせず無料で構築できます。
- ハマりどころは「Ollamaの待ち受けアドレス」「
host.docker.internalの解決」、そしてモデルによっては「Function CallingをLegacyにする」くらい。いずれも一度分かれば簡単です。
社内システムがOpen WebUIを採用している背景を、自分の手で構築・検証することでかなり具体的に理解できました。RAGやモデル追加など、ここから拡張できる余地も大きいので、次はドキュメント読み込みやマルチモデル切り替えも試してみたいと思います。
参考リンク
- Open WebUI: https://github.com/open-webui/open-webui
- Ollama: https://ollama.com/
- Colima: https://github.com/abiosoft/colima


