セットアップ

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 を実行します。SSH 接続が切れても生き残るよう、Codex は tmux かデーモンの中で動かします。ChatGPT アプリの Remote が公式にホストとしてサポートしているのは macOS と Windows だけです。Linux の VPS にはそのどちらかを経由してしか届きません。スリープしない Mac や PC の ChatGPT デスクトップアプリが、VPS を SSH プロジェクトとして開く形です。スマホから VPS に直接つなぐなら、SSH アプリか、Maude のようにサーバーとやり取りするクライアントを使います。

サーバーは OpenAI の Codex CLI にとって良い住まいです。ノート PC を閉じていても作業が続き、接続が切れても生き残り、実行がおかしくなったらマシンを作り直せます。まっさらな Linux VPS では、2 つの点でつまずきがちです。1 つ目は、素の codex login が、サーバーには決して届かないブラウザのリダイレクトを待ってしまうこと。2 つ目は、サンドボックスに必要なパッケージが、ほとんどの最小構成のイメージに入っていないことです。このガイドでは両方を解決し、そのうえでセッションの維持と、スマホからアクセスする方法を紹介します。

必要なもの

  • Linux サーバー(x86-64 または arm64)。OpenAI は両方のバイナリを公開しており、macOS でも動きます。Debian か Ubuntu がいちばん簡単です。
  • アカウント。ChatGPT のプランか OpenAI の API キーのどちらか。OpenAI の Codex の料金ページによると、Codex は ChatGPT の Free、Go、Plus、Pro、Business、Edu、Enterprise に含まれています。上限はプランによって異なり、ローカルでの CLI の利用はクラウドのチャットと枠を共有します。API キーでの利用は、代わりに API の料金で課金されます。
  • メモリ。CLI はコンパイル済みのバイナリで、それ自体はほとんどメモリを使いません。RAM を使うのはプロジェクトのビルドとテストの実行です。軽い作業なら 2 GB で動き、4 GB あれば余裕があります。サイズと現在の価格は VPS の選び方ガイドをご覧ください。
  • root 以外のユーザー。何かをインストールする前に作成してください(adduser dev を実行し、SSH 鍵をコピー)。その手順と SSH の堅牢化は Claude Code の VPS ガイドで解説しています。手順は 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 は生成したシェルコマンドを、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 なので、スマホやノート PC からは届きません。代わりにデバイスコードでのログインを使いましょう。ほぼ全員が引っかかる前提条件が 1 つあります。

  1. デバイスコードでのログインを有効にする。個人アカウントなら ChatGPT のセキュリティ設定で有効にします。Business、Edu、Enterprise のワークスペースでは、管理者がワークスペースの権限設定で有効にします。有効になるまで、あなたのアカウントではデバイスフローは使えません。
  2. サーバーでフローを開始する:
    codex login --device-auth
  3. 任意のデバイスで完了させる。Codex がリンクとワンタイムコードを表示します。スマホかノート PC でリンクを開き、ChatGPT にサインインしてコードを入力します。
  4. うまくいったか確認する:
    codex login status
    有効な認証方式を表示し、ログインしていれば終了コード 0 で終わるので、スクリプトでも使えます。

以上は OpenAI の認証のドキュメントに基づいています。デバイスコードが使えない場合のフォールバックが 2 つ紹介されています。

  • コールバックのポートを転送する。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

キーを標準入力からパイプで渡せば、シェルの履歴に残りません。ChatGPT のプランの枠ではなく、API の料金でトークン単位で支払います。課金の境界をはっきりさせたい共有のマシンや CI に向いています。

auth.json はパスワードと同じように扱う

デフォルトでは、Codex は認証情報を ~/.codex/auth.json にキャッシュします。cli_auth_credentials_store 設定で OS のキーリングに移すこともできます(file、keyring、auto、ephemeral)。あなたのユーザーのシェルを持つ人なら誰でも、あなたの ChatGPT のプランを使えます。エージェント用のマシンのシェルアクセスをほかの人に渡さないでください。

動かし続ける

対話的な codex のセッションは、起動したターミナルと運命をともにします。SSH 接続を閉じればセッションも終わります。回避する方法は 3 つあります。

定番の 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 の設定は tmux、mosh、Tailscale のガイドにあります。

非対話的な実行。codex exec "…" は TUI なしで 1 つのタスクを実行し、codex exec resume --last でその続きを実行します。cron ジョブや CI に合っていますが、承認の確認に答える人がいないので、後述のサンドボックスの設定がより重要になります。

セッションを所有し、再起動も乗り越えるデーモン。24 時間稼働のガイドで、systemd のユニット、Remote Control のサーバー、Maude のようにマシン上で自前のプロセスを動かすアプリを比較しています。

承認とサンドボックス

Codex には 2 つの別々の制御があります。コマンドが何に触れられるか(サンドボックス)と、いつ止まってあなたに確認するか(承認ポリシー)です。以下の値は OpenAI の承認とセキュリティのドキュメントと CLI リファレンスによるものです。

設定値サーバーでの意味
--sandbox / -sread-only、workspace-write、danger-full-accessgit リポジトリ内では 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 のバイパスモードと同じで、エージェントをフル権限で安全に動かすで解説しています。

スマホからアクセスする方法

選択肢Linux の VPS で使えるか得意なこと注意点
Codex Remote(ChatGPT アプリ)公式には不可。ホストは macOS か Windows で ChatGPT デスクトップアプリを動かす必要があり、そのアプリから VPS 上の SSH プロジェクトにアクセスできる。公式、プランに無料で含まれる、ネイティブ UIホストのパソコンをスリープさせずオンラインにしておく必要がある
SSH アプリ + tmux可無料、サーバーに追加するものなしスマホのキーボードでフルスクリーンの TUI、プッシュ通知なし
Maude可(SSH で接続できる任意の Linux / macOS)ネイティブのチャット UI、その場での承認、プッシュ通知、Claude Code なども使える有料アプリ。ChatGPT のプランかキーは別途必要

ヘッドレスの Linux と Codex Remote について補足します。CLI リファレンスには、ローカルの app-server 向けに codex remote-control start と codex remote-control pair が記載されています。一方、Remote connections のガイドは、今もホストは macOS か Windows でデスクトップアプリを動かすものと書いています。この食い違いについて、ユーザーが issue を立てています。#31183 はヘッドレスの Linux ホストを現行のモバイルクライアントから再ペアリングできないと報告しており、#35928 は矛盾を指摘しています。確認した時点では、どちらもオープンでした。この方法がうまくいくなら、それが公式の方法です。ただ、まだそれを前提にワークフローを組まないでください。

Maude でスマホから動かす

Maude は、TUI を使わずにスマホからその VPS を操作する方法の 1 つです。アドレスか貼り付けた ssh コマンドでサーバーを追加すると、アプリが SSH で自前の小さなデーモンをデプロイします。そのデーモンが検証済みの固定バージョンの Codex をチェックサムで検証してインストールするので、インストールの手順は省けます。Codex へのサインインは、スマホから ChatGPT のデバイスコードか API キーで行います。ただし、先に 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 を必要としません。Node が必要なのは、npm install -g @openai/codex という npm の方法を選んだ場合だけです。
ChatGPT のプランの代わりに API キーを使えますか?
はい。printenv OPENAI_API_KEY | codex login --with-api-key を実行します。その場合の利用料は、ChatGPT のプランの枠から消費されるのではなく、OpenAI の API の料金で課金されます。
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