部署openwebui
起因:为什么要部署 Open WebUI
买了不少 API 额度,包括 OpenAI、Claude、Gemini 等。但问题来了——每个都直接用 API Key 调用,不仅难以管理使用量,安全性也是个大问题。
在寻找解决方案时,我发现了 Open WebUI(之前叫 Ollama WebUI)。试用后发现,还可以就是首次加载很慢:
- 类似 ChatGPT 的友好界面
- 支持多种模型(本地 Ollama 和各种 API)
- 用户管理和权限控制
- 使用历史记录
于是决定部署一套,这篇文章记录了整个过程。
我的部署环境
- 服务器:Ubuntu 22.04 LTS(4核4G内存)
- Docker:24.0.5
方案一:Docker 一键部署(最简单)
刚开始我选择了最简单的 Docker 方案,适合快速体验。
步骤 1:安装 Docker
# 更新包索引
sudo apt update
# 安装依赖
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin步骤 2:部署 Open WebUI
最基础的部署只需要一行命令:
docker run -d \
--name open-webui \
--restart always \
-p 3000:8080 \
-v open-webui:/app/backend/data \
ghcr.io/open-webui/open-webui:main访问 http://服务器IP:3000
步骤 3:初始配置
第一个注册的用户自动成为管理员,这点要注意。我立即:
- 注册管理员账号
- 进入设置关闭公开注册
- 手动创建团队成员账号
方案二:Docker Compose 部署(推荐)
用了几天后,我发现需要更多自定义配置,于是改用 Docker Compose。
创建 docker-compose.yml
version: '3.8'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
environment:
# 基础配置
- WEBUI_SECRET_KEY=your-secret-key-here-change-this
- WEBUI_NAME=Company AI Assistant
# 认证配置
- WEBUI_AUTH=True
- WEBUI_AUTH_TRUSTED_EMAIL_HEADER=
- DEFAULT_USER_ROLE=pending # 新用户默认需要审批
# OpenAI API 配置
- OPENAI_API_BASE_URL=https://api.openai.com/v1
- OPENAI_API_KEY=${OPENAI_API_KEY}
# 其他 API 配置(可选)
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- GOOGLE_API_KEY=${GOOGLE_API_KEY}
# 数据库配置(使用 PostgreSQL)
- DATABASE_URL=postgresql://openwebui:password@postgres:5432/openwebui
volumes:
- ./data:/app/backend/data
- ./uploads:/app/backend/uploads
depends_on:
- postgres
networks:
- webui-network
postgres:
image: postgres:15-alpine
container_name: webui-postgres
restart: unless-stopped
environment:
- POSTGRES_USER=openwebui
- POSTGRES_PASSWORD=password
- POSTGRES_DB=openwebui
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- webui-network
# 如果需要本地模型,添加 Ollama
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu] # 如果有 GPU
networks:
- webui-network
volumes:
postgres_data:
ollama_data:
networks:
webui-network:
driver: bridge创建环境变量文件
# .env 文件
OPENAI_API_KEY=sk-xxxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx
GOOGLE_API_KEY=AIzaxxxxxxxxxxxxx启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f open-webui配置 Nginx 反向代理
为了提供更好的访问体验,我配置了 Nginx 反向代理,支持 HTTPS 和 WebSocket。
Nginx 配置文件
# /etc/nginx/sites-available/open-webui
server {
listen 80;
server_name ai.company.local;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name ai.company.local;
# SSL 证书(我用的是内网自签名证书)
ssl_certificate /etc/nginx/ssl/ai.company.local.crt;
ssl_certificate_key /etc/nginx/ssl/ai.company.local.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# 上传大小限制(支持大文件上传)
client_max_body_size 100M;
client_body_buffer_size 100M;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
# WebSocket 支持(重要!)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 标准代理头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
# 缓冲设置
proxy_buffering off;
proxy_request_buffering off;
}
}启用配置
sudo ln -s /etc/nginx/sites-available/open-webui /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx