一句话:如果你本地/内网有 Ollama(跑 llama、qwen、deepseek 之类),但又想让各种工具“像用 OpenAI 一样用”,那就需要一个 OpenAI 兼容的网关。
这篇写的是 ollama2api:把多个 Ollama 实例聚合成统一的 OpenAI API(/v1/chat/completions、/v1/models),还能做健康检查和简单负载均衡。最后再把它接进 OpenClaw,让你在 Telegram/Control UI 里直接用本地大模型。
🧾 你需要什么
- 一台 Linux 服务器(Ubuntu/Debian 都行)
- Docker(推荐)
- 一台(或多台)已经装好 Ollama 的机器(同机也可以)
- (可选)OpenClaw:如果你想从 Telegram/控制台调用模型
⚠️ 注意注意注意(重要)
- 默认不要把 ollama2api 直接暴露公网。建议先只监听
127.0.0.1,需要外网访问再走 Nginx 反代 + 认证。 - 仓库里提到的“扫描发现/masscan”属于网络扫描工具。只允许用于你自己或已授权的主机/网段。
🚀 第一部分:部署 Ollama2API(Docker Compose)
1)装 Docker(Ubuntu/Debian 简单版)
你已经有 Docker 就跳过。
apt update -y
apt install -y docker.io git
systemctl enable docker --now
docker version
2)拉代码
cd /root
git clone https://github.com/xiaolajiaoyyds/ollama2api
cd ollama2api
3)改一下端口绑定(强烈建议:先只监听本机)
仓库的 docker-compose.yml 默认是 8001:8001,这会把端口暴露到 0.0.0.0。建议改成只监听回环:
# 把 ports 这一行改成:
# - "127.0.0.1:8001:8001"
sed -i 's/- "8001:8001"/- "127.0.0.1:8001:8001"/g' docker-compose.yml
grep -n "8001" -n docker-compose.yml
补充:compose 里有 cap_add: NET_RAW(通常用于扫描/探测之类功能)。如果你明确不需要扫描能力,也可以先去掉它,减少权限暴露面。
4)启动
docker compose up -d
docker ps --format 'table {{.Names}} {{.Status}} {{.Ports}}'
docker logs -n 50 ollama2api --tail 50
5)验证服务
# 健康检查
curl -sS http://127.0.0.1:8001/health
# 模型列表(可能为空/或默认)
curl -sS http://127.0.0.1:8001/v1/models | jq .
6)管理后台
后台入口通常是:
http://127.0.0.1:8001/admin
首次部署后建议第一时间修改管理员密码(仓库说明支持通过环境变量 ADMIN_PASSWORD 或在后台修改,按你实际版本为准)。
🧠 第二部分:把 Ollama 节点接进来(不扫网段,手动添加最稳)
我建议 0 基础就走“手动添加后端”,别先碰扫描功能。
1)先确认你的 Ollama 正常
在 Ollama 那台机器上:
ollama --version
ollama list
确认 Ollama API 可访问(默认 11434)。如果你是在同一台机器上跑 ollama2api:
curl -sS http://127.0.0.1:11434/api/tags | head
2)在 ollama2api 后台添加后端
进 /admin,找到后端管理(节点/Backends),把你的 Ollama 地址加进去,例如:
http://127.0.0.1:11434(同机)http://192.168.1.10:11434(内网 Ollama)
加完后,再回到终端看 /v1/models 有没有出现你的模型名(例如 qwen2.5:latest、llama3:latest 这种)。
🦞 第三部分:把 Ollama2API 接入 OpenClaw(重点:baseUrl 指向 /v1)
1)先确认 ollama2api 是 OpenAI 兼容的
curl -sS http://127.0.0.1:8001/v1/models | jq .
2)OpenClaw 配置(示意模板)
编辑 OpenClaw 配置文件(例如 root):/root/.openclaw/openclaw.json
最关键的只有两点:
providers.XXX.baseUrl必须写到.../v1- 模型 id 以
/v1/models返回为准
{
"models": {
"mode": "merge",
"providers": {
"ollama2api": {
"baseUrl": "http://127.0.0.1:8001/v1",
"apiKey": "",
"api": "openai-completions",
"models": [
{"id": "qwen2.5:latest", "name": "Qwen2.5", "contextWindow": 8192, "maxTokens": 2048}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "ollama2api/qwen2.5:latest"
},
"timeoutSeconds": 1800
}
}
}
说明:如果你的 ollama2api 启用了 API Key 鉴权,就把 apiKey 填上;如果没启用,就留空即可。
改完验证配置:
openclaw config validate
重启 Gateway 后生效:
systemctl restart openclaw-gateway
systemctl status openclaw-gateway --no-pager
🌐 第四部分:(可选)反代到域名,给后台加个门
如果你要从外网打开 ollama2api 的后台或 API,建议:
- 继续保持容器只监听
127.0.0.1:8001 - Nginx 反代到域名,并加 BasicAuth/IP 白名单
示例(只做思路):
location / {
auth_basic "ollama2api";
auth_basic_user_file /path/to/htpasswd;
proxy_pass http://127.0.0.1:8001;
}
🧯 最后:我建议你按这个顺序排障
curl http://127.0.0.1:8001/health是否通curl http://127.0.0.1:8001/v1/models是否能看到模型- Ollama 节点本身是否可达(11434)
- OpenClaw provider 的
baseUrl是否写成.../v1
按这个顺序基本能很快定位问题。