Linux サーバーに Claude Code と ChatGPT Codex を導入する:ステップバイステップガイド
インストール直後の Debian または Ubuntu から、実際に作業できる AI エージェントまで:ユーザーと sudo 許可リスト、Node.js 22、Claude Code、Codex CLI、Gemini CLI のインストールとログイン、ルールファイル、cron ジョブ、最初のタスク、典型的なエラー。
このガイドでは、インストールしたばかりの Debian または Ubuntu サーバーを出発点に、ログを分析し、設定を確認し、保守作業をこなす AI エージェントを実際に使える状態にするまでの手順を説明します。Claude Code(Anthropic)と Codex CLI(OpenAI、ChatGPT のコマンドラインツール)を、どちらも権限を制限した専用ユーザーの下で設定し、3 つ目の選択肢として Gemini CLI(Google)も紹介します。すべてのコマンドは、Debian 13 と Ubuntu 24.04 を載せた KernelHost KVM ルートサーバー で実際に試しています。AI マネージドサーバーの基本と、どのような構成があるかについては、記事 AI マネージドサーバー:AI エージェントを安全に接続する で解説しています。
2026 年 9 月時点の情報です。ツールは急速に進化しているため、迷ったときはそれぞれclaude --help、codex --help、gemini --helpでフラグを確認してください。
前提条件
- Debian 12 または 13、あるいは Ubuntu 22.04 または 24.04 を載せ、SSH で root アクセスできるルートサーバー。AlmaLinux と Rocky Linux でも手順は同じです。異なるのはパッケージコマンドだけで、
dnfがaptに代わります。 - 基本的な堅牢化が済んでいること:鍵による SSH ログイン、ファイアウォール、自動セキュリティ更新。これらは 新しいルートサーバーのチェックリスト ですべて扱っています。
- Anthropic のアカウント(Claude Pro、Max、Team)または API キー、ChatGPT アカウント(Plus、Pro、Team)または OpenAI の API キー。設定するツールが 1 つだけなら、必要なのはそのうちの 1 つだけです。
api.anthropic.comとapi.openai.comへの外向きの HTTPS 通信。KernelHost のサーバーでは最初から許可されています。独自に厳しいファイアウォールを設定している場合は、この通信を許可する必要があります。
AI エージェントにはどの程度のサーバーで足りるか
言語モデルはプロバイダー側で動作するため、AI エージェントのためにサーバーへ特別なハードウェアや GPU を用意する必要はありません。サーバー上で動くのはコマンドラインツールと Node.js だけで、セッション中に使うメモリは合わせてもたいてい数百 MB です。ほかにあまりサービスを動かしていないサーバーなら、2 vCPU と 4 GB RAM で十分です。ウェブサイト、データベース、ゲームサーバーも並行して運用している場合は、エージェント用に 1 GB ほどのメモリの余裕を見込んでください。KernelHost の KVM ルートサーバー は約 30 秒で利用可能になり、料金は最低利用期間のない PrePaid 方式です。そのため、まずエージェントを試してみるテスト環境としても適しています。
ステップ 1:専用ユーザーを作成し、sudo を制限する
エージェントは決して root として動かしません。専用のアカウントを与え、sudo の許可リストを通じて、必要なコマンドだけを過不足なく使えるようにします。最初は少数の読み取り専用コマンドから始め、タスクが本当に必要とするときにだけリストを広げてください。
sudo adduser --disabled-password --gecos "KI-Agent" aiagent
sudo tee /etc/sudoers.d/aiagent >/dev/null <<'EOF'
aiagent ALL=(root) NOPASSWD: /usr/bin/journalctl *, /usr/bin/systemctl status *, /usr/bin/systemctl restart nginx, /usr/bin/apt-get update, /usr/bin/apt-get upgrade -y, /usr/bin/tail *, /usr/bin/df *, /usr/bin/ss *
EOF
sudo chmod 440 /etc/sudoers.d/aiagent
sudo visudo -cf /etc/sudoers.d/aiagent
最後の行で構文をチェックします。sudoers ファイルに誤りがあると、全員が sudo を使えなくなるおそれがあります。そのため、このチェックは必ず行ってください。--disabled-password を指定すると、誰もパスワードで aiagent としてログインできなくなります。このアカウントには、後で sudo -iu aiagent を使って切り替えます。sudo ユーザーの基本的な仕組みは、記事 Linux で sudo ユーザーを作成する で説明しています。
sudo でエディターを許可せず、書き込み権限を絞って与える
エージェントに /etc 内のファイルを変更させる場合でも、sudo で nano を許可してはいけません(それでは /etc/sudoers を含むあらゆるファイルを編集できてしまいます)。代わりに、グループと対象を絞った書き込み権限を使います。たとえば setfacl -m u:aiagent:rw /etc/nginx/sites-available/meine-seite.conf のようにします。最初のうちは、エージェントが変更を提案し、それをご自身で反映するだけで十分です。
許可リストでワイルドカードを使うコマンドにも、同じことが言えます。/usr/bin/tail * を許可すると、エージェントは root がアクセスできるあらゆるファイルを読めるようになり、認証情報を含むファイルも例外ではありません。これを避けたい場合は、/usr/bin/tail -n 200 /var/log/nginx/error.log のように、許可するパスを具体的に書き出します。
ステップ 2:Node.js 22 をインストールする
どちらのツールも Node.js 上で動作します。Claude Code はバージョン 18 以上、Codex CLI は 22 以上を必要とするため、22 LTS をインストールします。Debian 12 のパッケージソースに含まれるバージョンは古すぎるので、最新版を提供している NodeSource から入れます。
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version
npm --version
root 権限を使わない代替手段:nvm
インターネットから取得したスクリプトを root 権限で実行したくない場合は、エージェントユーザーのホームディレクトリで nvm を使います。この方法なら、root 権限はまったく必要ありません。nvm のインストールコマンドはプロジェクトの README から取得してください。その後は次の 3 行で済みます。
nvm install 22
nvm alias default 22
node --version
詳細とそのほかの方法は、Debian での Node.js ガイド で説明しています。
ステップ 3:Claude Code をインストールしてログインする
ここからはエージェントのアカウントで作業します。
sudo -iu aiagent
curl -fsSL https://claude.ai/install.sh | bash
claude --version
ネイティブインストーラーは Claude Code を ~/.local/bin に配置し、自動で最新の状態に保ちます。npm を使って npm install -g @anthropic-ai/claude-code でインストールすることもできます。これが EACCES で失敗する場合は、後述のトラブルシューティングの節が役に立ちます。
ブラウザーのないサーバーでのログイン
claude を初めて起動すると、ログインを求められます。Claude アカウントの場合は通常ブラウザーが開きますが、ブラウザーのないサーバーではアドレスとコードが表示されるので、そのコードをノート PC やスマートフォンで承認します。ログインはその後、ログアウトするまで、このサーバー上のこのユーザーに対して有効です。
スクリプトと cron ジョブ用の API キー
スクリプトや cron ジョブには、API キーのほうが適しています。
echo 'export ANTHROPIC_API_KEY="sk-ant-..."' >> ~/.bashrc
chmod 600 ~/.bashrc
source ~/.bashrc
claude -p "OK とだけ答えてください"
これでキーは、ほかのユーザーが読めないエージェントユーザーのホームディレクトリにだけ置かれます。キーは Anthropic のコンソールで、月額の支出上限を付けて作成してください。そうすれば、セッションが暴走しても高額な費用にはなりません。キーそのものは、エージェントへのタスクにも、エージェントに出力させるファイルにも、決して書かないでください。
ステップ 4:サーバー向けに Claude Code を設定する
ルールファイル CLAUDE.md
Claude Code は起動時に、カレントディレクトリにあるファイル CLAUDE.md を読み込みます。ここには、すべてのセッションに適用されるルールを書きます。エージェントのホームディレクトリに、このファイルを置く作業ディレクトリを作成します。
mkdir -p ~/server && cd ~/server
cat > CLAUDE.md <<'EOF'
# このサーバーのルール
- これは本番サーバーである(Debian 13、nginx、PHP-FPM、MariaDB)。
- 読み取り専用コマンド(journalctl、systemctl status、tail、df、ss)はいつでも実行してよい。
- 書き込みを伴うコマンドの前には、何が変わるかを簡潔に説明し、承認を待つこと。
- パッケージの削除、/var/lib 配下のファイルの削除、ユーザーの作成や削除は決して行わないこと。
- パスワード、鍵、顧客データは決して出力に書き出さないこと。
- 各タスクの最後に、3 文の要約を出すこと。
EOF
このファイルは運用とともに育っていきます。エージェントが意図と違う動きをしたら、そのたびに修正内容を新しいルールとして追記します。数週間もすれば、お使いのサーバーでの作業の進め方がかなり正確に反映されたファイルになります。
settings.json の許可リスト
これに加えてツールの許可リストを用意し、Claude Code が読み取り専用コマンドは確認なしで実行し、それ以外はすべて承認を求めるようにします。ファイル ~/.claude/settings.json は、このユーザーに適用されます。
mkdir -p ~/.claude
cat > ~/.claude/settings.json <<'EOF'
{
"permissions": {
"allow": [
"Bash(sudo journalctl:*)",
"Bash(sudo systemctl status:*)",
"Bash(sudo tail:*)",
"Bash(df:*)",
"Bash(free:*)",
"Bash(ss:*)"
],
"deny": [
"Bash(rm -rf:*)",
"Bash(sudo rm:*)",
"Bash(dd:*)",
"Bash(mkfs:*)"
]
}
}
EOF
deny リストは追加の安全網であって、壁ではありません。1 つのコマンドはさまざまな書き方ができるからです。本当の境界線を引くのはステップ 1 の sudo 許可リストです。ユーザーに許されていないことは、エージェントにも許されないためです。
最初のタスクを対話形式で
では、最初のタスクを対話形式で実行します。
cd ~/server && claude
> 直近 24 時間の journalctl のエラーを要約し、最も多い原因を 3 つ挙げてください。
cron ジョブで無人実行する
同じタスクは無人でも実行できます。たとえば毎日 7 時に動く cron ジョブにして、結果をメールで受け取る方法です。
0 7 * * * cd /home/aiagent/server && /home/aiagent/.local/bin/claude -p "直近 24 時間の journalctl のエラーと警告を要約してください。サービス名、時刻、考えられる原因を挙げてください。" --allowedTools "Bash(sudo journalctl:*)" 2>&1 | mail -s "サーバー日次レポート" admin@example.com
フラグ -p は対話セッションなしで Claude Code を起動し、--allowedTools は使えるツールをその実行に必要なものだけに制限します。書き込みを伴う操作は、無人実行に含めないでください。cron ジョブの基本的な設定方法は、記事 Linux で cron ジョブを設定する で説明しています。
ステップ 5:Codex CLI(ChatGPT)をインストールしてログインする
インストールとログイン
Codex CLI は、ChatGPT を支えるモデルをコマンドラインで使えるようにする OpenAI のツールです。同じユーザーアカウントにインストールします。
npm install -g @openai/codex
codex --version
ログインには ChatGPT アカウント(Plus、Pro、Team)を使います。codex を起動して「Sign in with ChatGPT」を選び、表示されたアドレスをブラウザーのあるデバイスで開きます。スクリプトで使う場合は、代わりに OpenAI プラットフォームで発行した API キーを設定します。
echo 'export OPENAI_API_KEY="sk-..."' >> ~/.bashrc
source ~/.bashrc
config.toml のサンドボックスと承認モード
Codex には独自のサンドボックスと承認モードが備わっています。どちらも ~/.codex/config.toml で指定します。本番サーバーでは、次の組み合わせが妥当です。
mkdir -p ~/.codex
cat > ~/.codex/config.toml <<'EOF'
approval_policy = "on-request"
sandbox_mode = "workspace-write"
EOF
workspace-write は現在の作業ディレクトリ内での書き込みだけを許可し、on-request はそれを超える操作すべてについて、エージェントに許可を求めさせます。danger-full-access レベルはこの両方を解除するため、本番システムで使うべきではありません。
AGENTS.md のルール
CLAUDE.md と同じようなルールを、Codex は作業ディレクトリにあるファイル AGENTS.md から読み込みます。内容はそのまま流用できます。
cp ~/server/CLAUDE.md ~/server/AGENTS.md
cd ~/server && codex "有効化されているすべての systemd サービスが動作しているか確認し、失敗しているものを最後のエラーメッセージとともに一覧にしてください。"
無人実行には、タスクを引数に取る codex exec "Aufgabe" を使います。これは claude -p に相当します。
ステップ 6:3 つ目の選択肢としての Gemini CLI
Gemini CLI は Google のコマンドラインツールで、同じ仕組みで動作します。こちらも Node.js 上で動き、同じユーザーアカウントにインストールします。
npm install -g @google/gemini-cli
gemini --version
gemini を初めて起動したときは、Google アカウントでログインします。スクリプト用には、環境変数 GEMINI_API_KEY に API キーを設定します。Gemini CLI は、ルールを作業ディレクトリにあるファイル GEMINI.md から読み込みます。ここでも CLAUDE.md の内容をそのまま使えます。無人実行は、タスクを引数にして gemini -p "Aufgabe" で開始します。3 つのツールのどれを使うかは、主にすでにお持ちのアカウントで決まります。サーバー上での作業の進め方は 3 つとも同じで、複数を並行して運用することもできます。
代替案:エージェントを手元の PC で動かし、SSH 経由で作業させる
サーバーに何もインストールしたくない場合は、ノート PC で Claude Code または Codex を起動し、エージェントに SSH 経由でコマンドを実行させます。そのために、サーバーにはエージェントユーザー専用の SSH 鍵を登録し、CLAUDE.md には、サーバー向けのコマンドの先頭に必ず ssh aiagent@server を付けるというルールを書きます。たまの保守ならこれで十分ですが、長めのタスクや cron ジョブはサーバー上で直接動かすほうが適しています。専用の鍵、ホストエイリアス、承認を組み合わせた SSH 接続の詳細と、その後エージェントがどのような手順で本番システムにデプロイするかは、実践レポート AI をサーバーに接続する で紹介しています。
ステップ 7:安全を確保し、制限を設ける
- 何かを変更するセッションの前には、必ずスナップショットかバックアップを取る。 自動化の方法は サーバーのバックアップ戦略 で紹介しています。
- 承認モードはオンのままにする。 Claude Code の
--dangerously-skip-permissionsと Codex のdanger-full-accessは、使い捨ての VM のためのものです。 - 秘密情報はエージェントの手の届かない場所に置く。 エージェントユーザーが
.envファイル、データベースのパスワード、顧客データを読めないようにします。エージェントが読んだものは、プロバイダーに送られます。 - コスト上限は、API キーごとにプロバイダーのコンソールで設定します。
- 追跡可能性:
etckeeperをインストールして/etc配下のすべての変更を Git に記録し、エージェントの要約も保存しておきます。 - 受信側は何も変わらない。 いずれのツールも、必要とするのは外向きの HTTPS 通信だけです。ファイアウォール、Fail2ban、ホスティング事業者の DDoS 対策はそのままです。
最初のタスク:手始めに向いた 5 つの依頼
最初のタスクに向いているのは、読む量が多く、リスクのないものです。エージェントの仕事ぶりがどれほど丁寧かをすぐに確かめられ、しかもすぐに役立ちます。
- ログレポート:「直近 24 時間のエラーと警告をサービスごとにまとめ、考えられる原因を添えて要約してください。」
- サービスの確認:「失敗しているすべての systemd サービスを最後のエラーメッセージとともに一覧にし、それぞれ何をすべきかを説明してください。何も変更しないでください。」
- ディスク容量:「最も容量を使っているディレクトリを示し、安全に整理できるものを提案してください。」背景は記事 Linux でディスクがいっぱいになったとき で解説しています。
- アップデート:「適用待ちのセキュリティアップデートがあるパッケージはどれで、適用後に再起動が必要なサービスはどれですか?」
- ウェブサーバー:「nginx の設定にエラーや古くなった設定がないか確認し、見つかった箇所をそれぞれ説明してください。」
こうした分析が正確になってはじめて、エージェントに書き込みを伴うタスクを任せる価値が出てきます。その場合も、まずはテストシステムで行ってください。
典型的なエラーと解決策
| メッセージ | 原因と解決策 |
EACCES: permission denied(npm install -g の実行時) | npm がシステムディレクトリに書き込もうとしています。ユーザープレフィックスを設定します。npm config set prefix ~/.npm-global を実行し、export PATH=~/.npm-global/bin:$PATH を ~/.bashrc に追記して、もう一度インストールします。 |
Node.js version ... is not supported | ディストリビューションのパッケージソースから入れたバージョンが古すぎます。ステップ 2 をやり直し、node --version で 22.x が有効になっていることを確認します。 |
claude: command not found | ネイティブインストーラーはプログラムを ~/.local/bin に配置しますが、このディレクトリがまだ PATH に含まれていません。export PATH=$HOME/.local/bin:$PATH を ~/.bashrc に追記し、シェルを再読み込みします。 |
| ログイン時にブラウザーが開かない | サーバーでは想定どおりの動作です。表示されたアドレスを別のデバイスで開いてコードを入力するか、API キーに切り替えます。 |
起動時の ECONNREFUSED またはタイムアウト | 外向きの HTTPS 通信がブロックされています。外向きのポート 443 に関するファイアウォールルールを確認してください。KernelHost のサーバーでは、外向きの通信は最初から制限されていません。 |
429 rate limit または overloaded | サブスクリプションや API の利用枠を使い切ったか、プロバイダー側が混み合っています。しばらく待ち、無人実行には数分後に再試行する処理を組み込みます。 |
| エージェントがコマンドのたびに確認を求める | ~/.claude/settings.json の許可リスト、または approval_policy(config.toml 内)を調整します。ただし、追加するのは読み取り専用コマンドだけです。 |
| cron ジョブから空のメールが届く | cron では、シェルの環境変数が設定されていません。API キーは crontab か、ジョブが読み込む環境ファイルで設定し、プログラムはフルパスで指定します。 |
ツールを最新の状態に保つ
ネイティブインストーラーでインストールした Claude Code は、自動で更新されます。npm でインストールしたツールは、1 つのコマンドで最新の状態にできます。
npm update -g @openai/codex @google/gemini-cli
codex --version
gemini --version
新しいバージョンでは、フラグやデフォルト設定が変わることがあります。アップデート後は、無人実行をそのまま続ける前にリリースノートにひととおり目を通し、次の日次レポートにおかしな点がないか確認してください。
結論
サーバー上の AI エージェントは 1 時間で準備できます。ユーザー、sudo 許可リスト、Node.js、ツール、ルールを順に用意するだけです。本当に手間がかかるのは制限の設計で、ここでは意図的に狭く設定しています。制限はタスクが必要とするときに一歩ずつ広げ、決して一律には広げないでください。KernelHost のルートサーバー や 専用サーバー では、そのために有効化が必要なものは何もありません。root アクセス、ディストリビューションの自由な選択、外向きの接続はすべて標準で利用できます。
その後エージェントが本番システムにどのようにデプロイするか、バックアップ、切り戻し手順、承認を含めた流れは、実践レポート AI をサーバーに接続する で説明しています。
まとめ
- Claude Code、Codex CLI、Gemini CLI は、Node.js 22 があればどの Linux サーバーでも動作し、GPU は必要ありません。
- エージェントには sudo 許可リスト付きの専用ユーザーを与え、決して root では動かしません。
- ルールは
CLAUDE.md、AGENTS.md、GEMINI.mdのいずれかに書きます。読み取り専用コマンドは許可リストに入れ、それ以外はすべて承認が必要です。 - cron ジョブやスクリプトには、支出上限を設定した API キーを使うのが適切な方法です。無人実行は読み取りだけにとどめます。
- セッションの前には毎回バックアップを取り、秘密情報はエージェントの手の届かない場所に置き、承認モードはオンのままにします。
- KernelHost のサーバーには、root アクセス、ディストリビューションの自由な選択、外向きの接続が最初から備わっています。
よくあるご質問
Claude Code にはサブスクリプションが必要ですか、それとも API キーで足りますか?
ブラウザーのないサーバーで Codex CLI にログインするにはどうすればよいですか?
どの Node.js バージョンが必要ですか?
npm install -g が EACCES で失敗するのはなぜですか?
Claude Code を cron ジョブで実行できますか?
KernelHost の Windows サーバーでも動作しますか?
Claude Code、Codex CLI、Gemini CLI を 1 台のサーバーで並行して使えますか?
AI エージェントはサーバー上でどのくらいのメモリを必要としますか?
Claude Code、Codex CLI、Gemini CLI はどのように更新しますか?
サーバーに Gemini CLI を導入するにはどうすればよいですか?
AI エージェントを root で動かしてはいけないのはなぜですか?
2026 KernelHost GmbH。無断複写・転載を禁じます。本ガイドは著作権により保護されております。他のウェブサイトへの掲載は、一部のみの場合や編集を加えた場合であっても、当社の書面による同意なしには認められません。出典の明記とリンクを添えた引用は歓迎いたします。

