issue: Web fetch no longer works in offline mode with external loader

该报错发生在使用外部 Web Loader 且容器被防火墙规则限制出网(离线/受限网络)的 Open WebUI v0.10.x 部署中。优先排查是否在 Admin UI 中配置了外部 Loader,但遗漏了对应的环境变量(因为 v0.10.x Web Loader 引擎只会启动时从环境变量读取配置

快速结论:该报错发生在使用外部 Web Loader 且容器被防火墙规则限制出网(离线/受限网络)的 Open WebUI v0.10.x 部署中。优先排查是否在 Admin UI 中配置了外部 Loader,但遗漏了对应的环境变量(因为 v0.10.x Web Loader 引擎只会启动时从环境变量读取配置)。

适用环境:Open WebUI v0.10.2(Docker 部署),操作系统 Debian 13,启用了 OFFLINE_MODE=True,并通过 iptables 的 DOCKER-USER 链阻止容器访问外网(仅允许访问外部 Loader 所在主机)。

最快修复方案:已由 Issue 作者确认有效。在 Docker Compose 环境中为 Open WebUI 容器添加以下环境变量后重启:WEB_LOADER_ENGINE=externalEXTERNAL_WEB_LOADER_URL=http://host.docker.internal:<port>/<path>EXTERNAL_WEB_LOADER_API_KEY=<key>

注意事项:管理员在 Admin UI 中保存的外部 Loader 设置(WEB_LOADER_ENGINE、EXTERNAL_WEB_LOADER_URL 等)在 v0.10.x 的抓取路径中不会被读取,这是一个版本重构缺陷,并非本 Issue 的直接根因;目前必须使用环境变量方式配置。即使配置了外部 Loader,Open WebUI 容器内部仍会执行 DNS 解析和内容类型探测(探测失败会被忽略,不影响抓取),因此容器内的 DNS 解析必须保持可用。

问题场景

用户运行 Open WebUI v0.10.2(Docker 部署,Debian 13)并使用外部 Web Loader(如 Firecrawl)。为了安全,通过 iptables 限制了容器的互联网访问(仅允许访问宿主机上的外部 Loader 服务)。在此离线/受限网络环境下,Web 抓取功能(fetch_url)失败,控制台显示网络不可达错误,导致无法从 URL 获取内容。

报错原文

issue: Web fetch no longer works in offline mode with external loader

Traceback (partial, related to web loader):
Network is unreachable

原因分析

可能原因(根据 Issue 讨论链):用户怀疑是 SSRF 检查导致了报错,但项目维护者确认根因并非此处。实际上有两个独立的问题叠加:

1. 外部 Loader 从未被使用(主要根因):在 v0.10.x 中,Web Loader 引擎(WEB_LOADER_ENGINE)是由环境变量读取的(启动时在 backend/open_webui/retrieval/web/utils.pyget_web_loader 中读取),而不会读取 Admin UI 保存到配置存储的值。由于用户未在环境中设置该变量,系统回退到内置的 SafeWebBaseLoader(默认 Loader),它直接从容器内抓取目标 URL,被 iptables 阻断导致失败。这属于 v0.10 配置重构时产生的缺陷。

2. SSRF 校验的附加影响:即使使用外部 Loader,容器内部仍会执行本地 validate_url() 的 DNS 解析(拒绝解析到非公网 IP 的目标),以及内容类型探测(在 retrieval/utils.py 中会发起一次直接连接,失败会被忽略)。SSRF 校验并未直接导致报错,但容器内的 DNS 解析必须保持可用。

环境排查

  • 确认 Open WebUI 版本是否为 v0.10.x(此版本存在配置重构缺陷)。
  • 检查容器环境变量(非 Admin UI):WEB_LOADER_ENGINEEXTERNAL_WEB_LOADER_URLEXTERNAL_WEB_LOADER_API_KEYENABLE_LOCAL_WEB_FETCH
  • 确认 iptables / DOCKER-USER 链规则是否阻断容器访问外网。
  • 确认容器内部能否进行 DNS 解析(外部 Loader 抓取路径的本地校验需要它)。

解决步骤

  1. 修改 Docker Compose 配置:open-webui 服务(或其他 Docker 部署方式)的 environment 中添加外部 Loader 的环境变量配置(可先尝试):
    WEB_LOADER_ENGINE=external
    EXTERNAL_WEB_LOADER_URL=http://host.docker.internal:<port>/<path>
    EXTERNAL_WEB_LOADER_API_KEY=<your-api-key>
    (其中 URL 和 key 需替换为用户实际使用的外部 Loader 服务地址和认证信息。)
  2. 重启 Open WebUI 容器:使环境变量生效。
  3. (可选)等待修复或跟进更新:该环境变量配置方式为主要的临时性解决方案,官方修复请关注后续 Open WebUI 版本更新。

验证方法

重启容器后,在离线/受限网络环境下,尝试在对话中向 Open WebUI 发送一个 URL(如 https://example.org),确认 Web 抓取功能可以正常获取页面内容,不再出现“Network is unreachable”错误。同时可在服务端检查外部 Loader 服务的接收日志,确认收到来自 Open WebUI 的请求。

参考来源

open-webui/open-webui #26747

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22077

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注