返回列表

博客

在云虚拟机或无头 Linux 服务器上运行 Claude Code,并用 iPhone 远程控制

智能体可以跑在任何一台长期在线的 Linux 机器上——云虚拟机、远程开发机、Docker 容器——iPhone 变成控制界面,无论你身在何处。

发布于 标签: 上手教程 / linux / cloud / systemd / claude-code / codex / amp / remote-coding / mobile-ai-coding
博客

继续查看该栏目下的产品与工程更新。

浏览此分类

大多数 Tactic Remote 用户都把服务端跑在自己写代码的那台 Mac 上。这是最自然的起点。但主机不一定非得是你的笔记本,也不一定非得在你旁边。

npx tacticremote 可以跑在任何一台有 Node.js 的 Linux 机器上——云虚拟机、远程开发机、电视柜下的无头小主机,或者 Docker 容器。服务跑起来之后,iOS app 通过 Cloudflare Tunnel 连接,你就能获得和局域网模式一样的 Chat Mode、Terminal Mode、Quick Prompts、推送通知和一键审批。

本文讲的就是这种配置:智能体持续跑在远端服务器上,手机从任意地方控制它。

为什么要把智能体跑在远端服务器上

把主机从笔记本迁移出去,有几个实际理由。

长任务跑通宵,不用让笔记本一直插着电。 一个几小时的大型重构、大规模测试、或者探索性编码任务,很容易超出你愿意开着盖子等待的时间。云虚拟机一直在跑,你关上笔记本,任务继续。

手机随时能接入,不用每次先启动服务。 服务器常驻,不需要出门前先手动启动。打开 app,会话就在那里。

CI 周边的任务。 有些团队用 AI 智能体来起草补丁、对分支跑测试,或者预审 Pull Request。一台专用的 Linux 服务器——独立于开发者个人机器——是这类任务的自然归宿。

资源更充裕。 把任务卸载到 CPU/内存更大的机器上,或者更靠近 API 端点的机器上,可以缩短大型任务的实际耗时。

不需要 Mac。 如果你主力机是 Windows 工作站,但有一台 Linux 服务器,完全可以把智能体跑在那台服务器上,再从 iPhone 操控。

前提条件

在跟着下面步骤操作之前,你需要准备:

  • 一台能被公网访问的 Linux 服务器或虚拟机(发行版不限;我们主要测试 Ubuntu 22.04+)
  • Node.js 16 或更高版本(用 node --version 确认)
  • 在服务器上安装并登录你要使用的 AI 智能体:
    • Claude Code:按 Anthropic 的安装说明,再运行 claude login
    • Codex:按 OpenAI 文档安装并完成认证
    • Amp:按 Amp 文档安装并登录
  • iPhone 上已安装 iOS app(App Store)

在无头服务器上,Mac 菜单栏 app 或 Windows app 都不需要——那两个是桌面端的图形界面。服务端只需要 npx tacticremote 就够了。

安装并运行服务端

npx tacticremote 会直接拉取并运行服务端,不需要全局安装步骤。在一台全新服务器上:

npx tacticremote

首次运行时会打印类似这样的输出:

Tactic Remote server listening on port 8765
API Key: tr_xxxxxxxxxxxxxxxxxxxx
Pair with QR or enter the address manually in the iOS app

对于远端服务器(没有共享局域网,没有 mDNS),连接方式是 Cloudflare Tunnel。上面打印的 API Key 就是用来验证你的 iPhone 身份的——记下来,配对时在 app 里输入。

如果想锁定特定版本而不是每次都拉最新:

npx tacticremote@latest

用 systemd 保持服务常驻

在 shell 里直接跑 npx tacticremote 能让服务起来,但 shell 会话结束时进程也就没了。要让它作为正式的后台服务——开机自启、崩溃自动重启——就需要 systemd。

创建一个 unit 文件。把 youruser 替换成应该拥有该进程的 Linux 用户,WorkingDirectory 也可以调整为你想让智能体在其中工作的项目目录。

# /etc/systemd/system/tacticremote.service
[Unit]
Description=Tactic Remote server
After=network-online.target
Wants=network-online.target
 
[Service]
Type=simple
User=youruser
WorkingDirectory=/home/youruser
ExecStart=/usr/bin/npx tacticremote
Restart=on-failure
RestartSec=5
Environment=HOME=/home/youruser
 
[Install]
WantedBy=multi-user.target

启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable tacticremote
sudo systemctl start tacticremote
sudo systemctl status tacticremote

随时查看日志:

journalctl -u tacticremote -f

几点关于 unit 文件的说明:

  • After=network-online.target 确保网络就绪后再启动服务,开机时 Cloudflare Tunnel 需要出站连接,这个顺序很重要。
  • Restart=on-failure 配合 5 秒延迟,让服务在遇到偶发错误时自动恢复,又不会在紧密循环里一直重启。
  • 如果 npx 不在 /usr/bin/npx,用 which npx 查出正确路径并更新 ExecStart。如果你更倾向于 npm install -g tacticremote 做全局安装,也可以直接在 unit 文件里写 tacticremote 的完整路径。
  • Environment=HOME 那行确保 Node/npm 能在正确用户的 home 目录下找到缓存和全局包,在 sudo 提权场景下偶尔会出问题,加上这行可以避免。

通过 Cloudflare Tunnel 连接 iPhone

远端服务器没有共享局域网,mDNS 发现不管用。这种配置下的连接方式是 Cloudflare Tunnel。

Tactic Remote 内置了 Cloudflare Tunnel 支持,不需要单独安装 cloudflared。启动服务端时加上标志即可开启:

npx tacticremote --tunnel --api-key YOUR_SECRET_KEY

如果通过 systemd 运行,更新 unit 文件:

ExecStart=/usr/bin/npx tacticremote --tunnel --api-key YOUR_SECRET_KEY

Cloudflare Tunnel 激活后,服务端会打印一个 trycloudflare.com 地址:

Cloudflare Tunnel active: https://example-random-name.trycloudflare.com
API Key: tr_xxxxxxxxxxxxxxxxxxxx

在 iPhone 上:

  1. 打开 Tactic Remote
  2. 点击 添加主机,选择手动
  3. 把 trycloudflare.com 地址填入主机地址
  4. 填入服务端打印的 API Key
  5. 点击连接

连接通过 Cloudflare 端到端加密。你的代码和终端输出不会经过任何 Tactic Remote 的云中继——因为根本不存在这样一个中继。流量从服务器发往 Cloudflare 边缘节点,穿过隧道直接到达 iOS app。

如果想要持久化配置(让 URL 在服务重启后保持不变),可以使用绑定到自有域名的命名 Cloudflare Tunnel,而不是临时的 trycloudflare.com 地址。详见 Cloudflare Tunnel 配置指南。

安全说明

在这种配置下——远端服务器、Cloudflare Tunnel、API Key——安全属性如下:

  • 服务端的 8765 端口不需要对公网开放。Cloudflare Tunnel 从你的服务器向 Cloudflare 边缘节点发起出站连接,不需要暴露任何入站端口。
  • API Key 认证意味着只有知道 Key 的设备才能连接。建议使用足够强的 Key,或者直接用随机生成的那个。
  • 局域网模式使用明文 ws://。在这个远端服务器场景下你不走局域网模式,所以不涉及这个问题——Cloudflare Tunnel 流量是 TLS 加密的。

如果你的服务器在私有 VPC 里,Cloudflare Tunnel 就是在不开防火墙入站口的前提下访问它的方式。

在服务器上使用多个智能体

远端服务器配置支持和本地 Mac 或 Windows 主机一样的智能体选择。在 iOS app 里新建会话时,每个会话独立选择后端智能体——Claude Code、Codex 或 Amp,取决于服务器上装了哪些。

各会话相互独立。你可以同时跑一个 Claude Code 会话做长任务,再跑一个 Codex 会话在另一个分支上——iOS app 在它们之间切换自如。

推送通知在这种配置下同样有效。智能体完成任务、暂停等待审批、或异常退出时,iPhone 会收到通知。对于那些你偶尔去查看而不是一直盯着看的长任务,这是最关键的体验——不需要一直打开 app。

在 Docker 中运行

如果你的服务端环境是基于 Docker 的,可以在容器里跑 npx tacticremote。主要注意事项:

  • 容器里需要安装并认证智能体(Claude Code、Codex、Amp)
  • 如果用局域网模式,需要暴露 8765 端口(Cloudflare Tunnel 不需要)
  • Cloudflare Tunnel 需要容器有公网出站访问
  • 容器内进程管理用 CMD 或 supervisor,不用 systemd

一个最简 Dockerfile 片段:

RUN npm install -g tacticremote
CMD ["tacticremote", "--tunnel", "--api-key", "YOUR_SECRET_KEY"]

智能体的持久化认证信息(比如 Claude Code 的 ~/.claude 目录)应该挂载为 volume,确保容器重启后不丢失。

注意事项

智能体仍然需要在服务器上独立完成认证。 npx tacticremote 不处理 Claude Code、Codex 或 Amp 的认证。这些智能体必须在服务器上安装并登录完毕,Tactic Remote 才能启动它们的会话。

Cloudflare Tunnel 有少量延迟开销。 交互式使用时通常感觉不到(大多数区域低于 100ms)。对于高吞吐量的终端输出会稍微明显一些。如果手机和服务器在同一网络下,局域网模式更快;但远端场景下局域网模式不可用。

Node.js 版本有要求。 最低 Node 16,推荐 Node 20 LTS。用 node --version 确认。

npx 首次运行会下载包。 如果服务器有严格的出站限制,需要把 npm 注册表加入白名单。或者用 npm install -g tacticremote 做全局安装,再在 systemd unit 文件里直接写 tacticremote。

Linux 上用 tmux 做会话持久化。 确认 tmux 已安装(apt install tmux 或对应发行版的命令)。没有 tmux,断线后会话不会持续。

免费版就能跑这套方案。 Chat Mode、Terminal Mode、推送通知、多智能体选择在免费版都可以用。Pro 提供额外功能。定价:免费版 / Pro 每月 $2.99 / 每年 $19.99。


把智能体跑在长期在线的服务器上,是远程控制模式效用最大的玩法:智能体通宵工作、在你开会时工作、在你坐飞机时工作,手机是你随时查看的窗口。

如果你是第一次配置,先从最简单的 npx tacticremote --tunnel --api-key YOUR_SECRET_KEY 开始,确认 iPhone 能端到端连通,再加上 systemd 服务来保证稳定性。

相关阅读

立即体验 Tactic Remote

用手机远程控制编程 Agent

连接 Mac、Windows 或 Linux 电脑上的 Claude Code、Codex 等 Agent,在 iPhone 或 iPad 上查看进展并发送下一条要求。