Skip to content

Open WebUI 入门:在公司内网搭建自己的 AI Chat

约 2800 字大约 9 分钟

AIOpen WebUIDocker内网部署

2025-05-28

当模型和 AI 工具越来越多,我更需要一个统一、可自托管的聊天入口。这篇记录 Open WebUI 的定位、基本用法,以及我为什么会在不希望员工直接访问外网的场景下,用它搭建公司内部的 AI Chat。

在前面两篇 RAGFlow 学习笔记里,我已经搭建了一套可以解析文档、检索知识并给出引用的问答服务。RAGFlow 自带的页面足够完成知识库配置和效果验证,但公司内部真正需要的并不只是一个“知识库测试页面”。

有人想直接和通用模型聊天,有人需要查询专业资料,后面还可能接入内部工具、联网搜索或者工作流。员工更希望进入同一个页面,选择不同的 AI 能力,而不是记住多个系统地址。

我们当时选择了 Open WebUI 作为统一入口。这篇先不接 RAGFlow,我想单独记录一下 Open WebUI 的定位、基本使用,以及它为什么适合搭建一套运行在公司内部的 AI Chat。

我对 Open WebUI 的一句话理解

它不只是套在大模型外面的一层聊天页面,更像一个可以自托管的 AI 使用入口:向下连接模型和工具,向上提供用户、会话与交互体验。

为什么不是自己写一个聊天页面

如果需求只有一个输入框和一段流式回答,自己开发并不困难。真正投入使用以后,需求很快会从“能聊天”扩展出去:

  • 登录以后要保留自己的聊天记录;
  • 不同用户能看到的模型不完全一样;
  • 对话需要重命名、搜索、归档和导出;
  • 管理员要维护 Prompt、模型和工具;
  • 需要上传文件、语音输入或生成图片;
  • 后端可能同时存在 Ollama、OpenAI-compatible API 和内部服务;
  • 模型回答时间较长,需要处理流式输出和中断。

这些能力单独看都不神秘,但从头开发、打磨再长期维护,成本并不低。Open WebUI 已经把它们组织成了一个相对完整的平台,我更愿意把开发精力放在公司自己的知识和业务能力上。

Open WebUI 负责什么

Open WebUI 的官方定位是可扩展、可自托管,并且可以完全离线运行的 AI 平台。它能够连接 Ollama 和 OpenAI-compatible API,也提供 Knowledge、Tools、Functions、Web Search、语音和图片等扩展能力。

我把这些能力分成了四层:

交互层

负责员工真正看到和使用的部分,包括多轮对话、Markdown、代码块、文件上传、消息操作和引用展示。

平台层

负责用户、群组、模型列表和聊天记录。对于公司内部使用,这一层比“页面好不好看”更重要,因为它决定了谁能使用哪些能力。

扩展层

Open WebUI 可以通过 Knowledge 做内置 RAG,也能通过 Tool、Pipe Function、Filter Function 等方式接入外部系统。我们的专业文档检索已经交给 RAGFlow,因此不会再让 Open WebUI 重复维护同一套知识库。

能力层

Open WebUI 自己不等于大模型。它把请求转发给 Ollama、vLLM、内部模型网关或者其他兼容接口,再把响应呈现在聊天界面中。

协议比供应商更重要

Open WebUI 当前强调基于标准协议接入模型。只要后端实现了 OpenAI Chat Completions 等兼容接口,就可以作为模型供应方;不兼容的内部 API,则可以通过 Pipe Function 或中间网关适配。

这也是它适合做统一入口的原因之一。

先用 Docker 跑起来

Open WebUI 的 Docker 部署比 RAGFlow 简单很多。为了保留聊天记录和配置,最关键的是持久化 /app/backend/data

  • 步骤 1:拉取镜像

    本地学习可以先使用官方的滚动镜像:

    docker pull ghcr.io/open-webui/open-webui:main

    main 会持续变化。正式环境我会换成当时验证过的 vX.Y.Z 稳定标签,并记录镜像摘要。

  • 步骤 2:启动容器

    docker run -d \
      -p 3000:8080 \
      -v open-webui:/app/backend/data \
      --name open-webui \
      --restart always \
      ghcr.io/open-webui/open-webui:main
  • 步骤 3:创建管理员

    浏览器访问 http://localhost:3000。默认情况下,第一个注册用户会成为管理员。完成初始化后,我会根据实际使用方式关闭公开注册,避免内部服务出现无人管理的账号。

  • 步骤 4:连接模型

    在管理员设置中添加 Ollama 或 OpenAI-compatible Connection,再限制真正需要展示的 Model ID。

如果准备长期运行,我更习惯把配置整理成 Compose:

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: always
    ports:
      - "3000:8080"
    environment:
      WEBUI_SECRET_KEY: ${OPEN_WEBUI_SECRET_KEY}
      WEBUI_URL: https://chat.internal.example
    volumes:
      - open-webui-data:/app/backend/data

volumes:
  open-webui-data:

这里的 WEBUI_SECRET_KEY 应该使用固定的随机值并安全保存。容器重建后如果 Secret 变化,现有登录状态和加密数据可能受到影响。

数据卷不能省略

聊天、用户和大量管理配置都保存在后端数据目录。容器删掉可以重建,数据卷丢了就是另一回事。

升级前除了固定镜像版本,我还会先备份数据卷。

连接本地或内部模型

Open WebUI 可以直接连接 Ollama,也可以连接实现 OpenAI-compatible API 的模型网关。

模型服务如果和 Open WebUI 位于同一个 Compose Network,可以直接使用服务名。如果模型运行在宿主机,本地 Docker 环境通常使用 host.docker.internal,而不是在容器中填写 localhost

对于 OpenAI-compatible 服务,Open WebUI 会尝试请求 /models 获取模型列表。如果内部网关没有实现这个接口,也可以在 Connection 的 Model IDs Filter 中手工登记模型。

公司内部 AI Chat 的两种网络边界

“内部部署”并不只有一种形式。根据数据和网络要求,我会把它分成两类。

完全不允许访问外网

模型、Embedding、语音模型和业务工具全部部署在内部网络,服务器层面也没有公网出口。

这类环境需要在有网络的准备区提前下载镜像和模型,再通过内部镜像仓库或离线介质转入目标环境。

Open WebUI 的 Offline Mode 还需要显式设置:

environment:
  OFFLINE_MODE: "true"
  HF_HUB_OFFLINE: "1"
  RAG_EMBEDDING_MODEL_AUTO_UPDATE: "false"
  RAG_RERANKING_MODEL_AUTO_UPDATE: "false"
  WHISPER_MODEL_AUTO_UPDATE: "false"

如果提前没有准备 Embedding 或 Whisper 模型,开启离线模式以后,相关功能不会自动帮我下载缺失资源。

不希望业务直接访问外网

另一种更常见的方案,是员工浏览器和 Open WebUI 都不直接请求公网模型,而是统一经过公司内部模型网关。

这样做并不代表数据一定安全,但至少把模型密钥、访问策略、脱敏、审计和限流集中到了服务端。浏览器不需要保存云模型 Key,也不会绕开公司的调用边界。

离线模式不等于物理隔离

OFFLINE_MODE=true 会关闭版本检查和自动模型下载,但官方也明确说明,完全 air-gapped 仍然需要在基础设施层隔离实例。

真正不允许访问外网时,我还会使用防火墙、Kubernetes NetworkPolicy 或出口代理白名单限制网络,而不是只依赖应用配置。

一套内部 AI Chat 还要补哪些设置

页面打开、模型能回答,只能算完成了第一步。内部使用至少还要明确这些事情:

事项我的处理原则
注册初始化后关闭无控制的公开注册
访问入口使用内部域名和 HTTPS
模型密钥只保存在服务端或模型网关
模型范围按用户或群组控制可见模型
数据持久化并制定备份、保留与删除策略
联网能力默认关闭,按场景单独开放
Functions只安装经过代码审查的内部 Function
版本测试环境验证后再升级生产

Open WebUI 的 Function 会直接在服务端执行 Python 代码。它很强大,但也意味着从社区导入一个 Function,性质上接近把一段外部代码放进公司服务器运行。官方文档同样建议只安装可信来源并先做代码审查。

为什么我们把它选作外部入口

经过这一轮梳理,我觉得 Open WebUI 对内部平台最实际的价值有三个:

  1. 统一入口:普通模型、专业知识助手和内部工具可以出现在同一套会话体验里;
  2. 自托管:用户、聊天和配置可以留在自己的基础设施中;
  3. 扩展边界清楚:标准模型走兼容协议,特殊能力通过 Pipe、Tool 或内部网关接入。

它自身也带有 Knowledge 和 RAG,但我们没有因此放弃 RAGFlow。Open WebUI 的内置知识库适合快速、轻量的文件问答;复杂文档解析和需要精细检索控制的专业资料,仍然交给 RAGFlow 更合适。

下一篇,我会把两者真正连接起来:让 RAGFlow 继续负责知识处理,让 Open WebUI 把它当成一个可以选择的“专业知识模型”。

相关资料