OpenWebUI 部署完全指引
上一篇文章讲了 Ollama 的部署相关事宜。可能会有人注意到当时 1Panel 中内嵌了一个 OpenWebUI 的支持,但我并没有讲解它,反而是用了部署更为复杂的 Dify 作为了连接使用例。原因是在当时测试时,OpenWebUI 总是会因为不明原因卡死很长时间,今天有空搞搞明白了,所以这次来讲一下无论是部署还是使用都更加简单的 OpenWebUI 教程。
我需要 OpenWebUI 吗?
OpenWebUI 是一个私有化、“完全离线”、多功能、可拓展的 AI 应用平台,实测你得调整一些参数才能让它真的完全离线。
相比于部署和使用更加复杂的 Dify,OpenWebUI 如果你不深入研究的话更像是一个单纯的对话界面,选择你要对话的模型,然后对话,AI 从未如此简单:
默认界面极其简约,而且如果你没有部署 Ollama 的话,它还可以自动帮你部署 Ollama。
在简约的外表之下,是强大的功能支持,相比于 Dify,它能够实现:
对话、文本补全(可同时与多个模型对话)
音频支持:双向语音交流(需配置 Whisper 与 TTS 集成)
视觉支持:图生文(需模型支持)、文生图(需配置 ComfyUI 集成)
知识库支持(需配置文本向量化模型集成)
函数式工具支持(需模型支持)
联网搜索支持(需模型支持)
完善的用户注册、登陆与权限管理,支持权限组,支持 LDAP、OIDC、OAuth 等多种 SSO 验证
完善的 API 鉴权系统,与用户无缝集成,用户可生成自己的 API Key,API 使用可追溯
原生支持多 Ollama 服务器负载均衡,API 保持 OpenAI API 兼容
在开始之前
本教程将会使用的安装环境:
Ubuntu Server 24
Docker version 27.5.1 / Docker Compose version v2.32.4
部署好 API 的 Ollama 服务,如何部署 Ollama 请参阅《Ollama Ubuntu 部署完全指引》
你可以根据自己的需求进行调整,同时在本教程中将不涉及如何使用 OpenWebUI 的内部集成 Ollama 内容,个人推荐将 Ollama 单独部署于 GPU 服务器上以发挥其最大性能,类似 Dify / OpenWebUI 这样的面板部署在另一台服务器上连接 Ollama 即可,同时分开部署各个组件也能更方便维护。
部署 OpenWebUI
1Panel 用户注意:从应用商店直接安装 OpenWebUI 时,需要在安装页面底部勾选“编辑 Compose 文件”,并按照下方 docker-compose.yaml 的 environment 配置补全对应位置的内容,否则 OpenWebUI 将会每次打开页面时都会卡住。
OpenWebUI 支持多种部署方式,本文介绍容器编排部署。与 Dify 不同,OpenWebUI 由于其轻量化,1c2g的服务器都能够很轻松的跑起来。部署所需的 docker-compose.yaml 内容如下:
services:
core:
environment:
- ENABLE_OPENAI_API=False # 禁用 OpenAI 集成,卡死的原因就是这个
- OFFLINE_MODE=True # 启用离线模式,不从 HuggingFace 拉取模型数据
- OLLAMA_BASE_URL=http://<Ollama-Server-IP>:<Port>
- USE_OLLAMA_DOCKER=False # 不使用集成 Ollama 容器
- TZ=Asia/Shanghai
image: ghcr.io/open-webui/open-webui:v0.5.19
ports:
- 3000:8080
restart: unless-stopped
volumes:
- ./data:/app/backend/data
使用 docker compose -p oi up -d
即可启动容器编排,待容器编排启动完成后,访问 http://<OpenWebUI-IP>:3000
即可打开初始化页面:
非常的炫酷,点击“开始使用”,继续进行管理员初始化:
输入完成后点击“创建管理员账号”即可完成管理员初始化:
OpenWebUI 基础入门
OpenWebUI 的主界面非常简单:
左上角从左到右分别是历史会话管和模型选择器。OpenWebUI 会自动读取你的 Ollama 服务中的所有可用模型,右侧的“+”号则可以让你同时与多个模型对话。点击“设为默认”可以让你每次访问 OpenWebUI 时都自动选中当前模型作为默认对话模型。
中间是对话区域。对话区域顶部显示当前选择的对话模型名称,中间是内容输入框,底部是对话建议。
右上角是高级对话参数设置、创建新对话、个人档案。个人档案下又包含用户可自定义的 WebUI 设置和只有管理员才会出现的管理员面板设置。管理员面板可以对整个系统进行相当复杂的设定,稍后会有专门章节对其进行讲解。
点击左上角的折叠菜单打开历史会话管理,此时点击位于其上部的“工作空间”即可打开工作空间管理器。在这里你不仅可以管理你过去的所有 AI 会话记录,同时还可以操作 Ollama 下载新的模型、管理私有/公开知识库、管理提示词预设以及添加可供 LLM 调用的工具。
注意,此时知识库功能暂时不可使用,你需要完成高级配置中“文档”部分的配置才可以使用知识库
回到主界面,中间的会话区域直接输入文本即可与 LLM 进行对话:
你可能已经注意到了,主界面中对话还支持许多功能如 TTS、音频支持、视觉支持,但是此处仅限于 OpenWebUI 支持,模型本身若不支持多模态则此处即使给它图片它也无法分析。同样情况的还有工作空间管理中的工具,若 LLM 本身不支持函数式调用则工具就不能被使用。
在主界面,你还可以在右上角调整当前会话模型参数设置:
除此以外,如果你点击 头像 - 设置
,则可以打开用户个人档案设置。此处的设置可以大幅度自定义 OpenWebUI 的外观与使用习惯,且此设置按账户隔离,每个用户之间互不影响。
如果你只是需要一个简单好用的 AI 对话平台,那么到此就可以打住了,后面的高级功能会涉及到相当多方面相当复杂的调整。
OpenWebUI 高级配置
先前提到了点击 头像 - 管理员面板
可以打开管理员设置,管理员设置功能非常强大,下面会慢慢介绍。
在你刚进入管理员面板时,默认位于“用户”页。用户页面下可以管理系统中全部的用户账户,如果你需要把 OpenWebUI 开放到公网使用时,可以在这里划分账号与权限组来给所有用户精准地分配权限,这点要比 Dify 强大了不知道多少倍。在后续的设置中,还支持用户自主注册以及LDAP域账户等功能,登录和权限验证这块可以说是非常到位。
竞技场评估是根据用户在使用 OpenWebUI 时对对话的反馈自动统计出的模型准确度排行榜,目前来看如果你的系统使用人数没那么多的话基本是没什么用的。
函数是用于配置可以被 LLM 调用的工具系统,此处的工具配置会被添加到所有账户工作空间,用户个人的工具则不会被添加到系统工作空间或与他人共享。想要了解 OpenWebUI 的工具系统的话可以直接前往 OpenWebUI 社区市场 来看看社区提供的免费工具,同时该市场还有社区分享的提示词预设等等内容。
重点来到了最后一个,设置页面:
首先是通用设置项:
默认用户角色:新创建的用户默认使用的用户角色,指定为“待激活”时需要管理员手动操作为用户授予权限后用户才能自主登录。
允许新用户注册:字面意思,但是如果上一个选项为待激活即使用户注册成功在管理员确认前也不能登陆系统。
在用户待激活界面中显示管理员邮箱等详细信息:顾名思义。
启用 API 密钥:为 OpenWebUI 的 API 增加密钥验证限制。
API 密钥端点限制:限制 API 客户端能够使用的 API 功能。
JWT 过期:API 交互若采用 JWT 作为验证方式时,JWT 的过期时间。
LDAP:LDAP 身份认证功能。
启用分享至社区:启用时用户可以将自己的提示词预设、工具等分享到 OpenWebUI 社区市场
启用回复评价:---暂不清楚---不建议更改---
在上述设置中,你会发现 OpenWebUI 还提供另一项非常重要的功能,就是 API 包装。它可以接入任意多的 Ollama 服务器,并将其作为统一端点由 OpenWebUI 对外提供安全的、权限可控的、可伸缩的服务。同时 OpenWebUI 自身支持负载均衡,在配置多 Ollama 服务器的情况下收到请求会自动分散到多台服务器执行。关于 API 的调用详细操作会在后续章节中进行讲解。
然后是外部连接页,你可以在此处设置多台 Ollama 服务器,如上文所述 OpenWebUI 会在接到请求时自动在多台服务器间进行负载均衡。此页面还可以设置“直接连接”,即控制用户如果有自己的第三方 Ollama 服务时是否允许他们使用 OpenWebUI 连接他们自己的服务,如果你没有此需求,建议设为“关闭”。
之后是模型页面,此处会列出从所有已配置的 Ollama 服务端中获取到的全部模型,你可以在这里设置用户都能使用哪些模型,或者是修改他们的信息比如取个好听的名字之类的。
之后是文档设置。此处的设置会影响到知识库文本的处理,默认此处的语义向量模型引擎使用的是 SentenceTransformers,但是由于我们未使用内置 Ollama,实际上这里跑不起来。所以首先需要到 Ollama Library 中挑一个 Embedding 模型并下载到 Ollama,然后在此处将“语义向量模型引擎”改为 ollama,然后把下方的“语义向量模型”设为你所下载的模型即可,我这里采用的模型是 nomic-embed-text。当你此处文档的设置完成后,在用户“工作空间”处就可以正常使用知识库功能了:
随便找了段文本测试,请不要在意内容......
之后是联网搜索,它可以让你的模型启用联网搜索能力,由于自带的基本都是国外搜索引擎你需要注意设置下代理环境。
代理设置请参照文末
拓展内容 - 怎样给 OpenWebUI 设置代理
代码执行则对应主界面的“代码解释器”功能,此功能会先将代码丢进代码执行器中进行执行,最后将结果跟代码一起返还给 LLM 进行解析。如果没有特殊需要建议关闭此功能。
界面是用于设置 OpenWebUI 各处界面的提示语与细节表现的,此处不再赘述。
语音则是用于设置与 LLM 使用音频对话相关的 Whisper 模型与 TTS 的配置,也基本没有什么内容可讲。
图像,另一大重量级功能。该设置可以让 OpenWebUI 与 ComfyUI 的 API 对接,也就是说此部分设置是用于设置 LLM 的图像生成能力。如果你让 LLM 生成一张图片,则 LLM 会根据你的提示生成 ComfyUI 的提示词,再根据你在此处设置的工作流的相关信息自动调用 ComfyUI 生成一张图片。
其中 ComfyUI 工作流就是工作流的 json 文件,而下方的 ComfyUI 工作流节点则需要根据你的工作流对应到具体的节点 ID,推荐设置一堆输入框来设定各种值,然后在这里只需要把各个输入框的 ID 对应上就好。
后面的 Pipeline 和数据库都是维护相关的内容,不需要介绍了。
OpenWebUI API
OpenWebUI 可以将 Ollama API 的交互经过一层包装转换为 OpenWebUI API,转换后的 API 是 OpenAI Compatible API。
那么,为什么不直接用 Ollama 的 API 呢?答案在之前的文章中其实已经给出过很多次了:
多实例自动负载均衡,如果你有多个 Ollama 服务器,OpenWebUI 可以实现自动负载均衡,保证业务持续运转。
完善的权限验证,每个账号生成各自的 API Key,来有影去有踪,账号管理也可以在你发现异常用户时能够第一时间封禁对应用户来避免损失扩大。
拓展能力支持,通过 OpenWebUI 的能力你可以实现自动知识库调用、联网搜索等。
虽然如此,依旧建议要将 OpenWebUI API 开放到公网时,前面加上一层应用防火墙,且仅为你的服务器开启必要的端口以增加安全性。
OpenWebUI API 的调用方式与 Ollama 基本没有区别,这也使得其与第三方系统的对接变得非常简单,比如我们可以在 Dify 里套个娃为例介绍第三方平台如何接入 OpenWebUI API。
首先在 OpenWebUI 中,点击 头像 - 设置 - 账号 - API 密钥
来生成一个 API Key:
在 Dify 中,前文说到了 OpenWebUI API 实质是 OpenAI 兼容 API,那么在 Dify 的模型供应商处就添加一个 OpenAI-compatible-API 模型:
然后就可以进行愉快的测试啦:
注意,此处只是举个例子。实际使用中,OpenWebUI 已经实现了绝大部分 Dify 的功能,可能只有工具拓展的插件不够完善以及需要手动配置的地方有点多而已。但是其 OpenAI 兼容 API 相比 Dify 还有一个好处就是可以被各种 IDE 中的插件识别,你就可以直接用来写代码了,当然这方面又是一个比较深入复杂的内容,有空可能会细讲讲。
拓展内容
怎样给 OpenWebUI 设置代理
在部署 OpenWebUI 时,调整 docker-compose.yaml 为如下内容:
networks:
1panel-network:
external: true
services:
core:
environment:
- ENABLE_OPENAI_API=False # 禁用 OpenAI 集成,卡死的原因就是这个
- OFFLINE_MODE=True # 启用离线模式,不从 HuggingFace 拉取模型数据
- OLLAMA_BASE_URL=http://<Ollama-Server-IP>:<Port>
- USE_OLLAMA_DOCKER=False # 不使用集成 Ollama 容器
# 网络代理设置
- HTTP_PROXY=192.168.1.1:2333
- HTTPS_PROXY=192.168.1.1:2333
- NO_PROXY=127.0.0.0/8,192.168.0.0/16,localhost
# 时区同步设置
- TZ=Asia/Shanghai
image: ghcr.io/open-webui/open-webui:v0.5.19
networks:
- 1panel-network
ports:
- 3000:8080
restart: unless-stopped
volumes:
- ./data:/app/backend/data
之后重启容器编排即可使用代理连接,此时联网搜索可用,但是依然会有 API 调用速率限制,似乎是无法避免的问题。