ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

本地部署大模型:Ollama 部署和实战(三)API 服务、OneAPI 集成、Open WebUI 界面搭建

本地部署大模型:Ollama 部署和实战(三)API 服务、OneAPI 集成、Open WebUI 界面搭建 1. Ollama 服务化落地从本地跑通到多模型统一入口很多人第一次用 Ollama 是在终端里敲ollama run qwen2:0.5b看着模型一行行吐字觉得挺爽。但真要把这套东西用起来问题马上就来了终端里能跑别的程序怎么调团队里几个人想共用一台机器上的模型怎么办前端同事想要个像 ChatGPT 那样的界面总不能让他天天开 SSH 吧。这就是 Ollama 部署的第三阶段要解决的事——服务化。简单说就是把模型从「我一个人在命令行里玩」变成「局域网里谁都能通过标准接口调用」。具体拆成三块第一块是 Ollama 自己的 REST API 服务这是地基第二块是 OneAPI 这类统一网关把 Ollama 和云端模型比如各家兼容 OpenAI 协议的模型聚合成一个入口调用方只认一个地址、一个 Key第三块是 Open WebUI给不写代码的人一个可视化界面选模型、调参数、传文件都在网页上完成。这套组合适合谁适合手里有一台带显卡的机器、想让本地模型真正参与工作流的开发者也适合小团队想搭一个内部 AI 助手又不想把数据全发到外部接口的场景。我试过在一台 16G 显存的机器上把这三层串起来下面把可复制的配置和踩过的坑都写清楚。需要提前说明的是本文所有服务都跑在你自己的机器或内网里不涉及任何网络访问工具。如果你后续想接入更多兼容 OpenAI 协议的模型服务可以了解下 TaoToken 这类统一接入方案它的 API 地址是https://taotoken.net/api官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content后面讲 OneAPI 渠道配置时会提到怎么把它和本地 Ollama 放在同一个网关下管理。2. 前置准备Docker、Ollama 与目录规划在动手之前先把环境理清楚。这套方案的核心依赖是 Docker 和 Docker Compose因为 OneAPI 和 Open WebUI 都推荐用容器跑Ollama 本身也可以容器化但如果你已经用官方脚本装好了 Ollama直接复用宿主机上的服务更省事。2.1 确认 Ollama 已就绪先在宿主机上确认 Ollama 在跑ollama --version curl http://localhost:11434/api/tags第二条命令如果返回一个 JSON里面有你已经拉取的模型列表说明 Ollama 的 API 服务已经在 11434 端口监听了。默认情况下ollama serve启动后只绑定127.0.0.1也就是只有本机能访问。如果你想让 Docker 容器里的 Open WebUI 或 OneAPI 访问它有两个选择一是让容器通过host.docker.internal访问宿主机二是把 Ollama 的监听地址改成0.0.0.0。改监听地址的方式是设置环境变量export OLLAMA_HOST0.0.0.0:11434 ollama serve如果你用 systemd 管理 Ollama可以编辑服务文件在[Service]段加一行EnvironmentOLLAMA_HOST0.0.0.0:11434然后systemctl daemon-reload systemctl restart ollama。注意绑定0.0.0.0意味着同网段的其他机器也能访问你的 Ollama如果这台机器有公网 IP务必确认防火墙规则别把 11434 直接暴露出去。2.2 建一个工作目录后面 docker-compose 文件和各个服务的配置都放在一起方便管理mkdir -p ~/ollama-stack cd ~/ollama-stack目录结构大概是这样ollama-stack/ ├── docker-compose.yml ├── oneapi-data/ └── openwebui-data/数据卷用 bind mount 还是 named volume 都行我这里用 bind mount方便你直接看到配置文件。3. 可复制配置docker-compose 编排 Ollama、OneAPI 与 Open WebUI下面这份docker-compose.yml把 OneAPI 和 Open WebUI 编排在一起Ollama 复用宿主机上已经在跑的服务。如果你想把 Ollama 也放进容器文末会给出替代方案。version: 3.8 services: oneapi: image: justsong/one-api:latest container_name: oneapi restart: always ports: - 3001:3000 volumes: - ./oneapi-data:/data environment: - TZAsia/Shanghai - SESSION_SECRETchange_this_to_a_random_string extra_hosts: - host.docker.internal:host-gateway openwebui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui restart: always ports: - 3000:8080 volumes: - ./openwebui-data:/app/backend/data environment: - OLLAMA_BASE_URLhttp://host.docker.internal:11434 - OPENAI_API_BASE_URLhttp://host.docker.internal:3001/v1 - OPENAI_API_KEYsk-your-oneapi-token - WEBUI_SECRET_KEYchange_this_too extra_hosts: - host.docker.internal:host-gateway depends_on: - oneapi几个关键点解释一下。extra_hosts里的host.docker.internal:host-gateway是让容器内部能通过host.docker.internal这个主机名访问到宿主机Linux 下 Docker 默认不提供这个映射必须手动加。OneAPI 映射到宿主机的 3001 端口Open WebUI 映射到 3000 端口避免和 Ollama 的 11434 冲突。OPENAI_API_BASE_URL指向 OneAPI 的/v1路径这样 Open WebUI 就能把 OneAPI 当成一个 OpenAI 兼容接口来用。OPENAI_API_KEY先随便填一个占位等 OneAPI 里创建好令牌后再回来改。启动docker compose up -d docker compose ps看到两个容器都是running状态就对了。如果 OneAPI 起不来多半是SESSION_SECRET没设或者端口被占用docker compose logs oneapi看日志。3.1 OneAPI 渠道配置骨架浏览器打开http://你的机器IP:3001默认账号是root密码是123456第一次登录会强制你改密码。改完之后进「渠道」页面点「添加新的渠道」。渠道类型选「Ollama」名称随便写比如local-ollamaBase URL 填http://host.docker.internal:11434模型列表填你本地已经拉取的模型名比如qwen2:0.5b。如果你有多个模型用英文逗号隔开。保存之后点渠道右边的「测试」按钮如果右上角弹出绿色提示说明 OneAPI 已经能连上 Ollama 了。这时候再去「令牌」页面创建一个令牌复制那串sk-开头的 Key填回 docker-compose 里的OPENAI_API_KEY然后docker compose up -d openwebui重启一下 Open WebUI。如果你还想把 TaoToken 这类兼容 OpenAI 协议的服务也挂到同一个 OneAPI 下就在渠道类型里选「OpenAI」Base URL 填https://taotoken.net/apiKey 填你在 TaoToken 控制台创建的 API Key。这样调用方在 Open WebUI 里就能同时看到本地 Ollama 模型和远端模型切换模型不用改任何代码。TaoToken 的 API Key 可以在https://taotoken.net/api-keys这个地址管理具体接入方式参考https://taotoken.net/doc。4. 验证请求curl 打通 Ollama 原生 API 与 OneAPI 网关配置写完不算完得实际发请求验证。分两步走先验证 Ollama 原生接口再验证经过 OneAPI 的 OpenAI 兼容接口。4.1 直接调 Ollama 的 generate 接口curl http://localhost:11434/api/generate -d { model: qwen2:0.5b, prompt: 用一句话解释什么是 REST API, stream: false }如果返回的 JSON 里response字段有内容说明 Ollama 的生成接口正常。注意stream设为false时是一次性返回完整结果设为true会流式返回多行 JSON调试时建议先用false。4.2 调 Ollama 的 chat 接口curl http://localhost:11434/api/chat -d { model: qwen2:0.5b, messages: [ {role: user, content: 你好请介绍一下你自己} ], stream: false }这个接口的请求体结构和 OpenAI 的/v1/chat/completions很像区别是 Ollama 原生接口的路径是/api/chat返回结构里消息在message.content里。4.3 经过 OneAPI 调 OpenAI 兼容接口curl http://localhost:3001/v1/chat/completions \ -H Authorization: Bearer sk-你的OneAPI令牌 \ -H Content-Type: application/json \ -d { model: qwen2:0.5b, messages: [ {role: user, content: 用一句话解释什么是网关} ], stream: false }如果这一步返回了标准的 OpenAI 格式响应说明 OneAPI 到 Ollama 的链路完全通了。这时候任何支持 OpenAI SDK 的程序只要把 base_url 改成http://你的机器IP:3001/v1Key 换成 OneAPI 令牌就能直接调用本地模型。4.4 Open WebUI 界面确认浏览器打开http://你的机器IP:3000第一次访问会让你注册一个账号第一个注册的账号自动成为管理员。登录后在左上角模型选择器里应该能看到qwen2:0.5b选中它在输入框里发一条消息如果能正常回复三层链路就全部打通了。Open WebUI 的管理员面板里还能配置 TTS、图像生成等扩展功能如果你本地部署了 Stable Diffusion可以在设置里填上对应接口地址聊天时就能直接生成图片。这些属于进阶玩法先把基础对话跑通再说。5. 本篇常见错排查容器连不上 Ollama、OneAPI 测试失败、WebUI 模型列表为空这一节把我实际遇到过的几个典型问题列出来基本都是配置层面的照着改就能解决。问题一Open WebUI 里模型列表是空的或者提示连接 Ollama 失败。最常见的原因是OLLAMA_BASE_URL填成了http://localhost:11434。在容器内部localhost指的是容器自己不是宿主机。必须用host.docker.internal并且 docker-compose 里要有extra_hosts那段映射。如果还是不行进容器里手动测一下docker exec -it open-webui curl http://host.docker.internal:11434/api/tags如果这条命令报连接拒绝说明宿主机上的 Ollama 没有监听0.0.0.0回到 2.1 节改OLLAMA_HOST。问题二OneAPI 渠道测试提示「无效的令牌」或「连接失败」。先确认 Base URL 末尾没有多余的斜杠Ollama 渠道填http://host.docker.internal:11434就行不要加/api。再确认模型名和ollama list输出的完全一致大小写和冒号都不能错。如果 OneAPI 容器里访问不到宿主机同样是extra_hosts没配。问题三curl 调 OneAPI 返回 401。检查Authorization头里的令牌是不是 OneAPI 里创建的那个sk-开头的 Key不是 Ollama 的什么凭证。OneAPI 的令牌和渠道是两回事渠道负责连上游令牌负责给调用方鉴权。问题四端口冲突导致容器起不来。Ollama 占 11434OneAPI 我映射到 3001Open WebUI 映射到 3000。如果你机器上 3000 已经被别的服务占了改 docker-compose 里左边的端口号就行比如改成3002:8080。改完docker compose up -d会重建容器。问题五Open WebUI 重启后数据丢了。检查 volumes 映射的宿主机目录权限./openwebui-data需要容器内用户可写。如果用的是 root 跑 Docker一般没问题如果用了 rootless 模式可能需要chown一下。6. 把本地模型接进日常开发流从 API 到 Coding Plan三层搭完之后本地 Ollama 就不再是一个玩具了。任何支持 OpenAI 接口的工具都能接进来VS Code 里的 Continue 插件、各种 Agent 框架、自己写的脚本统一走 OneAPI 的http://你的机器IP:3001/v1就行。这样本地模型和远端模型在调用方式上完全一致切换模型只是改一个 model 名字的事。如果你主要用编码场景想让模型长期参与代码补全和 Agent 任务可以了解下 TaoToken 的 Coding Plan地址是https://taotoken.net/coding-plan。它和本地 Ollama 不冲突你可以把本地模型用于日常轻量对话把 Coding Plan 里的模型用于复杂代码任务两者都通过 OneAPI 统一管理。模型对话调试可以用https://taotoken.net/model-chat控制台在https://taotoken.net/console接入文档在https://taotoken.net/doc。这些地址配合本文的 docker-compose 配置基本能覆盖从本地部署到多模型统一接入的完整链路。最后提醒一句Ollama 的 API 文档在 GitHub 上更新挺快/api/generate和/api/chat之外还有/api/embed、/api/pull等接口做 RAG 应用时会用到 embedding 接口。建议把https://github.com/ollama/ollama/blob/main/docs/api.md存个书签遇到参数不确定的时候直接查。
返回列表