Linuxサーバー

Ollama と Open WebUI でサーバーにローカル LLM を構築:CPU でのスペック選定、導入、HTTPS 化、API 連携

7 ステップ 12 分で読めます 44 回閲覧 0
目次

GPU がなくても、自分のサーバーで ChatGPT のようなプライベートなアシスタントを動かせます。Ollama は Qwen、Llama、Gemma などのオープンウェイトの言語モデルをダウンロードしてシンプルな API で実行でき、Open WebUI はユーザー管理、履歴、ドキュメントのアップロードに対応したチャット画面を追加します。すべてがサーバー上で動作するため、プロンプトやドキュメントが外部に出ることはありません。この記事では、サーバースペックの選び方、Ollama のインストール、CPU で快適に動くモデルの選択、Open WebUI の HTTPS 化、自社アプリケーションからの API 利用について解説します。

Ollama の API には認証機能がありません。ポート 11434 は決してインターネットに公開せず、localhost またはファイアウォールの内側に置き、Open WebUI だけをアカウント認証付きの HTTPS で公開してください。公開状態の Ollama サーバーは盛んにスキャンされ、悪用されています。

ステップ1:適切なサーバースペックを選ぶ

CPU で動かす場合、読み込めるモデルはメモリ容量で決まり、応答の速さはコアの数と速度で決まります。量子化モデル(Ollama の既定である Q4 ビルド)に必要なメモリの目安は次のとおりです。

モデルサイズモデルに必要なメモリ推奨サーバー主な用途
1–4B パラメーター約 1–3 GB4 コア、8 GB メモリ分類、短い回答、テスト
7–8B パラメーター約 5–6 GB8 コア以上、16 GB メモリチャットアシスタント、要約、社内ナレッジベース
14B パラメーター約 9–10 GB16 コア以上、32 GB メモリ推論力と文章力が向上、CPU では低速

最新のマルチコア CPU では、7–8B モデルの生成速度は 1 秒あたり数語程度と考えてください。小規模なチームやバックグラウンド処理には十分ですが、数百人が同時に使うには遅すぎます。利用量が多い場合は、小さな VPS ではなくコア数とメモリの多い専用サーバーを選び、メモリを多く消費する他のサービスは同じマシンに置かないようにしてください。

ステップ2:Ollama をインストール

curl -fsSL https://ollama.com/install.sh | sh

systemctl status ollama --no-pager
ollama --version
ss -lntp | grep 11434        # should show 127.0.0.1:11434

インストーラーは ollama システムユーザーと、127.0.0.1:11434 で待ち受ける systemd サービスを作成します。モデルは /usr/share/ollama/.ollama/models に保存されるため、そのディスクに十分な空き容量があることを確認してください(7B モデルで約 4–5 GB)。

ステップ3:モデルをダウンロードしてテスト

# Strong multilingual model, good at Chinese and English
ollama pull qwen2.5:7b

# Smaller and faster alternative
ollama pull llama3.2:3b

ollama run qwen2.5:7b "Explain in three sentences what a reverse proxy is."
ollama list        # downloaded models
ollama ps          # loaded models and how much memory they use

他のモデルやサイズは、ollama.com のモデルライブラリで探せます。まず 3B か 7B のモデルで速度を確認し、回答の品質が不十分な場合にのみ大きなモデルへ移行しましょう。

ステップ4:Open WebUI をインストール

Open WebUI は Docker 上で動作します(Docker インストールガイドを参照)。コンテナからホスト上の Ollama に接続する必要があるため、Ollama がすべてのインターフェースで待ち受けるように設定し、外部からポート 11434 へのアクセスをファイアウォールで確実に遮断してください。

# Let Ollama accept connections from Docker containers
mkdir -p /etc/systemd/system/ollama.service.d
cat > /etc/systemd/system/ollama.service.d/override.conf <<'EOF2'
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
EOF2
systemctl daemon-reload && systemctl restart ollama

# Allow Docker networks to reach Ollama, block everyone else (ufw: rules are matched in order)
ufw allow from 172.16.0.0/12 to any port 11434 proto tcp
ufw deny 11434/tcp
# firewalld: simply do not open 11434; Docker's own zone already lets containers reach the host

# Start Open WebUI, reachable only from the server itself until Nginx is in front
docker run -d --name open-webui --restart always \
  -p 127.0.0.1:3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  -v open-webui:/app/backend/data \
  ghcr.io/open-webui/open-webui:main

別のマシンから http://YOUR_SERVER_IP:11434 に応答がないことを確認してください。応答がある場合は、先に進む前にファイアウォールを修正します。

ステップ5:Open WebUI を HTTPS で公開

ai.example.com などのサブドメインをサーバーに向け、証明書を取得して(Certbot・acme.sh で無料 SSL を導入する方法を参照)、コンテナへプロキシします。Open WebUI は WebSocket で回答をストリーミングするため、Upgrade ヘッダーと長めの読み取りタイムアウトを設定しておきます。

server {
    listen 443 ssl;
    http2 on;
    server_name ai.example.com;

    ssl_certificate     /etc/letsencrypt/live/ai.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ai.example.com/privkey.pem;
    client_max_body_size 50m;      # document uploads

    location / {
        proxy_pass         http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_read_timeout 600s;
    }
}

サイトを開き、すぐに最初のアカウントを作成してください。このアカウントが管理者になります。その後、管理者設定で新規登録を無効にするか管理者の承認を必須にし、チームのアカウントは自分で作成します。

ステップ6:アプリケーションから API を利用

Ollama は独自の API に加えて OpenAI 互換のエンドポイントも提供しているため、多くのツールや SDK はベース URL を変更するだけで利用できます。同じサーバーから呼び出すか、他のサーバーからはプライベートネットワークや SSH トンネル経由で呼び出してください。

# Native API
curl http://127.0.0.1:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "Write a short product description for a Tokyo VPS.",
  "stream": false
}'

# OpenAI-compatible API (base URL http://127.0.0.1:11434/v1, any API key)
curl http://127.0.0.1:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"qwen2.5:7b","messages":[{"role":"user","content":"Hello"}]}'

Dify や n8n などのワークフローツールでは、Ollama をモデルプロバイダーとして利用できます。Dify・n8n・AI エージェント向けサーバーの要件を参照してください。

ステップ7:パフォーマンスを調整

  • モデルを読み込んだままにする:既定では、モデルは 5 分間アイドル状態が続くとアンロードされます。override ファイルに Environment="OLLAMA_KEEP_ALIVE=1h" を設定すれば、最初の応答が遅くなるのを防げます。
  • 並列リクエスト:OLLAMA_NUM_PARALLEL=2 を設定すると、読み込まれた 1 つのモデルで 2 件のリクエストを同時に処理できます。スロットを 1 つ増やすごとに、より多くのメモリが必要です。
  • コンテキスト長:長いドキュメントには大きなコンテキストウィンドウが必要ですが、その分メモリも多く消費します。必要なときだけ増やしてください。
  • メモリに余裕を残す:サーバーがスワップを使い始めると、応答が極端に遅くなります。ollama ps と free -h で確認してください。

よくある質問

CPU のみのサーバーで本当に実用になりますか?

3B–8B のモデルを使った社内ツール、ドキュメントの Q&A、下書き作成、翻訳、バッチ処理であれば実用的です。多数の同時ユーザーや大きなモデルには、より多くのコアとメモリ、または GPU ハードウェアが必要です。

中国語に最も適したモデルはどれですか?

Qwen シリーズは中国語と英語を重点的に学習しており、最初に選ぶモデルとして適しています。まず qwen2.5:7b を試し、自分の質問を使って他のモデルと比較してください。

データがサーバーの外に送信されることはありますか?

いいえ。Ollama と Open WebUI はプロンプトとドキュメントをローカルで処理します。インターネットに接続するのは、モデルやアップデートをダウンロードするときだけです。

上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、OS バージョン、CPU とメモリ、使用しているモデル、エラー全文を添えていただくと、より迅速に調査できます。

この回答はお役に立ちましたか?

関連チュートリアル