使用 Open WebUI 打造類似 ChatGPT 的本地 AI 介面,支援 Ollama 和 OpenAI 相容 API
專案簡介
Open WebUI 是一個功能豐富的自架 AI 聊天介面,提供類似 ChatGPT 的使用體驗。支援 Ollama、OpenAI 等多種後端,具備使用者管理、對話歷史、RAG 等功能。
GitHub Stars: 123K+
主要功能
- 美觀介面 - 類似 ChatGPT 的現代化 UI
- 多模型支援 - Ollama、OpenAI、Anthropic
- 使用者管理 - 多用戶、權限控制
- 對話管理 - 歷史記錄、匯出分享
- RAG 整合 - 上傳文件進行問答
- 插件系統 - 擴展功能
快速部署
搭配 Ollama
1
2
3
4
5
6
| docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
|
訪問 http://localhost:3000
內建 Ollama
1
2
3
4
5
6
| docker run -d -p 3000:8080 \
--gpus all \
-v ollama:/root/.ollama \
-v open-webui:/app/backend/data \
--name open-webui \
ghcr.io/open-webui/open-webui:ollama
|
Docker Compose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| version: '3.8'
services:
ollama:
image: ollama/ollama
container_name: ollama
volumes:
- ollama:/root/.ollama
ports:
- "11434:11434"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
volumes:
- open-webui:/app/backend/data
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
depends_on:
- ollama
volumes:
ollama:
open-webui:
|
環境變數設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # Ollama 連線
OLLAMA_BASE_URL=http://ollama:11434
# OpenAI 整合
OPENAI_API_BASE_URL=https://api.openai.com/v1
OPENAI_API_KEY=sk-xxx
# 認證設定
WEBUI_AUTH=true
WEBUI_SECRET_KEY=your-secret-key
# 預設模型
DEFAULT_MODELS=llama3.3
# 允許註冊
ENABLE_SIGNUP=false
# 管理員帳號
WEBUI_ADMIN_EMAIL=admin@example.com
|
功能設定
使用者管理
- 設定 → 管理 → 使用者
- 新增使用者或調整權限
- 設定模型存取限制
RAG 文件問答
- 工作區 → 知識庫 → 新增
- 上傳 PDF、TXT、Markdown 檔案
- 在對話中
# 引用知識庫
自訂模型
建立 Modelfile:
1
2
3
| FROM llama3.3
SYSTEM "你是一位專業的資安顧問"
PARAMETER temperature 0.7
|
在 Open WebUI 中:
- 工作區 → 模型 → 新增
- 貼上 Modelfile 內容
- 儲存並使用
1
2
3
4
5
6
7
8
9
10
11
12
13
| # tools/security_scan.py
class Tools:
def __init__(self):
pass
def scan_url(self, url: str) -> str:
"""
掃描指定 URL 的安全性
:param url: 要掃描的網址
:return: 掃描結果
"""
# 實作掃描邏輯
return f"掃描完成:{url}"
|
反向代理設定
Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| server {
listen 443 ssl;
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;
location / {
proxy_pass http://localhost: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-Real-IP $remote_addr;
}
}
|
Traefik
1
2
3
4
5
| labels:
- "traefik.enable=true"
- "traefik.http.routers.openwebui.rule=Host(`ai.example.com`)"
- "traefik.http.routers.openwebui.tls=true"
- "traefik.http.routers.openwebui.tls.certresolver=letsencrypt"
|
備份與還原
備份
1
2
3
4
5
| # 備份資料
docker run --rm \
-v open-webui:/data \
-v $(pwd):/backup \
alpine tar czf /backup/open-webui-backup.tar.gz /data
|
還原
1
2
3
4
| docker run --rm \
-v open-webui:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/open-webui-backup.tar.gz -C /
|
相關連結
延伸閱讀