部署

在 VPS 上运行 Codex CLI

Codex 在一台小型 Linux 服务器上跑得很好,麻烦主要出在登录和 Linux 沙箱上。本指南涵盖安装、无浏览器登录、让会话保持运行,以及如何用手机访问服务器。

在 VPS 上运行 Codex CLI

简要回答

用 curl -fsSL https://chatgpt.com/codex/install.sh | sh(或 npm install -g @openai/codex)安装。然后在 ChatGPT 安全设置中开启设备码登录,并在服务器上运行 codex login --device-auth。把 Codex 放在 tmux 或守护进程里运行,这样 SSH 断开后它也不会停。ChatGPT 应用中的 Remote 官方只支持 macOS 和 Windows 主机。Linux VPS 只能经由这类主机访问:在一台保持唤醒的 Mac 或 PC 上,由 ChatGPT 桌面应用把 VPS 作为 SSH 项目打开。要从手机直接访问 VPS,就用 SSH 应用,或像 Maude 这样直接与服务器通信的客户端。

服务器很适合运行 OpenAI 的 Codex CLI。笔记本合上时它照样工作,连接断了也不受影响,某次运行出了问题,还可以直接重建服务器。在全新的 Linux VPS 上,有两件事常让人卡住。第一,普通的 codex login 会等待浏览器重定向,而这个重定向永远到不了服务器。第二,沙箱需要一个大多数精简镜像都不带的软件包。本指南会解决这两个问题,然后介绍如何让会话保持运行,以及用手机访问它们的几种方式。

准备工作

  • 一台 Linux 服务器,x86-64 或 arm64 均可。OpenAI 为两者都提供了二进制文件,macOS 也能用。Debian 或 Ubuntu 最省事。
  • 一个账号。ChatGPT 套餐或 OpenAI API 密钥都可以。OpenAI 的 Codex 价格页面写明,ChatGPT Free、Go、Plus、Pro、Business、Edu 和 Enterprise 都包含 Codex。各套餐的额度不同,本地 CLI 的用量与云端对话共享额度。使用 API 密钥则按 API 价格计费。
  • 内存。CLI 是编译好的二进制文件,本身占用内存很少。真正吃内存的是项目的构建和测试。轻度使用 2 GB 就够,4 GB 会比较宽裕。配置和当前价格请参考 VPS 选购指南。
  • 一个非 root 用户。在安装任何东西之前先创建(adduser dev,然后把你的 SSH 密钥复制过去)。我们的 Claude Code VPS 指南详细介绍了这一步和 SSH 安全加固,对 Codex 来说步骤完全相同。

安装 Codex

独立安装器不需要 Node.js:

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

如果你本来就用 npm 管理工具,下面这条装的是同一个 CLI:

npm install -g @openai/codex

注意作用域:包名是 @openai/codex。npm 上没有作用域的 codex 包与它无关。用普通用户安装,不要加 sudo。两种方式都列在 openai/codex 的 README 中。

Linux 沙箱的前置条件

在 Linux 上,Codex 会把它生成的 shell 命令放在一个基于 bwrap(bubblewrap)和 seccomp 的沙箱里运行。OpenAI 的沙箱文档要求先安装 bubblewrap:

sudo apt install bubblewrap      # Debian / Ubuntu
sudo dnf install bubblewrap      # Fedora

没有 bwrap 时,Codex 会退而使用一个内置的辅助程序,而它需要非特权用户命名空间。Ubuntu 24.04 通过 AppArmor 限制了这一功能。文档给出的解决办法是加载一个额外的配置文件:

sudo apt install apparmor-profiles apparmor-utils
sudo install -m 0644 /usr/share/apparmor/extra-profiles/bwrap-userns-restrict /etc/apparmor.d/bwrap-userns-restrict
sudo apparmor_parser -r /etc/apparmor.d/bwrap-userns-restrict

文档还给出了一个更粗暴的办法:sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0,它会在整台机器上关闭这项限制。优先使用配置文件的方式。如果你发现每条沙箱内的命令都因命名空间错误而失败,原因就在这里。

用设备码登录

在服务器上直接运行 codex login,它看起来就像卡住了。原因是:它会在 1455 端口启动一个本地回调服务器,等待浏览器被重定向到 localhost。可那是服务器的 localhost,你的手机或笔记本访问不到。改用设备码登录就行。它有一个几乎人人都会忽略的前提:

  1. 开启设备码登录。个人账号在 ChatGPT 的安全设置中开启。Business、Edu 或 Enterprise 工作区则由管理员在工作区权限中开启。在开启之前,设备码流程对你的账号无效。
  2. 在服务器上启动流程:
    codex login --device-auth
  3. 在任意设备上完成。Codex 会输出一个链接和一个一次性验证码。在手机或笔记本上打开链接,登录 ChatGPT,然后输入验证码。
  4. 确认登录成功:
    codex login status
    它会输出当前的认证方式,并在已登录时以 0 退出,所以很适合在脚本中使用。

以上内容来自 OpenAI 的认证文档。文档还给出了设备码不可用时的两种备选方案:

  • 转发回调端口。用 ssh -L 1455:localhost:1455 user@your-server 连接,在服务器上运行 codex login,然后在本地浏览器中打开输出的地址。重定向就会通过隧道传回去。
  • 复制凭据。在有浏览器的机器上登录,然后运行 scp ~/.codex/auth.json user@your-server:~/.codex/auth.json。

改用 API 密钥

printenv OPENAI_API_KEY | codex login --with-api-key

通过 stdin 传入密钥,可以避免它出现在 shell 历史中。这种方式按 API 价格逐 token 付费,而不是消耗 ChatGPT 套餐的额度,适合需要明确计费边界的共享服务器或 CI 机器。

像对待密码一样对待 auth.json

默认情况下,Codex 把凭据缓存在 ~/.codex/auth.json。cli_auth_credentials_store 设置可以把它们移到系统钥匙串(file、keyring、auto 或 ephemeral)。任何以你的用户身份拿到 shell 的人,都能使用你的 ChatGPT 套餐。不要给别人运行智能体的服务器的 shell 访问权限。

让它保持运行

交互式的 codex 会话与启动它的终端同生共死。SSH 连接一关,会话就结束。有三种办法可以绕开这个问题。

tmux,经典方案:

sudo apt install tmux
tmux new -A -s codex     # create or re-attach
cd ~/src/my-app && codex
# detach: Ctrl-b then d; later: tmux attach -t codex

如果会话真的结束了,codex resume --last 会接上该目录下最近的一次对话,codex resume 则会打开一个选择列表。我们的 tmux、mosh 与 Tailscale 指南里有一份适合手机使用的 tmux 配置。

非交互式运行。codex exec "…" 不打开 TUI 就能运行一个任务,codex exec resume --last 可以继续它。这适合 cron 任务和 CI,但没有人在场回应审批请求,所以下面的沙箱设置就更加重要。

守护进程,由它持有会话,并且能挺过重启。这正是 24/7 运行指南所对比的内容:systemd 单元、Remote Control 服务器,以及像 Maude 这样在服务器上运行自己进程的应用。

审批与沙箱

Codex 有两个相互独立的控制项:命令能碰到什么(沙箱),以及什么时候停下来问你(审批策略)。以下取值来自 OpenAI 的审批与安全文档和 CLI 参考:

设置取值在服务器上意味着什么
--sandbox / -sread-only、workspace-write、danger-full-access在 git 仓库中默认是 workspace-write。编辑只限于项目内部,网络访问默认关闭,除非你开启。
--ask-for-approval / -aon-request、neveron-request 会在某个操作超出沙箱允许范围时询问你。never 则完全不问。在 config.toml 中,approval_policy 还接受 granular;旧的 untrusted 值已停用。
--yolo(--dangerously-bypass-approvals-and-sandbox 的别名)没有沙箱,也没有任何询问。OpenAI 将它保留给已经从外部加固过的环境。

旧教程里还会出现 --full-auto。它现在是一个已弃用的兼容性参数,参考文档建议改用 --sandbox workspace-write。要让沙箱内的命令访问网络(比如让 npm install 能正常工作),在 ~/.codex/config.toml 中加入:

sandbox_mode = "workspace-write"
approval_policy = "on-request"

[sandbox_workspace_write]
network_access = true

关于容器再说一句:如果你的“VPS”其实是一个禁止命名空间操作的 Docker 或 LXC 容器,文档建议使用 --sandbox danger-full-access。只有当容器本身就是你的沙箱时才这么做。其中的取舍和 Claude 的bypass 模式一样,详见安全地以完整权限运行智能体。

手机访问方案

方案支持 Linux VPS 吗?优点注意事项
Codex Remote(ChatGPT 应用)官方不支持。主机必须在 macOS 或 Windows 上运行 ChatGPT 桌面应用;该应用可以访问你 VPS 上的 SSH 项目。官方方案,套餐内免费,原生界面主机必须保持唤醒和在线
SSH 应用 + tmux支持免费,服务器上无需额外安装用手机键盘操作全屏 TUI,没有推送
Maude支持(任何可通过 SSH 访问的 Linux 或 macOS)原生聊天界面、内联审批、推送通知,还支持 Claude Code 等其他智能体付费应用;仍需你自己的 ChatGPT 套餐或密钥

关于无头 Linux 和 Codex Remote 再说几句。CLI 参考文档记载了用于本地 app-server 的 codex remote-control start 和 codex remote-control pair。但 Remote 连接指南仍然写着主机需在 macOS 或 Windows 上运行桌面应用。已有用户就这一矛盾提交了 issue:#31183 报告称无头 Linux 主机无法与当前的移动客户端重新配对,#35928 则指出了文档前后矛盾。我们查看时两者都还未关闭。如果这条路对你行得通,那它就是官方方案,只是暂时别把工作流建立在它之上。

用 Maude 在手机上运行

Maude 是不用 TUI、直接在手机上操控这台 VPS 的一种方式。你输入地址或粘贴一条 ssh 命令来添加服务器,应用就会通过 SSH 部署自己的小型守护进程。这个守护进程会按经过测试的锁定版本安装 Codex,并校验校验和,所以你可以跳过安装步骤。你在手机上通过 ChatGPT 设备码或 API 密钥登录 Codex——不过仍需先在 ChatGPT 中开启设备码登录。关闭应用后会话仍在服务器上运行,审批请求会出现在收件箱中,并以带“允许 / 拒绝”的推送通知送达,同一台服务器还能在 Codex 旁边运行 Claude Code、OpenCode、Grok Build 和 Antigravity。详情请看 Codex 智能体页面。

常见问题

为什么 codex login 在我的服务器上卡住了?
普通的 codex login 会在 localhost:1455 上启动一个回调服务器,等待浏览器重定向,而另一台设备上的浏览器无法把这个重定向送到你的 VPS。在 ChatGPT 安全设置中开启设备码登录后,改用 codex login --device-auth。另一种办法是用 ssh -L 1455:localhost:1455 转发端口。
运行 Codex 需要 Node.js 吗?
不需要。独立安装器(curl -fsSL https://chatgpt.com/codex/install.sh | sh)和发布的二进制文件都不依赖 Node。只有选择 npm 安装方式(npm install -g @openai/codex)时才需要 Node。
能用 API 密钥代替 ChatGPT 套餐吗?
能:printenv OPENAI_API_KEY | codex login --with-api-key。这样用量会按 OpenAI API 价格计费,而不计入 ChatGPT 套餐的额度。
Codex Remote 能看到我的 VPS 吗?
目前只能间接看到。OpenAI 的 Remote 文档把 macOS 或 Windows 上的 ChatGPT 桌面应用列为主机,而该桌面应用可以打开 VPS 上的 SSH 项目。文档中也记载了一种 CLI 配对方式(codex remote-control),但 GitHub 上仍未关闭的 issue 报告了无头 Linux 主机配对时的问题,所以在依赖它之前请先查看最新文档。
在 VPS 上应该用哪种沙箱模式?
先用 workspace-write 加 on-request 审批;如果构建需要下载软件包,再开启 network_access。--yolo 只留给可随时丢弃的机器,或隔离性值得信赖的容器。

更新内容

  • — 首次发布。安装、认证、沙箱和 Remote 的相关细节均已于当日对照 OpenAI 文档和 openai/codex README 核实。

Codex 在你的服务器上,操控在你的手机上

添加服务器,用你的 ChatGPT 套餐登录,开始一个会话。支持 iOS 和 Android。

Download Maude on the App Store Get Maude on Google Play