最近开始尝试用 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 API
  • base_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) 服务器

如果需要天气之类的实时信息,有两个选择:

  1. 切回云端 Codex(无 --profile),使用 GPT/o 系列的内置工具
  2. 配置 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 玩家和注重代码隐私的团队,这套方式至少是我目前用下来比较顺手的一种组合。

参考链接#