使用 Docker 和持久化存储部署 Open WebUI

本文属于:部署自己的 AI · 当前步骤 6/11 →
这篇内容能帮你完成什么?

使用 Docker 运行 Open WebUI、持久化应用数据、连接 Ollama,并补充官方文档建议的生产环境安全措施。

适合谁

需要自托管聊天界面,并计划通过 Docker 运行 Open WebUI 的个人或小团队。

开始前准备

准备可用的 Docker 环境、数据持久化位置,以及要连接的 Ollama 或托管模型 API;确认访问保护方式。

适用范围

重点是应用运行、数据持久化和模型连接;若使用托管 API,不必为此额外安装 Ollama。

最近更新

本文目录

适用范围与验证声明

本文面向 Linux Docker Engine,以及已经独立安装的 Ollama 后端,提供部署参考和功能自检方法。本站尚未完成 Open WebUI 与 Ollama 的完整部署实测。官方资料核验日期为 2026 年 10 月 10 日;命令经过静态检查,不代表镜像启动、模型推理、TLS 或恢复已实际通过。

Open WebUI 是界面,Ollama 负责运行模型。排错前记录 docker version、ollama --version 和所选 WebUI 发布版本。下方示例采用 Docker bridge 网络,不是 host 网络;Docker Desktop、rootless Docker 和自定义网络可能不同。使用支持 host-gateway 的受支持 Docker 版本。Docker 官方指出低于 28.0.0 的版本存在 localhost 发布端口可能被同一二层网络主机访问的限制,不能把回环绑定当成跨版本绝对隔离,参见端口发布说明。

资源、持久化与安全边界

本文没有可靠依据给出统一的 CPU、内存、磁盘硬性最低值。界面资源取决于并发、上传和启用功能;Ollama 则要另按模型大小、量化和上下文估算。磁盘需容纳镜像、应用数据和模型。能运行 Web 界面的服务器,不一定能承担模型推理。

保留 /app/backend/data 数据卷和固定 WEBUI_SECRET_KEY。升级前备份数据,密钥单独安全保管,并在副本上验证恢复。不要为解决连接问题删除数据卷。完成管理员初始化后关闭非必要注册;未初始化的界面不要直接公开。对外提供有访问控制的 HTTPS 界面,不公开原始 Ollama API。

第 1 步:确认 Ollama 前置条件

按照官方 Linux 安装与服务说明准备已经运行的 Ollama。本文不安装 Ollama,也不替读者选择硬件适用模型。在 Ollama 所在主机检查版本与已有模型:

bash
ollama --version
ollama list
curl --fail --silent --show-error --max-time 10 http://127.0.0.1:11434/api/tags

本机接口正常时返回包含 models 数组的 JSON。空数组和连接失败是两回事:没有模型时,先核对资源与下载条件,再按官方流程获取合适模型;下文使用已经存在的模型自检。若服务使用不同地址,应检查已经批准的实际地址。已有服务运行时,不要再重复启动一个 ollama serve。

第 2 步:先确定安全的网络路径

bridge 容器里的 127.0.0.1 指向该容器,不是 Linux 宿主机。--add-host=host.docker.internal:host-gateway 只是增加到宿主地址的名称映射,不会修改 Ollama 的监听接口。Ollama 默认只监听宿主机回环地址的 11434 端口,因此第 4 步示例有前提:Ollama 必须确实可从该 bridge 网络到达。

执行示例前,与主机管理员核对监听地址和访问限制。仅允许必要来源访问的、容器可达的宿主私有接口,与公网接口不是同一方案。没有这样的安全路径就先停止,参照官方连接排错和Ollama 网络说明。不要直接设置全接口监听或开放公网 11434。私有地址本身也不能替代访问控制。

其他拓扑需分别处理:Ollama 也是容器时可用共享私有网络与服务名;远程后端需要受保护的私有路径;Linux host 网络会改变端口映射及隔离边界,不能只把 bridge 命令加上 host 参数就认为等价。本文不提供通用的防火墙或监听修改命令。下文检查可达性,并不能单独证明网络安全。

第 3 步:准备数据卷与固定密钥

使用已获准管理 Docker 的账号。Docker 管理权限具有高权限影响,不要为了快捷随意授予。先确认客户端和服务端都可用:

bash
docker version
docker volume create open-webui
openssl rand -hex 32

预期分别是:版本输出包含有响应的 Server;数据卷返回 open-webui;随机密钥为 64 位十六进制字符串。通过编辑器将密钥保存到私有 open-webui.env,内容为 WEBUI_SECRET_KEY=<你生成的密钥>。必须替换占位值,限制为部署所有者可读,并排除版本控制、截图及共享日志。Docker 管理者仍可查看容器环境,环境文件不能向他们隐藏密钥。重建、升级继续保留同一值。

第 4 步:启动界面容器

官方 main 标签会滚动变化,适合体验。生产应选择已审查、架构适用的发布版本,记录版本或摘要,升级前阅读变更。本文未实测某个固定版本。官方快速入门说明了镜像选择。

下方是条件性的启动参考:仅在第 2 步网络前提和私有环境文件均准备好后使用。先确认容器名和端口没有被其他部署使用,不要盲目删除原容器或数据卷。

bash
docker run -d \
  -p 127.0.0.1:3001:8080 \
  --add-host=host.docker.internal:host-gateway \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  --env-file ./open-webui.env \
  -v open-webui:/app/backend/data \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:main

返回容器 ID 只证明创建请求成功,不证明应用或模型后端可用。界面映射到宿主回环的 3001 端口。若在远程服务器部署,电脑浏览器的 localhost 不是服务器;使用批准的安全隧道或下文 HTTPS 入口,不要改成无保护的公网端口。

第 5 步:分层验证,直到真正获得回复

先检查容器和本机 HTTP:

bash
docker ps -a --filter name=open-webui
docker logs --tail=100 open-webui
curl --fail --silent --show-error --max-time 20 -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3001/

预期容器持续运行,日志没有致命启动循环,本机页面返回合理的成功 HTTP 响应。通过批准的路径打开浏览器页面。首页响应不能证明后端或推理正常;分享日志前须脱敏。

若所选镜像包含 Python,可在容器内检查 Ollama 模型接口,不下载模型:

bash
docker exec -i open-webui python - <<'PY'
import json, urllib.request
with urllib.request.urlopen('http://host.docker.internal:11434/api/tags', timeout=10) as response:
    data = json.load(response)
if not isinstance(data.get('models'), list):
    raise SystemExit('Unexpected model-list response')
print([model.get('name') for model in data['models']])
PY

输出已有模型名称列表,说明该容器可达这个后端;[] 表示未返回模型。拒绝连接、超时或名称解析失败,应检查服务、路由、监听和访问限制。镜像没有 python 时,此检查不适用;不要为了检查往生产容器临时安装工具,改在界面检查连接并查对应版本文档。仅按批准的实际拓扑调整诊断地址。

随后在受保护的界面创建管理员,核对注册和访问策略,进入管理设置检查 Ollama 连接。菜单名称可能随版本变化;确认连接 URL 正确、模型选择器出现已有模型。持久化的应用设置可能与环境变量不同,需检查实际值。选择模型,发送一条简短测试消息,并看到完整的助手回复。模型列表空时先查连接与后端模型;模型存在却无回复时查后端日志、内存/加速资源,再查代理的流式响应或 WebSocket。不要以删除数据解决这些问题。

可选:核对后端实际响应

在 Ollama 主机执行前,把 EXISTING_MODEL_NAME 换成模型列表中的准确名称。请求会实际推理并消耗资源;没有现成适用模型就跳过,不强制下载。stream:false 时应核对完整返回中的 message.content 和 done:true,不能只看 HTTP 成功。推理模型可能耗时或包含单独的思考数据。

bash
curl --fail --silent --show-error --max-time 120 \
  http://127.0.0.1:11434/api/chat \
  -H 'Content-Type: application/json' \
  -d '{"model":"EXISTING_MODEL_NAME","messages":[{"role":"user","content":"Reply with a short greeting."}],"stream":false}'

超时不自动等于安装失败。主机 API 测试成功也不能替代 WebUI 中的完整聊天。接口依据:模型列表、聊天请求。

第 6 步:Caddy HTTPS 配置参考

以下是 Caddyfile 语法,不是 shell 命令,也不是本站实测成功的 HTTPS 配置。前提是 Caddy 与 Docker 在同一宿主机、能访问 3001,读者拥有替换后的域名,DNS 指向正确主机,证书验证所需路径和端口可用。若 Caddy 也在容器,其回环地址指向自身,上游路径需另行设计。添加站点前备份并审查现有配置,不能覆盖其他站点。

caddyfile
openwebui.example.com {
    reverse_proxy 127.0.0.1:3001
}

在审查后的配置文件中替换示例域名。这几行没有全部注释,确实声明站点。仅在自己的测试或部署主机,先校验完整目标文件,再按授权流程重载:

bash
caddy validate --config ./Caddyfile --adapter caddyfile

校验成功不等于 DNS、证书签发、认证或模型流式回复成功。参照Caddy 命令文档和自动 HTTPS 前提。批准重载后,检查实际 HTTPS 域名、证书、登录策略和完整聊天;保持原始模型 API 私有。

常见故障与恢复边界

  • 容器退出:先查日志、Docker 服务权限、镜像架构、环境文件及名称/端口冲突。
  • 宿主模型列表正常,容器不可达:查实际网络模式、网关映射、Ollama 监听与来源限制。
  • 模型选择器为空:区分连接失败与后端空模型列表,核对已保存的连接 URL。
  • 有模型却无回复:查资源和后端日志,再查界面/代理链路;首页正常不是终点。
  • 升级后异常:保留数据卷及密钥;使用经过核验的备份和审查后的恢复方案,优先在副本测试,不用破坏性清理代替排错。

用户侧完整成功条件是:持久化界面运行、受保护的浏览器入口、正确后端可达、模型可选择、实际回复完成。本文提供检查方法,并不声明本站已实际完成上述全部验证。

相关服务器方案

需要运行环境时再考虑

以下方案与本文场景相关。价格和配置会变化,请在购买前重新核对;通过链接购买时 AIOOS 可能获得佣金,但不会增加你的价格。

雨云

雨云洛杉矶一区 2 核 4GB

这是与文章场景相关的服务器方案;购买前请核对实时价格、地区、IP、带宽和工作负载。

2 vCPU · 4 GB · 30 GB system disk
查看当前方案 →

下一步

按当前任务继续,不必一次读完所有内容。

  1. 连接域名 →
  2. Ollama 与 Open WebUI 的区别:自托管 AI 栈中的不同角色 →
  3. 在 Linux 上安装 Ollama 并安全提供服务 →
  4. 一台服务器托管多个网站:Caddy 反向代理与配置验证 →
返回项目路线 →
我正在使用 · 推广推荐

准备上线时,可以再比较这两项服务

这不是自动排名,也不是每个人都需要购买。我只列出自己正在使用的入口,并把适用场景和限制说清楚。

云服务器 · 前期项目在用

雨云 RainYun

准备部署网站或小型服务时,可以把它作为入门候选;先按用户地区、配置和真实负载判断,不要只看最低价格。

推广说明:链接包含我的推荐信息。你通过链接注册或开通后,我可能获得平台奖励;不会因此向你额外收费。价格、活动、地区与服务条款请以下单页为准。 查看完整商业披露