从零搭建私有 AI 助手:Open WebUI、Ollama 与 Docker 部署实战指南
AI工具 部署完整教程|附配置文件
随着大模型能力的快速发展,越来越多团队开始将 AI 工具部署到本地或服务器中,用于知识问答、代码辅助、文档总结、私有数据分析等场景。相比直接使用公网 AI 服务,私有化部署具有数据可控、成本可控、可扩展性强、便于团队统一管理等优势。
本文将以一个常见且实用的方案为例,完整介绍如何部署一套可用的 AI 工具平台:
Open WebUI + Ollama + Docker Compose + Nginx 反向代理
部署完成后,你将拥有一个类似 ChatGPT 的网页聊天界面,可以在浏览器中访问,并调用本地或服务器上的大模型进行对话。
一、方案说明
本教程采用以下组件:
| 组件 | 作用 |
|---|---|
| Docker | 容器运行环境 |
| Docker Compose | 多容器编排工具 |
| Ollama | 本地大模型运行服务 |
| Open WebUI | AI 对话网页界面 |
| Nginx | 反向代理,可配置域名和 HTTPS |
| Linux 服务器 | 推荐 Ubuntu 22.04 / Debian 12 |
整体架构如下:
用户浏览器
│
▼
Nginx 反向代理
│
▼
Open WebUI 前端服务
│
▼
Ollama 大模型服务
│
▼
本地模型,如 qwen、llama、deepseek 等
如果你只是个人学习,也可以不配置 Nginx,直接通过服务器 IP 和端口访问 Open WebUI。
二、服务器配置建议
不同模型对硬件要求不同,以下是常见推荐配置:
1. 基础体验配置
适合运行 7B 左右的小模型,例如 Qwen2.5 7B、Llama3.1 8B、DeepSeek-R1 7B 蒸馏版。
CPU:4 核及以上
内存:16GB 及以上
硬盘:50GB 及以上
GPU:非必须
系统:Ubuntu 22.04 LTS
2. 更流畅配置
CPU:8 核及以上
内存:32GB 及以上
硬盘:100GB SSD
GPU:NVIDIA 显卡,显存 12GB 及以上
如果没有 GPU,也可以使用 CPU 运行,但生成速度会明显慢一些。对于企业内部知识库、文档问答等场景,建议使用带 GPU 的服务器。
三、安装 Docker
首先登录服务器。
ssh root@你的服务器IP
更新系统软件包:
apt update && apt upgrade -y
安装必要依赖:
apt install -y ca-certificates curl gnupg lsb-release
安装 Docker 官方 GPG Key:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
添加 Docker 软件源:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker 和 Docker Compose:
apt update
apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
查看 Docker 版本:
docker version
查看 Docker Compose 版本:
docker compose version
设置 Docker 开机自启:
systemctl enable docker
systemctl start docker
四、创建项目目录
建议将所有配置文件放在统一目录中,便于维护和备份。
mkdir -p /opt/ai-tools
cd /opt/ai-tools
创建以下目录结构:
mkdir -p nginx/conf.d
mkdir -p nginx/certs
mkdir -p data/open-webui
mkdir -p data/ollama
最终目录结构如下:
/opt/ai-tools
├── docker-compose.yml
├── .env
├── nginx
│ ├── conf.d
│ │ └── ai.conf
│ └── certs
├── data
│ ├── open-webui
│ └── ollama
五、编写环境变量配置文件
在 /opt/ai-tools 目录下创建 .env 文件:
vim .env
写入以下内容:
# 项目名称
COMPOSE_PROJECT_NAME=ai-tools
# Open WebUI 端口
OPEN_WEBUI_PORT=3000
# Ollama 服务端口
OLLAMA_PORT=11434
# Nginx 对外端口
NGINX_HTTP_PORT=80
NGINX_HTTPS_PORT=443
# 时区
TZ=Asia/Shanghai
# Open WebUI 鉴权密钥
# 建议替换为更复杂的随机字符串
WEBUI_SECRET_KEY=please_change_this_secret_key
说明:
OPEN_WEBUI_PORT:Open WebUI 容器内部和宿主机映射端口。OLLAMA_PORT:Ollama API 服务端口。WEBUI_SECRET_KEY:用于会话和认证安全,生产环境必须修改。TZ:设置时区,避免日志时间混乱。
六、编写 Docker Compose 配置文件
在 /opt/ai-tools 目录下创建 docker-compose.yml:
vim docker-compose.yml
写入以下配置:
version: "3.9"
services:
ollama:
image: ollama/ollama:latest
container_name: ai-ollama
restart: unless-stopped
ports:
- "${OLLAMA_PORT}:11434"
volumes:
- ./data/ollama:/root/.ollama
environment:
- TZ=${TZ}
networks:
- ai-network
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ai-open-webui
restart: unless-stopped
depends_on:
- ollama
ports:
- "${OPEN_WEBUI_PORT}:8080"
volumes:
- ./data/open-webui:/app/backend/data
environment:
- TZ=${TZ}
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
networks:
- ai-network
nginx:
image: nginx:1.25-alpine
container_name: ai-nginx
restart: unless-stopped
depends_on:
- open-webui
ports:
- "${NGINX_HTTP_PORT}:80"
- "${NGINX_HTTPS_PORT}:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/certs:/etc/nginx/certs
environment:
- TZ=${TZ}
networks:
- ai-network
networks:
ai-network:
driver: bridge
这个配置文件定义了三个服务:
ollama:负责运行本地大模型。open-webui:提供可视化 AI 聊天界面。nginx:用于统一入口访问和反向代理。
七、编写 Nginx 配置文件
创建 Nginx 配置文件:
vim nginx/conf.d/ai.conf
如果暂时没有域名,只使用 IP 访问,可以写入以下配置:
server {
listen 80;
server_name _;
client_max_body_size 100M;
location / {
proxy_pass http://open-webui:8080;
proxy_http_version 1.1;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
如果你有域名,例如:
ai.example.com
可以将配置改成:
server {
listen 80;
server_name ai.example.com;
client_max_body_size 100M;
location / {
proxy_pass http://open-webui:8080;
proxy_http_version 1.1;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
注意:使用域名前,需要先在 DNS 控制台中将域名 A 记录解析到服务器 IP。
八、启动服务
在项目目录下执行:
cd /opt/ai-tools
docker compose up -d
查看容器运行状态:
docker compose ps
正常情况下可以看到类似结果:
NAME IMAGE STATUS
ai-ollama ollama/ollama:latest Up
ai-open-webui ghcr.io/open-webui/open-webui Up
ai-nginx nginx:1.25-alpine Up
查看日志:
docker compose logs -f
如果只查看 Open WebUI 日志:
docker logs -f ai-open-webui
如果只查看 Ollama 日志:
docker logs -f ai-ollama
九、下载并运行大模型
进入 Ollama 容器:
docker exec -it ai-ollama bash
拉取模型,例如 Qwen2.5 7B:
ollama pull qwen2.5:7b
也可以拉取其他模型:
ollama pull llama3.1:8b
ollama pull deepseek-r1:7b
ollama pull gemma2:9b
查看已安装模型:
ollama list
测试模型是否可用:
ollama run qwen2.5:7b
输入:
你好,请介绍一下你自己。
如果模型能够正常回复,说明 Ollama 已经运行成功。
退出模型交互:
/bye
退出容器:
exit
十、访问 AI 工具平台
如果使用服务器 IP 访问:
http://你的服务器IP
如果没有启用 Nginx,也可以直接访问:
http://你的服务器IP:3000
如果配置了域名:
http://ai.example.com
首次访问 Open WebUI 时,需要注册管理员账号。第一个注册的用户通常会成为管理员,因此生产环境部署后应立即完成初始化,避免他人抢先注册。
登录后,在模型选择区域可以看到 Ollama 中已经下载的模型。如果没有显示,可以检查 OLLAMA_BASE_URL 是否配置正确。
十一、配置 HTTPS 证书
生产环境强烈建议启用 HTTPS。这里以 Certbot 申请 Let’s Encrypt 免费证书为例。
由于本文使用 Docker 版 Nginx,证书可以在宿主机申请,也可以通过额外容器申请。为了便于理解,这里使用宿主机 Certbot。
安装 Certbot:
apt install -y certbot
停止 Docker 中的 Nginx,释放 80 端口:
docker stop ai-nginx
申请证书:
certbot certonly --standalone -d ai.example.com
证书通常保存在:
/etc/letsencrypt/live/ai.example.com/
将证书复制到项目目录:
cp /etc/letsencrypt/live/ai.example.com/fullchain.pem /opt/ai-tools/nginx/certs/
cp /etc/letsencrypt/live/ai.example.com/privkey.pem /opt/ai-tools/nginx/certs/
修改 Nginx 配置:
vim /opt/ai-tools/nginx/conf.d/ai.conf
写入:
server {
listen 80;
server_name ai.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name ai.example.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 100M;
location / {
proxy_pass http://open-webui:8080;
proxy_http_version 1.1;
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 https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
重新启动 Nginx 容器:
docker start ai-nginx
或重启全部服务:
cd /opt/ai-tools
docker compose restart
之后即可通过 HTTPS 访问:
https://ai.example.com
十二、常用运维命令
1. 启动服务
docker compose up -d
2. 停止服务
docker compose down
3. 重启服务
docker compose restart
4. 查看容器状态
docker compose ps
5. 查看实时日志
docker compose logs -f
6. 更新镜像
docker compose pull
docker compose up -d
7. 查看磁盘占用
du -sh /opt/ai-tools/*
docker system df
8. 清理无用镜像
docker image prune -a
执行清理前请确认不会删除正在使用的镜像。
十三、数据备份与恢复
AI 工具平台的核心数据主要包括:
| 数据目录 | 内容 |
|---|---|
/opt/ai-tools/data/open-webui |
用户、会话、设置等数据 |
/opt/ai-tools/data/ollama |
已下载模型文件 |
/opt/ai-tools/nginx |
Nginx 配置和证书 |
/opt/ai-tools/.env |
环境变量配置 |
/opt/ai-tools/docker-compose.yml |
服务编排文件 |
1. 备份命令
cd /opt
tar -czvf ai-tools-backup-$(date +%F).tar.gz ai-tools
2. 恢复命令
将备份文件上传到新服务器后执行:
cd /opt
tar -xzvf ai-tools-backup-2025-01-01.tar.gz
cd /opt/ai-tools
docker compose up -d
如果模型目录很大,备份会占用较多空间。也可以只备份 Open WebUI 数据和配置文件,模型在新服务器上重新拉取。
十四、安全加固建议
私有化部署 AI 工具时,不建议直接裸露服务端口。以下措施可以提升安全性:
1. 修改默认密钥
.env 中的 WEBUI_SECRET_KEY 必须修改为复杂字符串,例如:
WEBUI_SECRET_KEY=9f7a6d8b3c2e1a0x_custom_secret_key_2025
2. 关闭不必要端口
如果已经通过 Nginx 访问,可以考虑不将 Open WebUI 和 Ollama 端口暴露到公网。
将 docker-compose.yml 中:
ports:
- "${OPEN_WEBUI_PORT}:8080"
改为:
expose:
- "8080"
将 Ollama 的:
ports:
- "${OLLAMA_PORT}:11434"
改为:
expose:
- "11434"
这样外部无法直接访问 Open WebUI 和 Ollama,只能通过 Nginx 入口访问。
3. 配置防火墙
只开放必要端口:
ufw allow 22
ufw allow 80
ufw allow 443
ufw enable
查看状态:
ufw status
4. 使用强密码
管理员账号应使用复杂密码,并定期更换。企业内部部署时,建议限制注册权限,避免无关人员使用。
十五、常见问题排查
问题一:访问页面打不开
检查容器是否运行:
docker compose ps
检查端口是否监听:
ss -tunlp | grep -E "80|443|3000"
检查 Nginx 日志:
docker logs -f ai-nginx
问题二:Open WebUI 无法连接 Ollama
检查环境变量:
OLLAMA_BASE_URL=http://ollama:11434
注意这里使用的是 Docker Compose 服务名 ollama,不是 localhost。因为 Open WebUI 和 Ollama 分别运行在不同容器内,在容器网络中需要通过服务名访问。
问题三:模型下载很慢
可以尝试更换网络环境,或者在本地下载后迁移模型目录。Ollama 模型较大,7B 模型通常也需要数 GB 空间。
问题四:服务器内存不足
可以选择更小的模型,例如:
ollama pull qwen2.5:3b
ollama pull llama3.2:3b
同时减少并发访问人数,避免多个用户同时生成内容导致内存占满。
问题五:更新后页面异常
可以尝试重启服务:
docker compose restart
如果仍有问题,查看日志:
docker compose logs -f open-webui
必要时可以回退镜像版本,生产环境不建议盲目使用 latest 或 main 标签。
十六、完整配置文件汇总
下面给出一份完整可用的配置文件,方便直接复制。
1. .env
COMPOSE_PROJECT_NAME=ai-tools
OPEN_WEBUI_PORT=3000
OLLAMA_PORT=11434
NGINX_HTTP_PORT=80
NGINX_HTTPS_PORT=443
TZ=Asia/Shanghai
WEBUI_SECRET_KEY=please_change_this_secret_key
2. docker-compose.yml
version: "3.9"
services:
ollama:
image: ollama/ollama:latest
container_name: ai-ollama
restart: unless-stopped
ports:
- "${OLLAMA_PORT}:11434"
volumes:
- ./data/ollama:/root/.ollama
environment:
- TZ=${TZ}
networks:
- ai-network
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ai-open-webui
restart: unless-stopped
depends_on:
- ollama
ports:
- "${OPEN_WEBUI_PORT}:8080"
volumes:
- ./data/open-webui:/app/backend/data
environment:
- TZ=${TZ}
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
networks:
- ai-network
nginx:
image: nginx:1.25-alpine
container_name: ai-nginx
restart: unless-stopped
depends_on:
- open-webui
ports:
- "${NGINX_HTTP_PORT}:80"
- "${NGINX_HTTPS_PORT}:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/certs:/etc/nginx/certs
environment:
- TZ=${TZ}
networks:
- ai-network
networks:
ai-network:
driver: bridge
3. nginx/conf.d/ai.conf
server {
listen 80;
server_name _;
client_max_body_size 100M;
location / {
proxy_pass http://open-webui:8080;
proxy_http_version 1.1;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
十七、总结
通过本文的步骤,我们完成了一套完整的 AI 工具私有化部署方案。该方案使用 Docker Compose 管理服务,利用 Ollama 运行本地大模型,通过 Open WebUI 提供网页交互界面,并使用 Nginx 作为统一访问入口。
这套方案的优点是部署简单、维护方便、扩展灵活。个人可以用它搭建本地 AI 助手,团队可以用它搭建内部 AI 问答平台。如果后续需要接入知识库、企业文档、API 服务或统一认证,也可以在此基础上继续扩展。
建议正式上线前重点检查以下内容:
- 是否修改了默认密钥;
- 是否开启 HTTPS;
- 是否限制了公网端口;
- 是否完成管理员账号初始化;
- 是否建立数据备份机制;
- 是否根据服务器配置选择了合适模型。
完成以上优化后,一个稳定、可维护、可扩展的 AI 工具平台就基本搭建完成了。