Ollama + Open WebUI 私有部署全栈方案:5步搭建企业级本地大模型平台

阿里云上云采购季 2核2G云服务器99元/年 续费同价

还在为大模型API费用发愁?还在担心数据上传到第三方?今天教你用 Ollama + Open WebUI,在自家服务器上搭建企业级私有大模型平台,数据不出内网,成本无限趋近于零。


为什么要私有部署大模型?

2026年,大模型已经成为企业生产力工具的标配。但云端 API 方案有几个痛点:

痛点 云端 API 私有部署
数据安全 数据上传第三方 数据不出本地
使用成本 按 Token 计费,高频使用贵 一次性硬件投入
网络依赖 依赖公网,有延迟风险 内网直连,毫秒级响应
合规风险 金融/医疗行业受限 完全自主可控
模型定制 受限于供应商 自由微调、切换模型

本文选用的方案:
– Ollama:本地大模型运行时,支持 100+ 个开源模型一键拉取
– Open WebUI:功能完善的 Web 聊天界面,支持多用户、多模型、对话管理


准备工作

硬件需求

配置 最低要求 推荐配置
CPU 4核+ 8核+
内存 16GB(7B模型) 32GB(14B模型)
显卡 无GPU也可运行(慢) NVIDIA RTX 3090/4090 或 A100
存储 50GB SSD 200GB+ NVMe SSD
系统 Ubuntu 20.04+ Ubuntu 22.04 LTS

云服务器推荐:腾讯云 GN7 实例(T4 GPU)或 GN8 实例(V100),入门跑 7B 模型月费约 800 元起。


第1步:安装 Ollama

# 一键安装 Ollama(官方脚本,支持 Linux/macOS)
curl -fsSL https://ollama.com/install.sh | sh

# 验证安装
ollama --version
# 输出:ollama version is 0.6.5

# 配置 Ollama 监听所有网卡(Docker 网络访问需要)
sudo systemctl edit ollama --force

# 在编辑器中写入以下内容:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MODELS=/data/ollama/models"  # 模型存储路径

# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart ollama

# 验证监听状态
curl http://localhost:11434/api/tags

拉取模型

# 拉取 Qwen2.5 7B(国内首选,中文效果最佳)
ollama pull qwen2.5:7b

# 拉取 DeepSeek-R1 8B(推理能力强)
ollama pull deepseek-r1:8b

# 拉取 Llama3.2 3B(轻量快速)
ollama pull llama3.2:3b

# 查看已下载模型
ollama list

# 快速测试
ollama run qwen2.5:7b "用Python写一个冒泡排序"

常用模型推荐

模型 大小 适用场景 硬件要求
qwen2.5:7b 4.7GB 中文对话、代码 8GB VRAM
qwen2.5:14b 9.0GB 复杂推理、长文 16GB VRAM
deepseek-r1:8b 4.9GB 数学推理、逻辑 8GB VRAM
llama3.2:3b 2.0GB 轻量快速、英文 4GB VRAM
codellama:13b 7.4GB 代码生成补全 16GB VRAM

第2步:Docker Compose 部署 Open WebUI

# 创建项目目录
mkdir -p /opt/openwebui && cd /opt/openwebui

# 创建 docker-compose.yml
cat > docker-compose.yml << 'EOF'
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:
      # Ollama 地址(宿主机 IP,不能用 localhost)
      - OLLAMA_BASE_URL=http://172.17.0.1:11434
      # 关闭注册(企业内部使用)
      - ENABLE_SIGNUP=false
      # 管理员邮箱
      - DEFAULT_USER_ROLE=user
      # 数据加密密钥(随机生成,务必修改)
      - WEBUI_SECRET_KEY=your-secret-key-change-me-now
      # 启用知识库功能
      - ENABLE_RAG_WEB_SEARCH=true
      - ENABLE_IMAGE_GENERATION=false
    volumes:
      - openwebui_data:/app/backend/data
    extra_hosts:
      - "host.docker.internal:host-gateway"

volumes:
  openwebui_data:
    driver: local
EOF

# 启动服务
docker compose up -d

# 查看日志
docker compose logs -f

启动成功后访问 http://服务器IP:3000,首次访问创建管理员账号。


第3步:配置多用户权限

Open WebUI 支持完善的用户管理体系,适合团队使用:

# 通过 API 批量创建用户(管理员操作)
import requests
import json

BASE_URL = "http://localhost:3000"
ADMIN_TOKEN = "your-admin-jwt-token"  # 登录后从 Cookie 获取

def create_user(email, name, password, role="user"):
    """创建用户账号"""
    headers = {
        "Authorization": f"Bearer {ADMIN_TOKEN}",
        "Content-Type": "application/json"
    }
    payload = {
        "email": email,
        "name": name,
        "password": password,
        "role": role
    }
    resp = requests.post(
        f"{BASE_URL}/api/v1/auths/add",
        headers=headers,
        json=payload
    )
    return resp.json()

# 批量创建团队成员
team_members = [
    {"email": "[email protected]", "name": "张三", "password": "Dev@2026"},
    {"email": "[email protected]", "name": "李四", "password": "Dev@2026"},
    {"email": "[email protected]",   "name": "王经理", "password": "Pm@2026"},
]

for member in team_members:
    result = create_user(**member)
    print(f"创建用户 {member['name']}: {result.get('id', 'failed')}")

第4步:集成知识库(RAG)

Open WebUI 内置 RAG 支持,可直接上传企业内部文档:

# 配置知识库相关环境变量
cat >> /opt/openwebui/docker-compose.yml << 'ADDENV'
      # RAG 向量化模型(使用本地 Ollama)
      - RAG_EMBEDDING_ENGINE=ollama
      - RAG_EMBEDDING_MODEL=nomic-embed-text
      # 每次检索召回段落数
      - RAG_TOP_K=5
      # 向量相似度阈值
      - RAG_RELEVANCE_THRESHOLD=0.45
ADDENV

# 拉取嵌入模型
ollama pull nomic-embed-text

通过 Web 界面上传文档后,即可在聊天时勾选知识库进行检索增强对话。


第5步:配置 Nginx 反向代理 + HTTPS

# /etc/nginx/sites-available/openwebui
server {
    listen 80;
    server_name ai.yourcompany.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name ai.yourcompany.com;

    ssl_certificate /etc/letsencrypt/live/ai.yourcompany.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ai.yourcompany.com/privkey.pem;

    # 开启 GZIP 压缩
    gzip on;
    gzip_types text/plain application/json application/javascript text/css;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;

        # WebSocket 支持(流式输出必须)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 超时设置(大模型响应可能较慢)
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}
# 申请 SSL 证书(Let's Encrypt)
certbot --nginx -d ai.yourcompany.com

# 测试并重载 Nginx
nginx -t && nginx -s reload

完整架构图

用户浏览器
    │
    ▼
[Nginx:443 HTTPS]  ←── SSL 证书(Let's Encrypt)
    │
    ▼
[Open WebUI:3000]  ←── 多用户界面 + RAG 知识库
    │
    ├── REST API ──▶ [Ollama:11434]
    │                    ├── qwen2.5:7b
    │                    ├── deepseek-r1:8b
    │                    └── nomic-embed-text
    │
    └── 数据存储 ──▶ [Docker Volume]
                         ├── 用户数据
                         ├── 对话历史
                         └── 向量数据库(RAG)

性能优化技巧

并发优化

# 允许 Ollama 同时处理多个请求
export OLLAMA_NUM_PARALLEL=4

# 设置模型常驻内存(避免每次请求重新加载)
export OLLAMA_KEEP_ALIVE=1h

# GPU 显存分配(多 GPU 场景)
export CUDA_VISIBLE_DEVICES=0,1

监控脚本

# monitor_ollama.py - 监控 Ollama 服务状态
import requests
import time

def check_ollama_health():
    """检查 Ollama 服务健康状态"""
    try:
        resp = requests.get("http://localhost:11434/api/tags", timeout=5)
        models = resp.json().get("models", [])
        print(f"✅ Ollama 正常,已加载 {len(models)} 个模型")
        for m in models:
            size_gb = m['size'] / 1024**3
            print(f"   - {m['name']}: {size_gb:.1f}GB")
    except Exception as e:
        print(f"❌ Ollama 异常: {e}")

def get_running_models():
    """查看当前正在运行(占用GPU)的模型"""
    try:
        resp = requests.get("http://localhost:11434/api/ps", timeout=5)
        running = resp.json().get("models", [])
        if running:
            for m in running:
                vram_gb = m.get('size_vram', 0) / 1024**3
                print(f"🚀 运行中: {m['name']} (VRAM: {vram_gb:.1f}GB)")
        else:
            print("💤 无模型正在运行(显存已释放)")
    except Exception as e:
        print(f"查询失败: {e}")

if __name__ == "__main__":
    check_ollama_health()
    print()
    get_running_models()

成本对比:私有部署 vs 云端 API

以日均 1000 次对话(每次约 500 token)为例:

方案 月费用 数据安全 延迟
GPT-4o API ¥3,000+ 数据上传 OpenAI 1-3s
通义千问 API ¥800+ 数据上传阿里云 0.5-2s
私有云服务器(T4 GPU) ¥800(固定) 完全本地 0.1-0.5s
私有裸机(4090) ¥0(已购硬件) 完全本地 <0.1s

结论:对于日均 1000 次以上的企业使用场景,私有部署方案从第二个月起就开始盈亏平衡。


踩坑总结

  1. Docker 内无法访问宿主机 Ollama:不要用 localhost,要用 172.17.0.1(Docker 默认网关)或 host.docker.internal
  2. 模型响应超时:Nginx 默认超时 60s,大模型响应可能更慢,必须设置 proxy_read_timeout 300s
  3. 多用户并发慢:设置 OLLAMA_NUM_PARALLEL 允许并发推理
  4. 显存溢出 OOM:7B 模型全精度需要 ~14GB VRAM,可用 qwen2.5:7b-q4_K_M(量化版)只需 ~5GB

小结

通过 Ollama + Open WebUI,你可以用 5 个步骤搭建一个功能完整的企业私有大模型平台:

  1. 安装 Ollama,拉取模型
  2. Docker Compose 启动 Open WebUI
  3. 配置多用户权限
  4. 集成知识库(RAG)
  5. Nginx HTTPS 对外服务

整套方案完全开源,数据不出内网,是金融、医疗、政务等对数据合规要求高的行业的最佳选择。


👤 作者简介

一枚在大中原腹地(河南)卖公有云的男士,主营腾讯云/阿里云/华为云,曾踩坑无数,现专注AI大模型应用落地。关注公众号「AI热点日报」,围观AI前沿动态~

博客:y1cloud.cn

发表评论