还在为大模型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 次以上的企业使用场景,私有部署方案从第二个月起就开始盈亏平衡。
踩坑总结
- Docker 内无法访问宿主机 Ollama:不要用
localhost,要用172.17.0.1(Docker 默认网关)或host.docker.internal - 模型响应超时:Nginx 默认超时 60s,大模型响应可能更慢,必须设置
proxy_read_timeout 300s - 多用户并发慢:设置
OLLAMA_NUM_PARALLEL允许并发推理 - 显存溢出 OOM:7B 模型全精度需要 ~14GB VRAM,可用
qwen2.5:7b-q4_K_M(量化版)只需 ~5GB
小结
通过 Ollama + Open WebUI,你可以用 5 个步骤搭建一个功能完整的企业私有大模型平台:
- 安装 Ollama,拉取模型
- Docker Compose 启动 Open WebUI
- 配置多用户权限
- 集成知识库(RAG)
- Nginx HTTPS 对外服务
整套方案完全开源,数据不出内网,是金融、医疗、政务等对数据合规要求高的行业的最佳选择。
👤 作者简介
一枚在大中原腹地(河南)卖公有云的男士,主营腾讯云/阿里云/华为云,曾踩坑无数,现专注AI大模型应用落地。关注公众号「AI热点日报」,围观AI前沿动态~
博客:y1cloud.cn
