0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

vLLM + LiteLLM を本線に、セルフホストAIワークスペースをワンコマンドで立てる手順(Ollama は最短ルート)

0
Last updated at Posted at 2026-09-05

手元の環境に、チャットだけでなくエージェントタスクや MCP ツールまで含んだ AI ワークスペースを立てる手順です。本線の構成は 自分で運用する vLLM を LiteLLM の後ろに置く 形で、既定のローカルモデルは vLLM 経由の qwen3.8-27b(コンテキスト 262K)です。GPU がまだ用意できない場合の最短ルートとして Ollama も使えるので、その両方を書きます。

対象は OpenMake LLM(MIT)です。私が開発しているものなので、その前提で読んでください。以下の記述は README と公開している変更履歴に載っている内容だけで構成しています。

構成の考え方

アプリから見えるモデルの口は常に一つ、OpenAI 互換のエンドポイントです。その先に何を置くかで役割が変わります。

置くもの 位置づけ 使いどころ
vLLM + LiteLLM 本線。既定のローカルモデルを供給する 自分の GPU で常用する。埋め込みや画像モデルも同居させられる
Ollama 外部プロバイダーの一つ。インストーラーの選択肢 1 でもある GPU 機がまだない、まず動かしてみたい
OpenRouter / NVIDIA NIM など 外部プロバイダー(自分の鍵を登録) 特定の役割だけ大きいモデルに投げたい

外部プロバイダーは自分の鍵を登録したときだけ経路に乗ります。鍵は AES-256-GCM で暗号化して保管されます。何も登録しなければ、モデル呼び出しはローカルで完結します。

動作確認環境

項目
OS Linux / macOS(Intel・Apple Silicon)。Windows は WSL2(Ubuntu)
Node.js 24
データベース PostgreSQL、Redis(どちらも Docker コンテナ)
プロセス管理 PM2
既定ポート API 52416、Web 3000
推論 vLLM + LiteLLM(本線)。筆者の環境は NVIDIA DGX Spark GB10、埋め込みは BGE-m3、画像生成は FLUX

Node、Docker、PM2 はインストーラーが確認し、足りなければ可能な範囲で sudo なしに入れます。

1. インストール

リポジトリを clone しなくても構いません。リポジトリ外で実行されたことを検出すると、~/openmake_llm にソースを取得してそこで自分自身を実行し直します。

curl -fsSL https://raw.githubusercontent.com/openmake/openmake_llm/main/install.sh | bash

取得先を変えたい場合は OMK_HOME=...、ブランチやタグを指定したい場合は OMK_REF=... を使います。従来どおりの手順でも動きます。

git clone https://github.com/openmake/openmake_llm.git
cd openmake_llm
./install.sh

パイプ経由で実行しても /dev/tty から対話的に質問されます。CI のように端末がない環境では自動承認されます。

インストーラーがやることは次のとおりです。ツールチェーンの確認、ランダムなシークレット付きの .env 生成、依存関係のインストール、PostgreSQL と Redis の起動、マイグレーション適用、両アプリのビルド、PM2 での起動、/health の待ち受け。最後に Web の URL と生成された管理者パスワードを表示します。

2. 本線: vLLM + LiteLLM を指す

GPU 機で vLLM を立て、その前段に LiteLLM を置きます。アプリ側から見えるのは LiteLLM のエンドポイント一つです。筆者の環境では Mac mini がアプリを、DGX Spark が推論だけを担当し、2台を Tailscale でつないでいます。

./install.sh --yes \
  --llm-base-url http://<litellm-host>:4000/v1 \
  --llm-api-key  <litellm-key> \
  --llm-model    <served-model-name>

vLLM を使うときの注意点を三つ挙げます。いずれも公開している変更履歴に載っている実際の修正です。

  • 画像枚数の上限(1.40.0)。 リクエストあたりのプロンプト画像枚数を、vLLM 側の --limit-mm-per-prompt の上限である 8 に合わせました。片側にだけ書かれた上限は、超過時にスタックの奥で分かりにくいエラーになります。
  • モデル名の固定(1.38.0)。 DGX 側でモデルを差し替えた際、モデル一覧の出どころが静的なカタログ 1 行しかなかったため、アプリが古い名前に張り付いたままになりました。現在は起動時と定期プローブで LiteLLM の /model/info を読み、静的な一覧はフォールバックとしてのみ残しています。
  • コンテキスト溢れ。 262K でも溢れます。入口でトークン数を見積もり(画像も含む)、入力を切り詰め、次に max_tokens を下げ、それでも収まらなければ監査記録と自動アラート付きで HTTP 413 を返します。溢れを隠さずに扱う設計です。

外部モデルを並列に使う場合の実測も残しています。ディスカッションとディープリサーチを外部モデルで走らせたところ、5 並列の呼び出しが B.AI 無料キーで 5/5、hasa キーで 3/5 が 429 になりました(1.40.0)。現在はプロバイダー単位のセマフォと Retry-After を尊重する指数バックオフが入っています。

3. 最短ルート: Ollama を指す

GPU 機がまだない場合や、とりあえず動かしてみたい場合はこちらです。インストーラーの選択肢 1 がこれで、Ollama は OpenAI 互換のエンドポイントを持つのでベース URL を向けるだけです。API キーは不要なので任意の文字列で構いません。

ollama serve
ollama pull qwen3:8b

./install.sh --yes \
  --llm-base-url http://127.0.0.1:11434/v1 \
  --llm-api-key  ollama \
  --llm-model    qwen3:8b

Ollama は位置づけとしては外部プロバイダーの一つです。後から vLLM に本線を移しても、アプリ側は .env のエンドポイントを差し替えるだけで済みます。

外部プロバイダーを最初から指定する場合はこの形です。

./install.sh --yes \
  --llm-base-url https://openrouter.ai/api/v1 \
  --llm-api-key  sk-or-... \
  --llm-model    qwen/qwen3-235b-a22b

4. ポートがぶつかるとき

すでに 5432 や 6379 を使っている場合は、コンテナ側をずらします。指定した値は .env に入り、サービス管理スクリプトもそれを読み直します。

./install.sh --yes --postgres-port 55432 --redis-port 56379

5. 再実行と部分実行

./install.sh の再実行は安全です。上書きではなく修復として動きます。よく使うフラグを挙げます。

  • --skip-docker: PostgreSQL と Redis を自分で管理している場合
  • --skip-build: ビルドを飛ばす
  • --no-start: 起動しない
  • --force-env: .env を作り直す

一覧は ./install.sh --help にあります。

6. macOS の場合

Docker Desktop、OrbStack、Colima のいずれでも動きます。GUI が要らなければ Colima が軽いです。

brew install colima docker docker-compose
colima start

Homebrew の compose プラグインが docker CLI に登録されていない場合は、インストーラーが ~/.docker/config.jsoncliPluginsExtraDirs を追記します。

7. 起動後の確認

サービス管理は openmake_llm.sh に集約されています。

./openmake_llm.sh status
./openmake_llm.sh health
./openmake_llm.sh logs

Web UI を開くと、UI 表示言語は Accept-Language から自動判定されます。日本語は最初から入っていて、設定から明示的に切り替えることもできます。回答の言語は質問した言語に独立して追従します。

日本語UIのチャット画面。下部に既定モデル qwen3.8-27b とツールの状態が出る

立てたあとに使えるもの

チャット以外に次のものが動きます。手順とは直接関係ありませんが、何のために立てるのかがはっきりするので挙げておきます。

  • エージェントタスク。永続的な Docker サンドボックス(シェル・Python・ブラウザ・ファイル)で複数ターン実行し、危険な手順は人の承認を待ちます。実行ごとにターン数、経過時間、トークンコストが出ます。目標を達成できなかった場合は完了扱いにせず [GOAL_INCOMPLETE] マーカーと目標判定を返します。
  • ディープリサーチ。分解、取得、検証、引用付きの統合まで行います。
  • MCP ツール。内蔵 22 個に加えて外部 MCP サーバーを追加でき、それぞれ別コンテナで --cap-drop ALL、非 root、メモリ上限、ネットワークポリシー付きで動きます。
  • ロール別のモデル振り分け。agentjudgeresearchspawnreviewsummary に別々のモデルを割り当てられます。失敗時はローカル既定にフォールバックします。

制約

  • デスクトップアプリは現時点で macOS / Apple Silicon のみです。Web UI はどこでも動きます。
  • Kubernetes 向けの構成は用意していません。単一ホスト前提の設計です。
  • ホスト版デモのゲストは既定のローカルモデルのみ利用できます。
  • 構築にかかる時間は、ほぼモデルのエンドポイントを用意する時間です。

参照

手順で詰まった箇所があればコメントで教えてください。ドキュメント側を直します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?