この記事について
個人の備忘録的なところがあるため、内容の精度については私が使用した環境依存です。
目的
自宅のパソコンにollama + OpenWebUIを入れて、ローカルLLMを動かしてみたい!
あと、自宅のNWの踏み台VMにリバースプロキシコンテナを作成しているので、自宅NW内に作成したローカルLLMに対してリバースプロキシを経由してアクセスさせたい。
踏み台VMにはtailscaleを入れているのでブラウザに下記を入れてアクセスできるようにしたい。
http://<tailscaleのIP>:<ポート番号>
構成
したいこと
ローカルLLMコンテナのホストのスペックは下記
- CPU: Ryzen 7 5700U(8コア, 16スレッド)
- RAM: 32GB
- ストレージ: 512GB SSD
リバースプロキシ
踏み台VMに載っているコンテナ
dockerfile(抜粋)
FROM nginx:latest
RUN sudo apt update
RUN sudo apt -y install apache2-utils
EXPOSE <外部から繋ぐポート番号1>
ollama + OpenWebUI
docker-composeで下記を作成
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
volumes:
- ./ollama_data:/root/.ollama
ports:
- "11434:11434"
restart: unless-stopped
ollama-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ollama-webui
ports:
- "<OpenWebUIとリバースプロキシを繋ぐポート番号2>:8080"
volumes:
- ./ollama_webui_data:/app/backend/data
environment:
OLLAMA_BASE_URL: "http://ollama:11434"
depends_on:
- ollama
restart: unless-stopped
手順
踏み台VM上(リバースプロキシコンテナ)
sudo docker build -t reverse_proxy .
sudo docker run -d --name reverse_proxy -p 9001:9001 --restart=always reverse_proxy
sudo docker exec -it reverse_proxy /bin/sh
# ベーシック認証を使いたいから
htpasswd -c /etc/nginx/.htpasswd <ユーザー名>
# ポートの設定
sudo vim -p /etc/nginx/conf.d/llm-port.conf
server {
listen <ポート番号1>;
server_name localhost;
access_log /var/log/nginx/llm-direct-access.log;
error_log /var/log/nginx/llm-direct-error.log;
# ルートパスで直接転送(/llm/プレフィックスなし)
location / {
proxy_pass http://<OpenWebUIが載っているホストのIP>:<ポート番号2>;
# WebSocketサポート
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# 認証設定
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
sudo nginx -s reload
ollama + OpenWebUI
# 上に記載したdocker-compose.ymlを使う
sudo docker compose -f docker-compose.yml up -d
sudo docker exec -it ollama ollama pull tinyllama
ブラウザアクセス
http://<tailscaleのIP>:<ポート番号1>
でアクセス
エラー遭遇
サブパスでアクセス使用にしたらjsの例外で404になってしまった
本当はhttp://IP:port/llm/
でアクセスしたかった。
zabbixや他のものも構築しているので開けるポートは一つだけでサブパスで各種サービスへのアクセスを切り替えたかった。
例えば下記のようなエラーが出た
GET http://<IP>:<port>/_app/immutable/entry/start.4d0d7042.js net::ERR_ABORTED 404 (Not Found)
/llm/_app/...といった形で出て欲しかったが、絶対パスになっていた
色々パスの書き換え設定をリバースプロキシコンテナ側でしたが、どうしてもうまくいかなかったので、サブパスはやめた
正直Web系の知識が乏しいからなんとも言えない。ちなみにzabbixならサブパスでうまく行ったんだけどなぁ。