
1. 手机连服务器跑 Agent卡在哪一步opencode 是一个跑在终端里的 AI 编码 Agent能读文件、改代码、执行命令。它自带opencode web模式会在服务器上起一个 Web 服务理论上你拿手机浏览器就能远程指挥服务器上的 Agent 干活。但真到 Linux 服务器上部署问题会集中爆发在三个地方服务默认只监听 localhost手机根本连不上公网隧道起来后opencode 的模型请求没有统一出口Key 散落在环境变量里手机端登录后 Agent 一执行任务就报鉴权失败因为隧道转发和 API 通道是两套东西。这篇聚焦的场景很具体一台远程 Linux 服务器上面跑 opencode web通过 cloudflared 隧道暴露到公网你用手机浏览器访问让服务器上的 Agent 执行任务。核心要解决的是统一鉴权与配置——把模型调用收敛到 TaoToken 的 API 通道把隧道配置和 opencode 的 config.toml 骨架固定下来让整条链路可复制、可验证。适合已经在用 opencode、想摆脱本地电脑和 VS Code 端口转发的人也适合想把 Agent 放到服务器上长期跑、手机随时接管的人。我试过在 ARM 服务器上从零搭这套链路踩过的坑主要集中在 cloudflared 架构选错、opencode 监听地址没改、以及模型 Key 没走统一通道导致手机端请求 401。下面按可跟做的顺序拆开。2. TaoToken 前置统一 Key 与 API 通道opencode 支持自定义模型提供商配置写在~/.config/opencode/config.toml或项目级opencode.toml里。远程调试场景下服务器上的 Agent 要调模型手机端只是通过浏览器操作这个 Agent所以模型请求实际是从服务器发出的。这时候把 Key 和 Base URL 统一到 TaoToken好处是一个 Key 管所有模型换模型不用改代码隧道这头只管转发 Web 流量不碰模型鉴权。TaoToken 的 API 入口是https://taotoken.net/api兼容 OpenAI 风格的/v1/chat/completions和 Anthropic 风格的/v1/messages。opencode 里配置 provider 时Base URL 填这个Key 填你在控制台生成的。如果你用的是 Claude Code 那套 Anthropic 协议opencode 也支持走的是同一个 API 域名下的 Anthropic 兼容路径。先去控制台拿 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole拿完 Key 别急着写进 config先确认服务器能通。在服务器上跑一条 curl验证 API 通道本身没问题curl -s https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY | head -c 500返回模型列表 JSON 就说明通道通。这一步很重要因为后面手机端报错时你要能区分是隧道问题还是 API 问题。如果这条 curl 就失败先解决服务器出网和 Key 的问题别往下走。3. 可复制配置config.toml 骨架 cloudflared 隧道3.1 opencode 的 config.toml 骨架在服务器上创建或编辑~/.config/opencode/config.toml。下面这份骨架把 TaoToken 作为统一 provider模型名按你实际用的填# ~/.config/opencode/config.toml model taotoken/claude-sonnet-4-5 small_model taotoken/claude-haiku-4-5 [provider.taotoken] name TaoToken baseURL https://taotoken.net/api apiKey {env:TAOTOKEN_API_KEY} [provider.taotoken.models.claude-sonnet-4-5] name Claude Sonnet 4.5 [provider.taotoken.models.claude-haiku-4-5] name Claude Haiku 4.5关键点apiKey用{env:TAOTOKEN_API_KEY}引用环境变量不要把 Key 硬编码进文件。然后在服务器的 shell 配置里导出echo export TAOTOKEN_API_KEYsk-你的key ~/.bashrc source ~/.bashrc如果你更习惯用 Anthropic 协议直连opencode 也支持provider里指定type anthropicBase URL 同样指向 TaoToken 的 API 域名。两种方式选一种即可别混用。3.2 cloudflared 安装与隧道启动先确认服务器架构uname -mx86_64对应 amd64aarch64对应 arm64。下载对应二进制后赋权、放进 PATHchmod x cloudflared-linux-amd64 sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared cloudflared --version启动 opencode web注意监听地址必须是0.0.0.0否则隧道转发不到OPENCODE_SERVER_PASSWORD你的强密码 \ opencode web --hostname 0.0.0.0 --port 4096另开一个 SSH 窗口启动隧道cloudflared tunnel --url http://localhost:4096终端会输出一个https://xxx.trycloudflare.com地址复制它。两个窗口都不能关opencode 进程和隧道进程要同时活着。注意trycloudflare.com是临时隧道重启后地址会变。长期用建议在 Cloudflare 后台建命名隧道配置写进~/.cloudflared/config.yml这里不展开。4. 验证请求手机端 opencode web 实测手机浏览器打开隧道地址会弹出登录框。用户名固定是opencode密码是你启动时设的OPENCODE_SERVER_PASSWORD。登录后进入 opencode web 界面新建一个会话让它执行一个简单任务比如「列出当前目录下的文件并统计数量」。Agent 执行时模型请求从服务器发出走的是 config.toml 里配的 TaoToken 通道。如果配置正确你会看到 Agent 正常返回结果。验证 API 通道是否真的被调用可以在服务器上另开窗口看 opencode 的日志或者直接再跑一次 curl 确认 Key 有效curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d {model:claude-haiku-4-5,messages:[{role:user,content:ping}],max_tokens:10}返回带choices的 JSON 就说明模型通道正常。手机端能正常对话、Agent 能执行文件操作整条链路就算通了。如果你想让手机端直接和模型对话做验证不经过 Agent可以用模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodels5. 本篇常见错排查手机打开隧道地址显示 502 或超时先确认 opencode web 进程还活着且监听的是0.0.0.0而不是127.0.0.1。用ss -tlnp | grep 4096看监听地址。如果只监听 localhost隧道转发会失败。登录后 Agent 执行任务报 401 或鉴权失败这是模型通道的问题不是隧道的问题。检查TAOTOKEN_API_KEY是否在当前 shell 生效echo $TAOTOKEN_API_KEY看有没有值。config.toml 里如果写死了旧 Key改掉。另外确认 Base URL 是https://taotoken.net/api不要多加/v1opencode 会自己拼路径。cloudflared 启动报架构不匹配uname -m的输出和下载的二进制对不上。aarch64 必须用 arm64 版本x86_64 用 amd64 版本。重新下载对应文件。隧道地址每次重启都变临时隧道就是这样。要固定地址去 Cloudflare 后台创建命名隧道把 tunnel ID 和 credentials 文件配好用cloudflared tunnel run name启动。手机端界面能打开但 Agent 不执行命令opencode 的 Agent 执行命令依赖服务器上的 shell 环境。确认服务器上bash可用且 opencode 进程有权限读写工作目录。如果工作目录是/root下的项目注意权限。API 请求超时但 curl 正常可能是 opencode 的 provider 配置里 baseURL 写错或者模型名和 TaoToken 支持的名称不一致。用/v1/models接口确认可用模型名再回填 config.toml。6. 长期跑 Agent 的配置建议如果你打算让这套链路长期跑而不是临时调试建议把模型调用收敛到 Coding Plan这样多模型切换和额度管理都在一个地方不用每次改 config.toml。Coding Plan 入口https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding_plan接入文档里有 opencode、Claude Code 等工具的完整配置示例遇到 provider 字段不确定时直接对照https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdocAPI Keys 管理页可以随时轮换 Key轮换后只需更新服务器上的环境变量config.toml 不用动https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi_keys最后一步实操建议把 opencode web 和 cloudflared 用 systemd 或 tmux 托管别依赖 SSH 窗口。tmux 最简单tmux new -s opencode # 在会话里启动 opencode web # CtrlB D 脱离 tmux new -s tunnel # 在会话里启动 cloudflared # CtrlB D 脱离这样断开 SSH 后两个进程继续跑手机随时连隧道地址接管 Agent。