最近在折腾本地大模型部署,目标是搭建一套可以离线使用、数据不出内网的AI对话系统。对比了多种方案后,最终选择了Ollama + Open WebUI的组合。

这篇文章记录完整的部署过程:从服务器选型、Docker环境配置、Ollama模型拉取,到Open WebUI的安装与调优。整个过程踩了不少坑,整理出来供有同样需求的朋友参考。

### 一、为什么选Ollama + Open WebUI?

**Ollama**是目前最流行的本地大模型运行框架,支持Llama、Qwen、DeepSeek、Mistral等主流开源模型,一条命令就能拉取和运行,省去了手动配置CUDA、Python环境的繁琐。

**Open WebUI**是一个功能完善的Web界面,支持多模型切换、对话历史管理、RAG知识库、多用户管理,界面体验接近ChatGPT。

两者结合,相当于用最低的成本搭建一个私有化的AI对话平台。

**硬件需求**:纯CPU跑7B量化模型,16GB内存够用;如果要跑13B以上模型或追求推理速度,建议上GPU实例。

### 二、服务器选型与环境准备

#### 2.1 服务器配置

本次部署使用的是一台2核4G的云服务器,操作系统Ubuntu 22.04。对于跑7B量化模型(如qwen2.5:7b)的测试场景,这个配置基本够用。

选服务器时建议根据模型规模决定配置:7B模型选2核4G起步,13B以上建议4核8G或带GPU的实例。

#### 2.2 安全组配置

拿到服务器后,先在控制台配置安全组,开放必要端口:

| 端口 | 协议 | 用途 |
|------|------|------|
| 22 | TCP | SSH远程连接 |
| 3000 | TCP | Open WebUI访问端口 |
| 11434 | TCP | Ollama API端口(建议仅内网) |

**安全提醒**:11434端口是Ollama的API接口,不建议直接暴露到公网。

#### 2.3 连接服务器并更新系统

```bash
ssh root@你的公网IP

apt update && apt upgrade -y
apt install -y curl git vim
```

### 三、安装Docker环境

```bash
# 安装Docker
curl -fsSL https://get.docker.com | sh

# 验证安装
docker --version
docker compose version
```

如果下载速度慢,可以配置国内镜像加速:

```bash
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker
```

### 四、部署Ollama

#### 4.1 拉取并运行Ollama容器

```bash
docker run -d \
  --name ollama \
  --restart always \
  -p 11434:11434 \
  -v ollama_data:/root/.ollama \
  ollama/ollama
```

#### 4.2 拉取模型

```bash
# 进入容器
docker exec -it ollama bash

# 拉取qwen2.5 7B模型
ollama pull qwen2.5:7b

# 查看已下载模型
ollama list
```

#### 4.3 测试模型

```bash
# 用API测试
curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "介绍一下Docker的核心概念",
  "stream": false
}'
```

### 五、部署Open WebUI

#### 5.1 启动Open WebUI容器

```bash
docker run -d \
  --name open-webui \
  --restart always \
  -p 3000:8080 \
  -v open-webui:/app/backend/data \
  --add-host=host.docker.internal:host-gateway \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  ghcr.io/open-webui/open-webui:main
```

#### 5.2 访问Web界面

浏览器打开 `http://你的公网IP:3000`,首次访问需要注册管理员账号。

### 六、性能调优与踩坑记录

#### 6.1 内存不足导致OOM

2核4G跑7B模型时,如果同时开多个对话,偶尔会触发OOM。解决方案是加Swap:

```bash
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```

#### 6.2 模型加载慢

首次加载模型需要将权重读入内存,7B模型大约需要30-60秒。后续对话会快很多。

### 七、配置Nginx反向代理与HTTPS(可选)

```bash
apt install -y nginx certbot python3-certbot-nginx
```

创建Nginx配置:

```nginx
server {
    listen 80;
    server_name 你的域名;

    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";
    }
}
```

启用配置并申请证书:

```bash
ln -s /etc/nginx/sites-available/openwebui /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
certbot --nginx -d 你的域名
```

### 八、总结

至此,一套完整的本地大模型对话系统就部署完成了。核心组件包括:

- **Ollama**:负责模型运行和推理
- **Open WebUI**:提供Web界面和多用户管理
- **Docker**:容器化管理,环境隔离
- **Nginx**:反向代理和HTTPS

这套方案的优势是数据完全私有化,适合对数据安全有要求的场景。

### 附:相关资源

> **服务器来源说明**:本次部署使用的云服务器,当时参考的是官方活动页面,有需要可以看看:https://curl.qcloud.com/Qxm26oKV

---

*本文为个人实践记录,相关配置和价格请以官方页面实时信息为准。*

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐