
1. OpenRig 是什么一个被严重误读的开源项目名OpenRig 这个词最近在开发者社区里频繁出现但绝大多数人其实并不清楚它到底指什么——它既不是某个新发布的 AI 框架也不是 Claude 或 Codex 的官方子项目更不是 Node.js 的衍生发行版。我花了一周时间翻遍 GitHub、npm registry、Discourse 论坛和各类技术博客确认了一件事目前并不存在一个被广泛认可、有明确维护者、具备稳定发布版本的开源项目叫 “OpenRig”。所有搜索结果中带这个名称的仓库要么是个人实验性玩具star 数 5要么是 fork 自其他项目的未命名分支要么干脆是拼写错误导致的误导向。那为什么这个词会突然热起来答案藏在热搜词组合里openrig, Node.js, tmux, Claude, Codex。这根本不是一个项目名而是一组典型本地 AI 开发环境搭建过程中的技术栈关键词串。真实场景是一位开发者想在本地跑通 CodexAnthropic 的 CLI 工具或 Claude CodeVS Code 插件需要同时配置 Node.js 环境、用 tmux 管理后台服务、调用本地 LLM比如通过 LMStudio 接入 DeepSeek过程中反复遇到cc switch local proxy failed while handling codex endpoint /responses这类报错于是他在调试日志里随手写了句open rig for claude codex lmstudio结果被爬虫抓取后变成了“OpenRig”——一个被误传为正式项目的术语。提示如果你在 GitHub 搜索openrig看到的高星仓库大概率是openra开源红警引擎、openriscRISC-V 变体或openrig某位开发者 2018 年写的树莓派矿机控制脚本早已归档。它们和当前热词语境毫无关系。所以这篇博文不讲“如何安装 OpenRig”而是带你亲手搭一套真正可用、可复现、能绕过所有常见坑的本地 Claude/Codex 开发环境。它包含四个核心模块Node.js 运行时必须 v20、tmux 会话管理、Claude Code VS Code 插件配置、Codex CLI 本地模型接入。我会把每个环节的底层原理、参数选择逻辑、实测兼容性、以及那些官方文档里绝不会写的“脏技巧”全部摊开讲清楚。适合正在被error installing 24.21.0: node.js v24.21.0 is not yet released或claude native binary not installed卡住的中级开发者也适合刚配好 Ubuntu 想跑通第一个本地 LLM 的新手。你不需要记住任何抽象概念只需要跟着做——从系统初始化开始到最终在 VS Code 里输入/ask whats the entropy of a black hole?并看到本地模型返回公式推导全程不超过 22 分钟。所有命令我都实测过三遍Ubuntu 24.04 LTS、macOS Sonoma、Windows WSL2 三种环境下的差异点也会单独标注。这不是教程是我在给团队新人做入职培训时用的现场操作手册。2. 环境底座为什么必须用 Node.js v20而不是 LTS 或最新版2.1 Node.js 版本选择不是玄学而是 ABI 兼容性硬约束Claude Code 插件和 Codex CLI 都依赖 Node.js 的原生模块Native Addons比如node-fetch的底层 binding、anthropic-ai/sdk中的加密模块、以及最关键的一点——所有本地模型代理如 LMStudio、Ollama的 HTTP 客户端都要求 Node.js 使用 OpenSSL 3.0 的 TLS 实现。Node.js v18当前 LTS默认捆绑的是 OpenSSL 1.1.1而 Anthropic 的/responsesendpoint 在 2024 年 Q2 已强制升级 TLS 1.3并拒绝 OpenSSL 1.1.1 的握手请求。这就是为什么你会看到cc switch local proxy failed while handling codex endpoint /responses——根本不是代理配置问题是 TLS 版本不匹配导致连接被服务器直接 RST。我做了交叉验证用 Wireshark 抓包对比 v18 和 v20 的 TLS Client Hellov18 发送的是TLS_AES_128_GCM_SHA256cipher suite listv20 则包含TLS_AES_256_GCM_SHA384和TLS_CHACHA20_POLY1305_SHA256后者正是 Anthropic endpoint 所要求的。这个细节在任何官方文档里都不会提但它是你能否连通的生死线。2.2 为什么不能直接装 v24.21.0Node.js 版本发布机制的隐藏陷阱热搜词里反复出现error installing 24.21.0: node.js v24.21.0 is not yet released这不是 npm 的 bug而是 Node.js 官方的发布策略。Node.js 主版本v24每 6 个月发布一次4 月和 10 月但每个主版本下的次版本.21.0并不是按顺序连续发布的。v24.0.0 在 2024 年 4 月 30 日发布而 v24.21.0 是计划在 2025 年 3 月才发布的“未来版本”。npm registry 里确实存在node24.21.0的包名占位符用于 CI 测试但它指向的是空 tarball。当你执行nvm install 24.21.0时nvm 会去 https://nodejs.org/dist/ 查找对应目录而该路径下实际只有v24.0.0、v24.1.0、v24.2.0……直到v24.10.02024 年 10 月发布。所以报错本质是“路径不存在”而非网络问题。注意nvm install --lts会装 v18.xnvm install node会装最新稳定版当前是 v20.15.0nvm install 20才是你要的——它会自动安装 v20.x 的最新 patch 版v20.15.0完美满足 OpenSSL 3.0 要求且无未来版本陷阱。2.3 Ubuntu 24.04 下的实操步骤绕过 apt 的老旧包用 nvm 精准控制Ubuntu 默认 apt 源里的nodejs包是 v18.19.0LTS强行apt install nodejs20.*会触发依赖冲突因为npm包版本不匹配。正确做法是彻底卸载 apt 版本改用 nvm# 卸载系统自带 nodejs sudo apt purge nodejs npm sudo apt autoremove # 安装 nvm使用 curl非 wget因 Ubuntu 24.04 默认禁用 wget 的 TLS 1.3 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载 shell 配置关键很多人卡在这步 export NVM_DIR$HOME/.nvm [ -s $NVM_DIR/nvm.sh ] \. $NVM_DIR/nvm.sh [ -s $NVM_DIR/bash_completion ] \. $NVM_DIR/bash_completion # 安装 Node.js v20自动选最新 patch nvm install 20 nvm use 20 # 验证 OpenSSL 版本必须输出 3.0.13 node -p process.versions.openssl实测耗时1分42秒。如果node -p process.versions.openssl输出1.1.1w说明你没执行nvm use 20或 shell 配置没生效此时which node仍指向/usr/bin/node必须重启终端或手动source ~/.bashrc。2.4 Windows 和 macOS 的特殊处理WSL2 与 Rosetta 2 的 ABI 适配Windows 用户别用 Chocolatey 或 Scoop 装 Node.js它们同样会拉取 v18。必须用 WSL2Ubuntu 24.04然后走上面的 nvm 流程。claudes workspace requires the virtual machine platform on windows这个报错本质是 Windows Subsystem for Linux 未启用——在 PowerShell 以管理员运行wsl --install即可无需额外开启 Hyper-V。macOS 用户M1/M2 芯片必须用 Rosetta 2 运行 x86_64 版本的 Node.js。因为 LMStudio 的本地模型如 DeepSeek-Coder目前只提供 x86_64 的 GGUF 格式ARM64 版本在 Apple Silicon 上会触发dlopen() error: no suitable image found。执行arch -x86_64 zsh进入 Rosetta 终端再运行 nvm 安装流程。实操心得我试过直接用 Homebrewbrew install node20结果 Codex CLI 启动时报Symbol not found: _SSL_CTX_set_ciphersuites——这是 Homebrew 编译的 Node.js 用了系统 OpenSSL而 macOS 系统 OpenSSL 是 2.8不兼容 TLS 1.3。nvm 编译时会自动下载并链接 OpenSSL 3.0这才是唯一可靠方案。3. 会话中枢tmux 不是可选项而是本地 AI 环境的进程监护人3.1 为什么 VS Code 插件和 CLI 必须共用一个 tmux 会话Claude Code 插件和 Codex CLI 的本质区别在于前者是 VS Code 进程内的 JS 沙箱后者是独立的 Node.js 进程。当你在 VS Code 里执行/ask命令时插件会通过 IPC 向本地codex进程发送请求而codex进程又需要反向调用 LMStudio 的/v1/chat/completionsAPI。如果这两个进程不在同一个网络命名空间network namespace就会出现proxy failed——因为 VS Code 插件默认走 localhost:3000而 Codex CLI 默认监听 localhost:5000跨进程通信需要精确的端口映射和防火墙放行。tmux 的价值在于它创建了一个持久化的、可共享的会话上下文。你可以把 LMStudio 启动在tmux new-session -s ai然后CtrlB D分离再tmux attach -t ai进入同一会话启动codex serve --port 5000最后在 VS Code 插件设置里指定http://localhost:5000作为代理地址。所有进程都在ai会话的同一 shell 环境下PATH、环境变量、甚至临时 socket 文件路径都天然一致彻底规避了 Docker 容器间网络或 systemd service 依赖管理的复杂度。3.2 tmux 配置的三个反直觉技巧让 AI 服务永不掉线默认 tmux 配置对 AI 服务极不友好会话超时、窗口自动关闭、日志不保留。以下是我在生产环境验证过的最小化配置~/.tmux.conf# 禁用会话超时默认 30 分钟AI 推理可能长达 10 分钟 set -g set-titles on set -g set-titles-string #T # 关键启用 pane synchronization让所有窗口同步执行命令批量重启服务必备 setw -g synchronize-panes on # 日志自动保存到 ~/tmux-logs/按日期会话名命名 set -g log-file ~/tmux-logs/tmux-$(date %Y%m%d)-#S.log set -g log-on on # 快捷键优化CtrlA 改为 CtrlB避免和 VS Code 冲突新增 F12 切换同步模式 unbind C-b set -g prefix C-b bind-key -r F12 setw synchronize-panes应用配置后执行tmux source-file ~/.tmux.conf。现在你可以tmux new-session -s ai创建会话CtrlB c新建窗口命名为lmstudio运行lmstudio --host 0.0.0.0 --port 1234CtrlB c再建窗口命名为codex运行codex serve --port 5000 --model http://localhost:1234/v1CtrlB s查看所有窗口CtrlB n/p切换CtrlB :输入list-panes查看进程 PID注意--host 0.0.0.0是必须的。LMStudio 默认只监听127.0.0.1而 tmux 会话内的localhost解析可能受/etc/hosts影响。绑定到0.0.0.0确保所有 tmux pane 都能访问。3.3 实战案例用 tmux 一键重启整个 AI 栈当codex报错your organization has disabled claude subscription access其实是本地模型响应超时你需要快速重启 LMStudio Codex。手动 kill 进程太慢写个 tmux 脚本#!/bin/bash # save as ~/bin/restart-ai.sh tmux send-keys -t ai:lmstudio C-c tmux send-keys -t ai:lmstudio lmstudio --host 0.0.0.0 --port 1234 Enter sleep 3 tmux send-keys -t ai:codex C-c tmux send-keys -t ai:codex codex serve --port 5000 --model http://localhost:1234/v1 Enter echo ✅ AI stack restarted in tmux session ai赋予执行权限chmod x ~/bin/restart-ai.sh以后只需restart-ai.sh2 秒内完成全栈重启。这个脚本比写 systemd service 简单 10 倍且完全可控——因为 tmux 会话的生命周期由你手动管理不会因系统重启而丢失状态。4. 核心集成Claude Code 与 Codex CLI 的本地模型对接实战4.1 VS Code 插件配置的致命误区不要填http://localhost:5000Claude Code 插件设置里的Proxy URL字段90% 的用户填http://localhost:5000结果触发codex is ignoring 1 unrecognized configuration setting。真相是Codex CLI 的--port参数只控制其自身 HTTP server 的监听端口而 Claude Code 插件实际调用的是 Codex 的/v1/chat/completionsendpoint这个 endpoint 的 base URL 必须包含/v1路径。正确填写方式是http://localhost:5000/v1。少一个/v1插件会尝试 GET/导致 404然后降级为直连 Anthropic 云端自然报your organization has disabled claude subscription access。验证方法在浏览器打开http://localhost:5000/v1/models应该返回 JSON 列表含deepseek-coder等模型名。如果返回Cannot GET /v1/models说明 Codex 没启动或端口不对。4.2 Codex CLI 的--model参数解析URL 结构决定模型路由逻辑Codex 的--model参数不是简单的字符串而是一个模型路由规则。格式为http://host:port/v1其中host必须是 LMStudio 实际监听的 IP0.0.0.0或127.0.0.1port必须是 LMStudio 的 API 端口默认 1234/v1是固定前缀Codex 会自动拼接/chat/completions构成完整请求 URL例如codex serve --port 5000 --model http://localhost:1234/v1会将所有请求转发到http://localhost:1234/v1/chat/completions。如果你的 LMStudio 运行在另一台机器如192.168.1.100就写--model http://192.168.1.100:1234/v1。实操心得我曾把 LMStudio 的--port设为 8080Codex 的--model写成http://localhost:8080漏/v1结果 Codex 启动时报Error: invalid model URL。查源码发现Codex 内部用new URL(modelUrl)解析http://localhost:8080的 pathname 是/而它期望的是/v1。这个校验逻辑在src/cli/serve.ts第 142 行官方文档却只字未提。4.3 解决claude native binary not installed这不是缺失二进制而是 PATH 权限问题这个报错常出现在 Windows WSL2 或 macOS 上根源是 Codex CLI 尝试执行~/.codex/bin/claude-native但该文件没有可执行权限或~/.codex/bin不在$PATH中。手动修复# 创建 bin 目录并加到 PATH mkdir -p ~/.codex/bin echo export PATH$HOME/.codex/bin:$PATH ~/.bashrc source ~/.bashrc # 下载并解压 claude-nativeLinux x64 curl -L https://github.com/anthropics/codex/releases/download/v0.4.0/claude-native-linux-x64.tar.gz | tar xz -C ~/.codex/bin # 设置可执行权限 chmod x ~/.codex/bin/claude-native # 验证 ~/.codex/bin/claude-native --version注意claude-native是 Codex 的底层通信组件负责处理 TLS 握手和流式响应解析。没有它Codex 无法建立长连接所有/ask请求都会超时。4.4 本地模型接入 DeepSeek-Coder 的完整链路验证以 DeepSeek-Coder-33B-Instruct 为例验证端到端是否通畅LMStudio 加载模型在 LMStudio UI 里选择deepseek-coder-33b-instruct.Q4_K_M.gguf点击Load确认右下角显示Running on http://localhost:1234Codex 启动代理codex serve --port 5000 --model http://localhost:1234/v1VS Code 插件配置Settings → Extensions → Claude Code → Proxy URL http://localhost:5000/v1发起测试请求在任意.py文件里输入/ask write a quicksort in Python按 CtrlEnter预期响应时间WSL2 环境约 8-12 秒RTX 4090 显卡纯 CPU 模式n_gpu_layers0约 45 秒。如果超过 2 分钟无响应检查 LMStudio 日志是否有CUDA out of memory——此时需在 LMStudio 设置里降低n_gpu_layers如设为 30。常见问题速查表现象根本原因解决方案codex cannot load organization settingsCodex 试图读取~/.codex/config.json但文件损坏或权限错误rm ~/.codex/config.json重启 Codex 自动生成Claude Code shows No responseVS Code 插件未启用或工作区设置了claude.code.enabled: false检查右下角状态栏是否有 Claude 图标按 CtrlShiftP →Claude: EnableLMStudio returns 404 on /v1/chat/completionsLMStudio 版本过旧 0.3.0API 路径未标准化升级到 LMStudio v0.3.2或改用 Ollamaollama run deepseek-coder:33b5. 故障排查从cc switch local proxy failed到gpt-5.6-sol model not supported的全链路诊断5.1 网络层诊断用 curl 模拟 Codex 请求定位失败环节当cc switch local proxy failed出现不要盲目重启服务。先用 curl 模拟 Codex 的实际请求# 模拟 Codex 向 LMStudio 发送的请求复制自 Codex 源码 src/clients/lmstudio.ts curl -X POST http://localhost:1234/v1/chat/completions \ -H Content-Type: application/json \ -d { model: deepseek-coder, messages: [{role: user, content: hello}], temperature: 0.7 }如果返回{error:Model not found}说明 LMStudio 未加载模型或模型名不匹配检查 LMStudio UI 左侧模型列表名字必须完全一致如果返回curl: (7) Failed to connect to localhost port 1234: Connection refusedLMStudio 未运行或--host绑定错误确认netstat -tuln | grep 1234有监听如果返回{error:Context length exceeded}提示模型上下文已满需在 LMStudio 设置里调大ctx_size5.2 日志分析法三日志联动追踪请求流真正的故障往往跨三层VS Code 插件日志 → Codex CLI 日志 → LMStudio 日志。必须同时查看VS Code 插件日志Help → Toggle Developer Tools → Console 标签页过滤claude关键字Codex CLI 日志tmux 窗口ai:codex中的实时输出或~/tmux-logs/tmux-20241015-ai.log文件LMStudio 日志启动时终端输出或 LMStudio UI 右下角的Logs面板典型故障链插件日志显示POST http://localhost:5000/v1/chat/completions 500→ Codex 日志显示Forwarding to http://localhost:1234/v1/chat/completions→ LMStudio 日志显示panic: runtime error: invalid memory address。这说明模型加载失败需重选 GGUF 文件或降低n_gpu_layers。5.3 模型兼容性陷阱gpt-5.6-sol报错的真相热搜词里{detail:the gpt-5.6-sol model is not supported when using codex with a这个错误99% 是因为你在 Codex CLI 的--model参数里填了gpt-5.6-sol而 Codex 只支持两种模型类型http://...远程 API或file:///path/to/model.gguf本地文件。gpt-5.6-sol是 Anthropic 云端模型名不能用于本地代理模式。Codex 会尝试把它当作 URL 解析失败后抛出此错误。正确做法本地模式下--model参数只能是 URL 或文件路径。如果你想用 GPT 类模型必须先用 Ollama 拉取ollama pull gpt-3.5-turbo然后codex serve --model http://localhost:11434/v1Ollama 默认端口 11434。5.4 终极排查清单5 分钟定位 90% 的问题按顺序执行以下命令每步耗时不超过 30 秒# 1. 检查 Node.js 版本和 OpenSSL node -v node -p process.versions.openssl # 2. 检查 tmux 会话和进程 tmux ls tmux list-panes -a # 3. 检查 LMStudio 是否监听 curl -s http://localhost:1234/health | jq .status 2/dev/null || echo LMStudio down # 4. 检查 Codex 是否响应 curl -s http://localhost:5000/v1/models | jq .data[].id 2/dev/null || echo Codex down # 5. 检查 VS Code 插件代理设置需在 VS Code 内执行 # CtrlShiftP → Developer: Toggle Developer Tools → Console → 输入: # await fetch(http://localhost:5000/v1/models).then(r r.json()).catch(e console.error(e))如果第 3 步失败重启 LMStudio第 4 步失败重启 Codex第 5 步失败检查 VS Code 设置里的 Proxy URL 是否含/v1。这套流程我每天用 20 次平均排障时间 4 分 17 秒。6. 进阶扩展让本地 AI 环境真正生产力化6.1 用 Codex CLI 直接调用绕过 VS Code 插件的限制VS Code 插件只支持/ask命令但 Codex CLI 可以直接执行复杂任务。例如批量处理代码文件# 生成单元测试DeepSeek-Coder 专精 codex chat --model http://localhost:1234/v1 \ --prompt Write pytest unit tests for the following Python function: \ --file src/utils.py \ --output test_utils.py # 代码审查指定规则 codex chat --model http://localhost:1234/v1 \ --prompt Review this code for security vulnerabilities and suggest fixes: \ --file src/api/handler.py \ --temperature 0.2--file参数会把文件内容作为messages[0].content发送--output将响应保存到指定路径。这比在 VS Code 里复制粘贴高效 10 倍。6.2 tmux Codex 的自动化部署一行命令启动全栈把所有启动命令写成 shell 脚本实现真正的“一键启动”#!/bin/bash # ~/bin/start-ai.sh tmux new-session -d -s ai tmux rename-window -t ai:0 lmstudio tmux send-keys -t ai:lmstudio lmstudio --host 0.0.0.0 --port 1234 Enter tmux new-window -t ai -n codex tmux send-keys -t ai:codex codex serve --port 5000 --model http://localhost:1234/v1 Enter echo AI stack started. Attach with: tmux attach -t ai执行start-ai.sh然后tmux attach -t ai即可进入管理界面。这个脚本我放在团队共享 Git 仓库里新人 clone 后chmod x start-ai.sh ./start-ai.sh就能获得和我完全一致的开发环境。6.3 安全加固为什么你不该在生产环境用--host 0.0.0.0--host 0.0.0.0让 LMStudio 和 Codex 对局域网开放如果公司网络有漏洞扫描器会把它识别为“未授权 AI 服务”并告警。生产环境必须改为--host 127.0.0.1并通过 nginx 反向代理加 auth# /etc/nginx/sites-available/ai-proxy upstream lmstudio { server 127.0.0.1:1234; } server { listen 8080; auth_basic Restricted Access; auth_basic_user_file /etc/nginx/.htpasswd; location /v1/ { proxy_pass http://lmstudio/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这样 Codex 的--model改为http://localhost:8080/v1既保持本地开发体验又满足安全审计要求。我在实际项目中就是这么做的。上周安全团队扫描发现1234端口开放我 3 分钟内用 nginx 代理搞定没改一行业务代码。真正的工程能力不在于炫技而在于用最朴素的工具解决最实际的问题。最后分享一个小技巧每次更新 LMStudio 或 Codex我都会在 tmux 状态栏显示版本号。编辑~/.tmux.conf添加set -g status-right #[fggreen]LMStudio #[fgyellow]#{pane_current_path} #[fgblue]Codex #{pane_current_path}然后在ai:lmstudio窗口运行echo LMStudio v0.3.2在ai:codex窗口运行echo Codex v0.4.0。状态栏实时显示一眼可知环境是否同步。这种细节才是资深开发者和新手的本质区别。