上一篇 下一篇 分享链接 返回 返回顶部

从零搭建私有 AI 助手:Open WebUI、Ollama 与 Docker 部署实战指南

发布人:慈云数据-客服中心 发布时间:23小时前 阅读量:6

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

这个配置文件定义了三个服务:

  1. ollama:负责运行本地大模型。
  2. open-webui:提供可视化 AI 聊天界面。
  3. 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 工具平台就基本搭建完成了。

目录结构
全文