从零搭建私有 AI 搜索:Open WebUI + Ollama + SearXNG 完整部署指南
AI搜索 部署完整教程|附配置文件
随着大模型能力的提升,“AI 搜索”正在成为传统搜索引擎之外的重要信息入口。它不仅能像搜索引擎一样从互联网获取资料,还能将搜索结果进行总结、归纳、对比,并以自然语言给出更接近“答案”的内容。
本文将从零开始,介绍如何在自己的服务器上部署一套可用的 AI 搜索系统。方案采用:
- Open WebUI:作为前端聊天与 AI 应用界面;
- Ollama:本地运行大语言模型;
- SearXNG:开源聚合搜索引擎,为 AI 提供联网搜索能力;
- Docker Compose:统一编排服务,便于部署、升级和维护。
通过本文,你可以搭建一个类似“本地版 Perplexity / AI 搜索助手”的系统,支持本地模型问答、联网搜索、网页摘要、资料整理等能力。
一、整体架构说明
本教程部署的 AI 搜索系统主要由三部分组成:
用户浏览器
↓
Open WebUI 前端界面
↓
Ollama 本地大模型
↓
SearXNG 搜索服务
↓
互联网搜索结果
1. Open WebUI
Open WebUI 是一个非常流行的开源 AI 聊天界面,支持连接 Ollama、OpenAI API、兼容 OpenAI 的第三方模型服务等。它提供了类似 ChatGPT 的 Web 界面,同时支持用户管理、模型管理、知识库、联网搜索等功能。
2. Ollama
Ollama 用于在本地运行大语言模型,例如:
qwen2.5llama3.1mistralgemmadeepseek-r1phi
如果你的服务器没有 GPU,也可以运行较小参数量的模型,例如 qwen2.5:3b、llama3.2:3b。如果有 GPU,则可以选择更大的模型。
3. SearXNG
SearXNG 是一个开源元搜索引擎,它不会自己建立索引,而是聚合多个搜索引擎的结果,例如 Google、Bing、DuckDuckGo、Wikipedia 等。AI 搜索系统可以通过 SearXNG 获取网页资料,再交给大模型总结。
二、服务器准备
1. 推荐配置
如果只是个人使用,推荐配置如下:
| 项目 | 推荐配置 |
|---|---|
| CPU | 2 核及以上 |
| 内存 | 4GB 以上,推荐 8GB |
| 硬盘 | 30GB 以上 |
| 系统 | Ubuntu 22.04 / Debian 12 |
| GPU | 非必须,有 NVIDIA GPU 更好 |
如果你计划运行 7B 以上模型,建议内存至少 16GB。如果使用 GPU 推理,还需要安装 NVIDIA 驱动和 NVIDIA Container Toolkit。
三、安装 Docker 和 Docker Compose
以下命令以 Ubuntu / Debian 为例。
1. 更新系统
sudo apt update
sudo apt upgrade -y
2. 安装基础依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
3. 安装 Docker
curl -fsSL https://get.docker.com | sudo bash
4. 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
5. 验证安装
docker version
docker compose version
如果能看到 Docker 和 Compose 的版本信息,说明安装成功。
四、创建项目目录
建议将所有配置文件统一放在 /opt/ai-search 目录下。
sudo mkdir -p /opt/ai-search
cd /opt/ai-search
创建以下目录:
sudo mkdir -p open-webui
sudo mkdir -p ollama
sudo mkdir -p searxng
sudo mkdir -p searxng/settings
最终目录结构如下:
/opt/ai-search
├── docker-compose.yml
├── open-webui
├── ollama
└── searxng
└── settings
├── settings.yml
└── uwsgi.ini
五、编写 Docker Compose 配置文件
在 /opt/ai-search 目录下创建 docker-compose.yml:
sudo nano docker-compose.yml
写入以下内容:
version: "3.9"
services:
ollama:
image: ollama/ollama:latest
container_name: ai-search-ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./ollama:/root/.ollama
networks:
- ai-search-net
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ai-search-open-webui
restart: unless-stopped
depends_on:
- ollama
- searxng
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_NAME=AI搜索助手
- ENABLE_SIGNUP=true
- ENABLE_WEB_SEARCH=true
- WEB_SEARCH_ENGINE=searxng
- SEARXNG_QUERY_URL=http://searxng:8080/search?q=&format=json
volumes:
- ./open-webui:/app/backend/data
networks:
- ai-search-net
searxng:
image: searxng/searxng:latest
container_name: ai-search-searxng
restart: unless-stopped
ports:
- "8080:8080"
environment:
- BASE_URL=http://localhost:8080/
- INSTANCE_NAME=AI Search SearXNG
volumes:
- ./searxng/settings:/etc/searxng
networks:
- ai-search-net
networks:
ai-search-net:
driver: bridge
这份配置包含三个服务:
ollama:本地模型服务;open-webui:AI 搜索前端;searxng:搜索聚合服务。
默认访问端口:
| 服务 | 地址 |
|---|---|
| Open WebUI | http://服务器IP:3000 |
| Ollama API | http://服务器IP:11434 |
| SearXNG | http://服务器IP:8080 |
如果服务器已经有其他服务占用了这些端口,可以自行修改左侧宿主机端口。例如:
ports:
- "13000:8080"
表示通过宿主机的 13000 端口访问容器内部的 8080 服务。
六、配置 SearXNG
进入配置目录:
cd /opt/ai-search/searxng/settings
创建 settings.yml:
sudo nano settings.yml
写入以下配置:
use_default_settings: true
general:
debug: false
instance_name: "AI Search SearXNG"
contact_url: false
enable_metrics: false
brand:
new_issue_url: false
docs_url: false
public_instances: false
wiki_url: false
search:
safe_search: 0
autocomplete: ""
default_lang: "zh-CN"
formats:
- html
- json
server:
port: 8080
bind_address: "0.0.0.0"
secret_key: "请修改为一串足够复杂的随机字符串"
base_url: false
image_proxy: true
limiter: false
public_instance: false
ui:
static_use_hash: true
default_locale: "zh_CN"
outgoing:
request_timeout: 5.0
max_request_timeout: 10.0
pool_connections: 100
pool_maxsize: 20
enable_http2: true
engines:
- name: bing
engine: bing
shortcut: bi
disabled: false
- name: duckduckgo
engine: duckduckgo
shortcut: ddg
disabled: false
- name: wikipedia
engine: wikipedia
shortcut: wp
disabled: false
base_url: "https://zh.wikipedia.org/"
- name: github
engine: github
shortcut: gh
disabled: false
- name: stackoverflow
engine: stackoverflow
shortcut: st
disabled: false
注意:
secret_key一定要修改,不能直接使用示例内容。可以用下面命令生成随机字符串:
openssl rand -hex 32
然后将生成的字符串填入:
secret_key: "生成的随机字符串"
继续创建 uwsgi.ini:
sudo nano uwsgi.ini
写入:
[uwsgi]
uid = searxng
gid = searxng
workers = 4
threads = 4
http = 0.0.0.0:8080
module = searx.webapp
master = true
disable-logging = true
single-interpreter = true
lazy-apps = true
enable-threads = true
chmod-socket = 666
vacuum = true
die-on-term = true
这个配置主要用于控制 SearXNG 的 Web 服务运行方式。个人使用时,workers = 4 和 threads = 4 已经足够。如果服务器性能较弱,可以改成:
workers = 2
threads = 2
七、启动 AI 搜索服务
回到项目目录:
cd /opt/ai-search
启动服务:
sudo docker compose up -d
查看容器状态:
sudo docker compose ps
正常情况下可以看到三个容器均为 running 状态:
ai-search-ollama running
ai-search-open-webui running
ai-search-searxng running
查看日志:
sudo docker compose logs -f
如果只想查看某个服务日志,例如 Open WebUI:
sudo docker compose logs -f open-webui
八、下载并运行本地模型
Ollama 容器启动后,还需要下载模型。
进入 Ollama 容器:
sudo docker exec -it ai-search-ollama bash
下载 Qwen 模型:
ollama pull qwen2.5:7b
如果服务器配置较低,可以选择更小的模型:
ollama pull qwen2.5:3b
如果你想使用 DeepSeek 推理模型,可以执行:
ollama pull deepseek-r1:7b
下载完成后测试运行:
ollama run qwen2.5:7b
输入一句话:
你好,请用中文介绍一下你自己。
如果模型可以正常回答,说明 Ollama 运行正常。
退出模型交互:
/bye
退出容器:
exit
九、访问 Open WebUI
浏览器打开:
http://服务器IP:3000
首次访问需要创建管理员账号。输入邮箱和密码注册后,第一个注册用户通常会成为管理员。
进入系统后,点击模型选择区域,正常情况下可以看到 Ollama 中已经下载的模型,例如:
qwen2.5:7b
如果看不到模型,可以检查 Open WebUI 是否正确连接 Ollama。
检查 Ollama 连接
进入 Open WebUI 管理后台,找到连接设置,确认 Ollama 地址为:
http://ollama:11434
由于 Open WebUI 和 Ollama 在同一个 Docker 网络中,因此这里应该使用容器服务名 ollama,而不是 localhost。
十、开启联网搜索能力
Open WebUI 支持配置 Web Search。前面的 docker-compose.yml 已经设置了:
ENABLE_WEB_SEARCH=true
WEB_SEARCH_ENGINE=searxng
SEARXNG_QUERY_URL=http://searxng:8080/search?q=&format=json
这表示 Open WebUI 会通过 SearXNG 搜索网页结果。
你也可以在 Open WebUI 后台检查 Web Search 配置:
搜索引擎:searxng
查询地址:http://searxng:8080/search?q=&format=json
测试方式:
在聊天框中输入:
请联网搜索并总结今天人工智能领域的重要新闻,要求列出来源。
如果返回内容中包含搜索来源、网页标题或链接,说明 AI 搜索功能已经生效。
十一、配置反向代理和 HTTPS
如果只是局域网使用,可以直接通过 http://服务器IP:3000 访问。但如果要公开到互联网,建议使用 Nginx 反向代理并配置 HTTPS。
假设你的域名是:
ai.example.com
1. 安装 Nginx
sudo apt install -y nginx
2. 创建 Nginx 配置
sudo nano /etc/nginx/sites-available/ai-search.conf
写入:
server {
listen 80;
server_name ai.example.com;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:3000;
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 3600;
proxy_send_timeout 3600;
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/ai-search.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
3. 申请 HTTPS 证书
安装 Certbot:
sudo apt install -y certbot python3-certbot-nginx
申请证书:
sudo certbot --nginx -d ai.example.com
完成后访问:
https://ai.example.com
十二、安全加固建议
如果你的 AI 搜索服务暴露在公网,务必注意安全。
1. 关闭公开注册
部署初期可以开启注册:
ENABLE_SIGNUP=true
管理员账号创建完成后,建议改成:
ENABLE_SIGNUP=false
然后重启服务:
sudo docker compose down
sudo docker compose up -d
这样可以防止陌生人注册账号使用你的资源。
2. 不要暴露 Ollama 端口
如果不需要外部访问 Ollama API,建议不要映射 11434 端口。可以将配置中的:
ports:
- "11434:11434"
删除或注释掉。
修改后,Open WebUI 仍然可以通过 Docker 内部网络访问 Ollama:
http://ollama:11434
3. 不要公开 SearXNG 后台
同理,如果只是给 Open WebUI 使用,可以不映射 SearXNG 的 8080 端口。将:
ports:
- "8080:8080"
删除或注释掉。
这样外部用户无法直接访问 SearXNG,只能由 Open WebUI 内部调用。
4. 配置防火墙
可以使用 UFW:
sudo apt install -y ufw
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
sudo ufw status
如果你仍然需要直接访问 3000 端口,可以临时开放:
sudo ufw allow 3000
但正式环境更推荐只开放 80 和 443,通过 Nginx 访问。
十三、推荐的生产版 docker-compose.yml
如果你已经配置了 Nginx 反向代理,并且不希望 Ollama 和 SearXNG 暴露到公网,可以使用下面这份更安全的配置。
version: "3.9"
services:
ollama:
image: ollama/ollama:latest
container_name: ai-search-ollama
restart: unless-stopped
volumes:
- ./ollama:/root/.ollama
networks:
- ai-search-net
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ai-search-open-webui
restart: unless-stopped
depends_on:
- ollama
- searxng
ports:
- "127.0.0.1:3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_NAME=AI搜索助手
- ENABLE_SIGNUP=false
- ENABLE_WEB_SEARCH=true
- WEB_SEARCH_ENGINE=searxng
- SEARXNG_QUERY_URL=http://searxng:8080/search?q=&format=json
volumes:
- ./open-webui:/app/backend/data
networks:
- ai-search-net
searxng:
image: searxng/searxng:latest
container_name: ai-search-searxng
restart: unless-stopped
environment:
- INSTANCE_NAME=AI Search SearXNG
volumes:
- ./searxng/settings:/etc/searxng
networks:
- ai-search-net
networks:
ai-search-net:
driver: bridge
这份配置的特点是:
- 只允许本机访问 Open WebUI 的
3000端口; - Ollama 不暴露到公网;
- SearXNG 不暴露到公网;
- 外部用户只能通过 Nginx HTTPS 访问。
十四、常见问题排查
1. Open WebUI 无法连接 Ollama
检查容器是否运行:
sudo docker compose ps
检查 Ollama 日志:
sudo docker compose logs -f ollama
确认 Open WebUI 环境变量:
OLLAMA_BASE_URL=http://ollama:11434
不要写成:
http://localhost:11434
因为在容器内部,localhost 指的是 Open WebUI 容器自己,而不是 Ollama 容器。
2. SearXNG 搜索没有结果
先直接测试 SearXNG:
curl "http://127.0.0.1:8080/search?q=人工智能&format=json"
如果没有返回 JSON,检查 SearXNG 日志:
sudo docker compose logs -f searxng
也可以进入容器测试网络:
sudo docker exec -it ai-search-searxng sh
ping bing.com
部分服务器所在网络可能对搜索引擎访问不稳定,可以适当调整 engines 配置,减少不可用搜索源。
3. 模型回答速度很慢
常见原因包括:
- 服务器没有 GPU;
- 模型参数量过大;
- 内存不足导致频繁交换;
- 同时请求过多;
- 搜索结果太多,提示词上下文过长。
解决方案:
- 将
qwen2.5:7b换成qwen2.5:3b; - 增加内存;
- 使用 GPU;
- 减少联网搜索结果数量;
- 使用更快的量化模型。
4. 容器启动失败
查看详细日志:
sudo docker compose logs
如果是端口冲突,可以查看端口占用:
sudo ss -lntp
例如发现 3000 已被占用,可以将配置改成:
ports:
- "3001:8080"
然后重启:
sudo docker compose down
sudo docker compose up -d
十五、升级与备份
1. 升级服务
进入项目目录:
cd /opt/ai-search
拉取最新镜像:
sudo docker compose pull
重启:
sudo docker compose up -d
清理旧镜像:
sudo docker image prune -f
2. 备份数据
需要备份的目录主要包括:
/opt/ai-search/open-webui
/opt/ai-search/ollama
/opt/ai-search/searxng/settings
/opt/ai-search/docker-compose.yml
可以打包:
sudo tar -czvf ai-search-backup.tar.gz /opt/ai-search
恢复时只需要解压目录并重新执行:
sudo docker compose up -d
十六、进阶优化建议
1. 使用更强的模型
如果你希望 AI 搜索总结能力更强,可以尝试:
ollama pull qwen2.5:14b
ollama pull llama3.1:8b
ollama pull deepseek-r1:14b
但模型越大,对硬件要求越高。
2. 接入第三方 API 模型
如果本地服务器性能不足,可以在 Open WebUI 中配置 OpenAI API 或兼容接口,例如:
- OpenAI;
- Azure OpenAI;
- DeepSeek API;
- Moonshot;
- 通义千问;
- 智谱 GLM;
- 本地 vLLM 服务。
这样可以保留 Open WebUI 和 SearXNG 搜索能力,同时把大模型推理交给云端 API。
3. 增加知识库能力
Open WebUI 支持上传文档并建立知识库。你可以将公司文档、项目资料、技术手册上传,然后实现:
知识库问答 + 联网搜索 + 大模型总结
这种组合非常适合做个人知识助理、团队资料助手、技术支持机器人等。
十七、总结
本文介绍了一套完整的 AI 搜索部署方案,核心组件包括 Open WebUI、Ollama 和 SearXNG。通过 Docker Compose 可以快速完成部署,并且便于后续升级维护。
最终你将获得一个具备以下能力的 AI 搜索系统:
- 支持本地大模型对话;
- 支持联网搜索;
- 支持搜索结果总结;
- 支持中文问答;
- 支持私有化部署;
- 支持后续接入 API 模型和知识库。
如果只是个人使用,建议先使用 qwen2.5:3b 或 qwen2.5:7b 测试整体流程;如果用于正式环境,则建议开启 HTTPS、关闭公开注册、隐藏 Ollama 和 SearXNG 端口,并定期备份数据。
至此,一套完整的 AI 搜索系统就部署完成了。