1. Linux 云虚主机上跑 opencode卡在哪一步opencode 是一个跑在终端里的 AI 编码代理能读文件、改代码、执行 bash适合把它丢到一台长期在线的 Linux 云虚主机上本地用浏览器或客户端连过去用。它本身是 Node 生态的 CLI 工具安装动作不复杂真正让人反复折腾的是三件事Node 环境装完node -v没反应、opencode命令找不到、以及云虚主机出网受限导致模型请求一直转圈。这篇就按「从零到能对话」的顺序走一遍先把 Node/npm 装好并做软链接再全局装 opencode然后用 TaoToken 的统一 Key 和 API 通道把模型提供者配进去最后用一条 curl 和一次opencode serve验证连通性。全程命令可直接复制配置骨架也给全适合第一次在 Linux 云虚主机上部署 opencode 的人跟做。需要提前说明的是云虚主机常见的网络策略是只放行特定出口所以「本地能跑、服务器上模型连不上」是高频现象。下面第 4 节的配置就是专门解决这个的别跳过。2. 前置准备Node、npm 与 TaoToken 统一 Key2.1 装 Node 并让 node/npm 全局可用去 Node 官网下载页找 Linux 的 x64 压缩包比如node-v24.14.1-linux-x64.tar.xz上传到云虚主机后解压到/usr/localcd /usr/local/ mkdir -p node tar -xvf node-v24.14.1-linux-x64.tar.xz -C /usr/local/node/ --strip-components1注意这里加了--strip-components1它会把压缩包里的顶层目录剥掉让bin/、lib/直接落在/usr/local/node/下。不加的话路径会变成/usr/local/node/node-v24.14.1-linux-x64/bin后面软链接就容易指错。接着把 bin 目录写进 PATH比一个个建软链接省事echo export PATH$PATH:/usr/local/node/bin /etc/profile source /etc/profile node -v npm -v两条命令都能打印版本号说明环境就绪。如果node -v报 command not found先cat /etc/profile | tail -3确认那行 PATH 真的写进去了再重新source。2.2 装 opencode 本体npm install -g opencode-ai npm update -g opencode-ai which opencodewhich opencode正常会输出/usr/local/node/bin/opencode。如果输出为空说明 npm 的全局 bin 目录不在 PATH 里用npm config get prefix看一下实际前缀再把对应的bin加进 PATH 即可。2.3 拿 TaoToken 的 Key 和接入地址模型通道这块用 TaoToken 统一处理好处是一个 Key 走通多种模型不用在服务器上分别维护各家凭证。到控制台创建 API Key控制台入口https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteKey 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewriteAPI 基地址统一用https://taotoken.net/api这个地址不加 UTM 参数。把 Key 存成环境变量别硬编码进配置文件echo export TAOTOKEN_API_KEY你的Key /etc/profile source /etc/profile3. 可复制配置opencode.json 与环境变量opencode 的配置文件默认在~/.config/opencode/opencode.json没有就新建mkdir -p ~/.config/opencode vim ~/.config/opencode/opencode.json下面这份骨架把工具权限、模型提供者都写好了options里的baseURL指向 TaoToken 的 API 地址apiKey用环境变量引用避免明文落盘{ $schema: https://opencode.ai/config.json, theme: opencode, autoupdate: true, tools: { write: true, bash: true, read: true, edit: true, glob: true, grep: true }, permission: { webfetch: allow, bash: ask, edit: ask, skill: allow }, provider: { taotoken: { npm: ai-sdk/openai-compatible, name: TaoToken, options: { baseURL: https://taotoken.net/api, apiKey: {env:TAOTOKEN_API_KEY} }, models: { claude-sonnet-4-5: { name: Claude Sonnet 4.5 } } } } }几个容易踩的点npm字段必须是ai-sdk/openai-compatible这是 opencode 用来加载兼容 OpenAI 协议提供者的适配包先装一下npm install -g ai-sdk/openai-compatibleapiKey写成{env:TAOTOKEN_API_KEY}是 opencode 的环境变量插值语法它会在启动时读取同名环境变量。如果你更习惯直接写字符串也可以但服务器上多人共用时建议还是走环境变量。models里的键名要和实际请求的模型标识一致不确定就先填一个跑通后再补。3.1 服务端启动与访问控制opencode 可以起一个 HTTP 服务让本地浏览器或客户端连过来export OPENCODE_SERVER_USERNAMEadmin export OPENCODE_SERVER_PASSWORD你的强密码 nohup opencode serve --hostname 0.0.0.0 --port 60001 opencode.log 21 默认用户名是opencode密码取OPENCODE_SERVER_PASSWORD的值。想永久生效就写进/etc/profileecho export OPENCODE_SERVER_USERNAMEadmin /etc/profile echo export OPENCODE_SERVER_PASSWORD你的强密码 /etc/profile source /etc/profile云虚主机的安全组或本机防火墙要放行 60001# iptables 示例 -A INPUT -p tcp -m state --state NEW -m tcp --dport 60001 -j ACCEPT然后浏览器访问http://服务器IP:60001输入用户名密码即可。3.2 出网受限时的 no_proxy 处理如果云虚主机本身走了内网出口记得把本地回环和内网段排除掉否则连本机服务也会被绕出去export no_proxylocalhost,::1,127.0.0.1,127.0.0.0/8,192.168.*.*4. 验证请求确认 API 通道真的通了配置写完别急着开客户端先用 curl 直接打一次 TaoToken 的接口把「Key 对不对、地址通不通、模型名认不认」这三件事一次性验掉curl -sS https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-5, messages: [{role: user, content: ping}], max_tokens: 16 }预期返回是一段 JSONchoices[0].message.content里有模型回复内容。如果返回 401是 Key 没读到或写错返回 404多半是baseURL少了或多了路径段返回超时回到 3.2 检查出口策略。curl 通了之后重启 opencode 服务让它重新加载配置pkill -f opencode serve nohup opencode serve --hostname 0.0.0.0 --port 60001 opencode.log 21 tail -f opencode.log日志里没有 provider 加载报错就说明配置被正确解析了。此时在客户端里发一条消息能收到回复即全链路打通。想先在网页里直接试模型效果可以走模型对话页https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite如果你打算把 opencode 当长期编码代理用频繁调用下按量计费不如包月划算可以看下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite5. 本篇常见报错排查opencode: command not foundwhich opencode为空说明全局 bin 不在 PATH。用npm config get prefix查前缀把prefix/bin加进/etc/profile后source。node -v无输出或报错解压时没加--strip-components1导致 bin 路径多了一层。重新解压或直接把真实 bin 路径写进 PATH。启动后日志报 provider 加载失败npm字段拼错或ai-sdk/openai-compatible没装。执行npm install -g ai-sdk/openai-compatible后重启服务。curl 返回 401TAOTOKEN_API_KEY没 export 成功或配置文件里插值语法写成了${TAOTOKEN_API_KEY}。opencode 用的是{env:VAR}形式。curl 返回 404 / 连接被拒baseURL写成了带/v1的地址。TaoToken 的基地址就是https://taotoken.net/api路径由适配层补全。服务起了但浏览器打不开安全组没放行 60001或--hostname写成了127.0.0.1。改成0.0.0.0并检查防火墙规则。模型请求一直转圈云虚主机出口受限。确认no_proxy已包含内网段并核对 TaoToken 地址是否在放行名单内。6. 后续接入与文档opencode 跑起来之后本地 VSCode 装对应插件就能连到这台云虚主机的服务把编码代理接到日常编辑器里。接入细节和参数说明看官方文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite如果你用的是 Claude Code 这类 Anthropic 协议客户端接入方式略有不同参考https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewriteKey 管理和额度查看都在控制台建议把 Key 按项目分开放方便后续排查是哪个调用出的问题https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite整套流程里最值得多花五分钟的是第 4 节的 curl 验证。很多人配置写完直接开客户端结果报错信息被客户端吞掉只能靠猜。先用 curl 把通道验通后面任何环节出问题都能快速定位是配置层还是网络层。