Codex CLI 对接远程 Ollama
目录
最近开始尝试用 AI agent 来帮我处理一些相对明确的自动化分析和整理任务。论模型能力,GitHub Copilot 免费提供的 GPT-5 mini 可能比我本地部署的模型更强,但它有速率限制,跑多了就被限。本地模型的好处在于不受限制,而且可以自己调整参数和提示词来适应具体的需求场景。
我的 Homelab 服务器上正好跑着 Ollama,于是就想能不能让本地的 Codex CLI 直接用远程服务器的模型来干活。试了一圈后找到了可行的配置方式,这里记录一下。
整体架构#
本地 MacBook (Codex CLI)
│
│ Tailscale 虚拟局域网
│ http://100.x.x.x:11434/v1
▼
远程 Homelab (Ollama)
│
├── qwen3.5:latest (日常编码)
├── gemma4:26b (深度推理)
└── gemma4:31b (复杂架构设计)
Tailscale 负责打通网络,Ollama 提供 OpenAI 兼容 API,Codex CLI 通过自定义 Provider 接入远程模型。请求流量都留在 Tailnet 内,至少不需要经过公网转发。
远程服务器:Ollama 配置#
1. 允许监听所有网卡#
Ollama 默认只监听 127.0.0.1,如果你想让它接受来自 Tailscale 网卡的请求,通常要改为监听 0.0.0.0。
如果你用 systemd 管理 Ollama,创建 override 配置:
sudo systemctl edit ollama.service
在 [Service] 段添加:
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"
Environment="OLLAMA_KEEP_ALIVE=-1"
Environment="OLLAMA_NUM_PARALLEL=4"
几个关键参数:
OLLAMA_HOST=0.0.0.0— 允许从 Tailscale IP 访问OLLAMA_KEEP_ALIVE=-1— 模型加载后常驻内存,避免每次请求重新加载(对 20GB+ 的大模型尤其重要)OLLAMA_NUM_PARALLEL=4— 允许并发处理多个请求,Codex CLI 的 Agent 循环会频繁发请求,这个值通常能减少排队等待
保存后重启服务:
sudo systemctl daemon-reload && sudo systemctl restart ollama
2. 下载所需模型#
ollama pull qwen3.5:latest # 9.7B,日常编码主力
ollama pull gemma4:26b # 25.8B,深度架构推理
qwen3.5 对 Java/Spring Boot、Go、K8s YAML 的支持很好,响应也快;gemma4:26b 适合做复杂的分布式系统设计、支付链路编排之类的深度推理。
3. 验证远程可访问#
在本地终端测试(IP 替换为你的 Tailscale 地址):
curl http://100.89.15.120:11434/api/tags
返回模型列表即说明 Ollama 已正确监听。再测一次 OpenAI 兼容接口:
curl http://100.89.15.120:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.5:latest",
"messages": [{"role": "user", "content": "Say hello"}],
"stream": false
}'
本地配置:Codex CLI 对接远程 Ollama#
关键认知#
Codex CLI 有一个容易踩的坑:我这里不建议直接用 ollama 作为 Provider 名称。
当你使用 --oss 标志或将 provider 命名为 ollama 时,Codex 会硬编码检查本地 localhost:11434 是否有运行中的 Ollama。远程服务器当然通不过这个检查,于是你会看到:
Error: No running Ollama server detected. Start it with: ollama serve
正确做法是自定义 Provider 名称 + 使用 Profile。
创建配置文件#
编辑 ~/.codex/config.toml:
# === 自定义远程 Ollama Provider ===
# 注意:这里先别用 "ollama" 这个名字,否则会触发本地检查
[model_providers.remote-ollama]
name = "Remote Ollama (Tailscale)"
base_url = "http://100.89.15.120:11434/v1"
wire_api = "responses" # Codex 使用 Responses API
# === 编码工作 Profile ===
[profiles.remote]
model_provider = "remote-ollama"
model = "qwen3.5:latest"
reasoning_effort = "medium"
# === 可选:设为默认 Profile ===
[default]
model_provider = "remote-ollama"
model = "qwen3.5:latest"
几个要点:
- Provider 名称用
remote-ollama(或者任意非ollama的名字)绕过本地检查 wire_api = "responses"在我这次配置里是必需的,因为新版 Codex CLI 默认使用 OpenAI Responses APIbase_url末尾需要带上/v1,这是 Ollama 的 OpenAI 兼容路径
使用方式#
# 使用指定 Profile
codex --profile remote
# 或者直接运行(如果已设为 default)
codex
# 一次性命令模式
codex --profile remote "用 Spring Boot 3.4 写一个带参数校验的高并发支付接口"
建议在 ~/.zshrc 里加个 alias:
alias codexr='codex --profile remote'
之后直接 codexr 就进入远程 AI 编码助手模式。
废弃的环境变量方式#
早期可以通过 OPENAI_BASE_URL 环境变量配置,但新版 Codex CLI 已经标记为废弃,启动时会提示:
⚠ OPENAI_BASE_URL is deprecated. Set openai_base_url in config.toml instead.
我现在更倾向于使用 config.toml 的方式,更清晰也更容易版本管理。
模型选择建议#
| 场景 | 我当前更常用的模型 | 原因 |
|---|---|---|
| 日常编码、代码审查、写测试 | qwen3.5:latest (9.7B) |
加载快、对 Java/Go/K8s 支持好 |
| 架构设计、分布式系统推理 | gemma4:26b (25.8B) |
更强的深度推理能力 |
| 复杂支付链路、Saga 模式设计 | gemma4:31b (31.3B) |
最大上下文理解力,但首次加载需 15-40 秒 |
本地模型 vs 远程模型的能力边界#
远程 Ollama 上的模型(Qwen3.5、Gemma4 等)擅长:
- 代码生成、重构、补全
- 架构设计评审
- 写测试用例
- 解释复杂逻辑(如并发 Bug、分布式追踪)
- K8s manifest、Helm Chart 编写
不擅长的:
- 实时数据查询(天气、股票、新闻)— 本地模型没有内置工具调用能力
- 网页浏览 — 需要额外配置 MCP (Model Context Protocol) 服务器
如果需要天气之类的实时信息,有两个选择:
- 切回云端 Codex(无
--profile),使用 GPT/o 系列的内置工具 - 配置 MCP Server 为本地模型添加工具能力(适合对隐私要求高的场景)
性能优化#
远程 Ollama 常驻模型#
如果频繁使用,OLLAMA_KEEP_ALIVE=-1 基本会很有帮助。否则每次请求间隔稍长,Ollama 就会卸载模型,下次又要重新从磁盘加载。对于 20GB+ 的 Gemma 模型,加载时间可达 30-40 秒。
Tailscale 直连检查#
偶尔 Tailscale 会回退到 DERP 中继(延迟升高),可以检查连接状态:
tailscale status
如果看到 relay 字样而非 direct,说明走了中继。Homelab 场景下确保两端 UDP 连通即可。
SSH 隧道备选方案#
如果 Tailscale 出现 MTU 或分包问题,可以退回到 SSH 隧道:
ssh -L 11434:localhost:11434 user@remote-ip -N
然后 base_url 改为 http://127.0.0.1:11434/v1 即可。这种方式更稳定,但需要多维持一条 SSH 连接。
总结#
这套方案的核心优势:
- 零数据外泄 — 所有流量走 Tailscale 虚拟局域网,不经过公网
- 模型自选 — 按需切换 Qwen/Gemma 等不同模型,无需改代码
- 成本可控 — 一次投入硬件,后续无限调用
- 开发体验一致 — Codex CLI 的交互体验与云端无异,只是延迟略高几十毫秒
对于 Homelab 玩家和注重代码隐私的团队,这套方式至少是我目前用下来比较顺手的一种组合。