部署openwebui

2025 年 8 月 25 日 星期一(已编辑)
15
这篇文章上次修改于 2025 年 8 月 25 日 星期一,可能部分内容已经不适用,如有疑问可询问作者。

部署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:初始配置

第一个注册的用户自动成为管理员,这点要注意。我立即:

  1. 注册管理员账号
  2. 进入设置关闭公开注册
  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

不过更推荐使用1pandl,因为方便

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...