跳到主要内容

我终于把「手机远程控制 Linux 服务器上的 Codex」跑通了

· 阅读需 7 分钟
王小义
在北京打工的程序员,公众号「王小义笔记」,股票、黄金、演唱会门票

这篇文章记录了我把“手机远程控制 Linux 服务器上的 Codex CLI”完整跑通的过程。核心方案是用 Docker/1Panel 部署 Codex,通过 device-auth 登录并开启 remote-control,再配合 tmux 常驻,让手机 ChatGPT App 可以远程控制服务器上的 Codex。

文章概述

本文不是单纯的安装记录,而是一份踩坑后的实战复盘:从为什么建议用 Docker 部署 Codex,到 remote-control 连不上、alreadyRunningtoken_revoked、OpenClaw MCP 401 等问题的排查与解决。适合想把服务器变成远程 AI DevBox、希望用手机随时控制 Codex 的用户参考。

文章结构

  • 部署方案:为什么推荐 Docker + 1Panel,以及 compose 配置要点
  • 远程控制:开启 Remote Feature、正确登录、手机连接流程
  • 问题排查:解决 alreadyRunning、授权循环、OpenClaw MCP 401
  • 稳定运行:用 tmux 常驻 remote-control,避免 SSH 断开影响使用
  • 踩坑 QA:整理 Codex installer、OAuth token、Linux Docker Preview 等常见问题

这两天一直在折腾一个东西:

能不能直接用手机控制服务器上的 Codex CLI?

结果没想到,从 Docker、bubblewrap、remote-control、OAuth token,到 OpenClaw MCP,全都踩了一遍坑。

不过好消息是:

现在已经完整跑通:

  • Linux 服务器
  • Docker
  • 1Panel
  • Codex CLI
  • 手机 ChatGPT App Remote Control
  • OpenClaw

并且手机已经可以直接控制服务器上的 Codex 了。

这里我把整个过程整理成一篇真正能落地的教程。

很多网上教程已经过时了,尤其 Codex installer 现在的路径、remote-control feature、Linux Preview 问题,都和几周前完全不一样。

所以如果你最近也在折腾:

Linux + Docker + Codex Remote

这篇应该能帮你少踩很多坑。


一、为什么推荐 Docker 部署 Codex

一开始我也尝试过:

npm install -g @openai/codex

直接装在服务器上。

但后面会发现:

  • Node 环境容易乱
  • 多项目不好隔离
  • remote-control 经常炸
  • OpenClaw 共用 token 时容易冲突
  • 依赖缺失后很难排查

所以后面还是换成了:

Docker + 1Panel

整体会稳定很多。

尤其:

codex-home volume 持久化

非常重要。

否则:

  • 登录状态会丢
  • remote-control 会失效
  • token 会重新授权

二、推荐的 Docker Compose

推荐大家使用服务器跑Linux的原因是,服务器上服务IP比较固定,手机直接控制Codex的话,大量的访问会以这个IP来进出,这样有效避免账号风控,同时他可以24h在线,完全不用担心服务掉线。

RackNerd最低只需要150人民币多你就可以拥有一个一年的境外服务器,一个月才12人民币,你的魔法每月恐怕都不止这个钱。

这性价比放在整个行业都是炸裂的存在。RackNerd已经运行了十年,算是比较老牌的服务商,不用担心会跑路

https://my.racknerd.com/aff.php?aff=19908

说到正题,我现在最终稳定使用的是:

services:
codex:
image: node:22-bullseye

container_name: codex

restart: unless-stopped

privileged: true

stdin_open: true
tty: true

working_dir: /workspace

security_opt:
- seccomp=unconfined
- apparmor=unconfined

cap_add:
- SYS_ADMIN

environment:
- PATH=/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- CODEX_HOME=/root/.codex

volumes:
- ./workspace:/workspace
- ./codex-home:/root

command: >
bash -lc "
apt update &&
apt install -y \
git \
curl \
ca-certificates \
bubblewrap \
ripgrep \
fd-find \
python3 \
nano \
tmux &&
curl -fsSL https://chatgpt.com/codex/install.sh | sh &&
tail -f /dev/null
"

这里有几个关键点。


1. 不要使用 alpine

一开始我用了:

node:alpine

后面问题不断:

  • bubblewrap 缺失
  • bash 不存在
  • apt 没有
  • remote-control 异常

最后换成:

node:22-bullseye

稳定了很多。


2. 不要使用 npm 全局安装版

这是目前最容易踩的坑。

很多教程写的是:

npm install -g @openai/codex

但实际上:

remote-control 不认 npm 版

真正需要的是:

curl -fsSL https://chatgpt.com/codex/install.sh | sh

这个 standalone installer。


3. bubblewrap 很重要

如果缺少:

bubblewrap

会出现:

Codex could not find bubblewrap on PATH

虽然不一定完全不能用。

但:

  • remote-control
  • workspace-write
  • agent
  • apply_patch

会非常不稳定。

所以 compose 里一定记得:

apt install -y bubblewrap

三、Remote Control 为什么连不上

我一开始最大的目标,就是:

手机直接控制服务器上的 Codex

结果最开始一直:

  • 无限授权循环
  • alreadyRunning
  • 手机上不显示设备
  • token_revoked

后来才发现:

Linux Docker 下现在还是 Preview 状态。

很多网上教程根本没提 feature flag。


四、一定要开启 Remote Feature

进入容器:

docker exec -it codex bash

编辑:

nano ~/.codex/config.toml

增加:

[features]
remote_control = true
remote_connections = true

这一步非常关键。

否则:

手机根本发现不了设备

五、正确的登录方式

我非常建议:

codex login --device-auth

不要使用 callback 登录。

因为 Linux Docker 下 callback 经常:

  • 授权循环
  • 无法回调
  • App 跳转失败

device-auth 稳定很多。


六、手机连接方式

执行:

codex remote-control

然后:

打开手机 ChatGPT App:

左上角
→ Codex
→ Devices / Machines

正常就会看到:

codex
online

然后手机就可以:

  • approve agent
  • 查看任务
  • 远程执行
  • 查看 workspace

体验其实已经很像:

Cursor Remote AI Agent

了。


七、为什么会出现 alreadyRunning

这是我卡了最久的问题。

执行:

codex remote-control

结果提示:

{
"status":"alreadyRunning"
}

其实是:

旧 app-server daemon 卡住了

解决方法:

先查看:

ps aux | grep codex

例如:

553

就是 PID。

然后:

kill -9 553

删除 socket:

rm -rf /root/.codex/app-server-control

重新:

codex remote-control

就恢复了。


八、OpenClaw 为什么也一起炸了

这个其实很有意思。

我原本只是:

Codex Remote Control 授权失效

结果发现:

OpenClaw MCP 也 401 了

错误类似:

token_revoked
Encountered invalidated oauth token

后来才发现:

OpenClaw 和 Codex CLI 用的是同一个 OAuth token

而 remote-control 最近会:

  • 刷新 token
  • 回收旧 refresh_token
  • 导致 MCP 同时失效

所以现在 Linux Docker 场景下:

多个 Codex 客户端

真的很容易互相踢 token。


九、我是怎么解决 token_revoked 的

最后稳定方案其实很简单:

彻底删缓存:

rm -rf ~/.codex/auth.json
rm -rf ~/.codex/device.json
rm -rf ~/.codex/session*

重新:

codex login --device-auth

然后:

codex remote-control

最后重启 OpenClaw:

docker restart openclaw

基本就恢复了。


十、tmux 非常推荐

因为:

remote-control 需要后台常驻

所以推荐:

tmux new -s codex

启动:

codex remote-control

退出:

Ctrl+B
D

这样即使 SSH 断开:

手机仍然可以控制服务器上的 Codex

这点真的很爽。


十一、现在这套方案已经很接近 AI DevBox 了

目前:

  • 服务器跑 Codex
  • 手机远程 approve
  • OpenClaw 自动化
  • tmux 后台 agent
  • Docker 隔离环境

整个体验已经有点:

AI Agent 运维中枢

的感觉了。

尤其:

手机远程控制服务器上的 AI Agent

这个方向,未来一定会越来越普及。


QA:一些踩坑总结

Q1:为什么 codex 命令突然失效?

因为新版 installer 安装到了:

/root/.local/bin

不是旧教程里的:

~/.codex/bin

Q2:为什么 remote-control 不认 npm 安装版?

因为:

remote-control 只支持 standalone installer

必须:

curl -fsSL https://chatgpt.com/codex/install.sh | sh

Q3:为什么手机一直授权循环?

一般是:

  • callback 登录
  • 微信浏览器
  • App 版本太旧
  • token 已失效

推荐:

codex login --device-auth

Q4:为什么 OpenClaw MCP 会 401?

因为:

remote-control 刷新了 OAuth token

导致 OpenClaw 里的 token 失效。


Q5:为什么 Linux Docker 问题特别多?

因为:

目前官方主要支持的是 Mac + ChatGPT App

Linux Docker 还属于 Preview 阶段。

不过:

已经可以正常用了

只是需要多踩一些坑。