VPS上でのClaude Code
新規UbuntuのVPS上でClaude Codeを動かす。SSHのセキュリティ強化、Node.jsのインストール、Dockerによる分離、ヘッドレス認証、24時間365日稼働のサーバーに必要な監視コマンドを解説。
設定をやめて、構築を始めよう。
AIオーケストレーション付きSaaSビルダーテンプレート。
問題: Claude Codeはノートパソコン上では自然に使えるが、リモートサーバーとなると話が変わる。長時間ジョブのために24時間365日稼働させたい場合、複数のマシンから環境を持ち回ることなくアクセスしたい場合、あるいは重いAI処理をノートパソコンのバッテリーから切り離したい場合もあるだろう。
仕組みを理解すれば、VPS上でClaude Codeを動かすのはシンプルだ。必要な構成要素はSSH、Node.js、認証、そして分離のためのDocker(任意)。本ガイドでは、新規Ubuntuサーバーにそのままペーストできるコマンドとともに、全セットアップを順を追って解説する。
VPSの選択と必要なもの
Claude CodeはNode.jsの一般的なアプリより多くのリソースを必要とする。モデル自体はAnthropicのサーバー上で動くが、ローカルプロセスはコンテキスト管理、ファイル操作、ツール実行を担う。
VPSの最低スペック:
- vCPU 2個(マルチエージェントのワークロードには4個推奨)
- RAM 4 GB(8 GB推奨)
- SSDストレージ 40 GB
- Ubuntu 22.04 または 24.04 LTS
おすすめのプロバイダー: 主要なVPSホストはどれも問題なく動作する。AWS Lightsail、DigitalOcean、Hetzner、Linodeはいずれも月額10〜20ドルでこのスペックを満たすプランを提供している。Hetznerはヨーロッパの開発者にとってコストパフォーマンスが高い。AWSの中にいるなら、Lightsailが最も簡単だ。
開始前に用意するもの:
- Anthropic APIキー(console.anthropic.comから取得)またはPro/Maxサブスクリプション
- サーバーへのSSHアクセス
- ドメイン名(任意、Remote Controlアクセス用)
SSHセットアップとセキュアアクセス
まっさらなUbuntuサーバーから始める。多くのプロバイダーはパスワード付きのrootとしてログインする状態で渡してくる。最初にやるべきことはセキュリティ強化だ。
# 新しいサーバーに接続
ssh root@your-server-ip
# rootでないユーザーを作成
adduser deploy
usermod -aG sudo deploy
# SSHキー認証を設定
mkdir -p /home/deploy/.ssh
# ローカルマシンから実行する公開鍵のコピー:
# ssh-copy-id deploy@your-server-ip
# パスワード認証を無効化
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd他のものをインストールする前に、基本的なファイアウォールを設定する:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable以降は常にrootでないユーザーとして接続する: ssh deploy@your-server-ip。
ヘッドレスサーバーへのClaude Codeインストール
Claude CodeにはNode.js 18以上が必要だ。現行LTSにはNodeSourceリポジトリを使う:
# Node.js 22 LTSをインストール
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
# インストールを確認
node --version # v22.xと表示されるはず
npm --version
# Claude Codeをグローバルにインストール
npm install -g @anthropic-ai/claude-code
# Claude Codeのインストールを確認
claude --version認証: ブラウザのないヘッドレスサーバーではAPIキーで認証する。
# AnthropicのAPIキーを設定
export ANTHROPIC_API_KEY="sk-ant-..."
# セッションをまたいで永続化するには、シェルのプロファイルに追加
echo 'export ANTHROPIC_API_KEY="sk-ant-..."' >> ~/.bashrc
source ~/.bashrcPro/MaxサブスクリプションでOAuth認証を使いたい場合は、claudeを一度実行して、表示された認証URLをコピーし、任意のデバイスのブラウザで開いてから、コードをターミナルに貼り付ける。
非インタラクティブモードでのClaude Code実行
サーバーで便利なのはヘッドレスモードであり、インタラクティブなチャットではない。自動化がここから始まる。
単一コマンドの実行:
# 1つのタスクを実行して終了
claude -p "Review the codebase in /opt/apps/myproject and list any security issues"
# 処理のための入力をパイプ
cat error-log.txt | claude -p "Analyze these errors and suggest fixes"-pフラグ(プリントモード)はClaude Codeを非インタラクティブに実行する。プロンプトを読み込み、結果を出力して終了する。チャットUIも、入力待ちもない。
リモート管理のためにSSHと組み合わせる: VPSにホストされたClaude Codeの真価がここで発揮される。ローカルマシンから:
# ノートパソコンからサーバー上のClaude Codeを実行
ssh deploy@your-server "cd /opt/apps/myproject && claude -p 'Run the test suite and fix any failures'"Remote Controlを使えば、スマートフォンや別のデバイスから実行中のインタラクティブセッションに飛び込むこともできる。長時間のエージェント実行を監視するときに便利だ。
Dockerデプロイのワークフロー
Dockerは分離性と再現性を加える。何か壊れたら、コンテナを削除して新しいものを起動する。汚染されたサーバーをクリーンアップする必要はない。
Claude Codeワークスペース用の**docker-compose.ymlを作成する**:
version: "3.8"
services:
claude-workspace:
image: node:22-slim
container_name: claude-code
working_dir: /workspace
volumes:
- ./projects:/workspace
- claude-cache:/home/node/.claude
environment:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- NODE_ENV=production
command: >
bash -c "
npm install -g @anthropic-ai/claude-code &&
tail -f /dev/null
"
restart: unless-stopped
volumes:
claude-cache:ワークスペースを起動して使う:
# コンテナを起動
docker compose up -d
# コンテナ内でClaude Codeを実行
docker exec -it claude-code claude -p "List all files in the workspace"
# インタラクティブセッションを開く
docker exec -it claude-code claude
# コンテナのログを表示
docker logs claude-codetail -f /dev/nullの行はコンテナを生かしておくので、好きなだけexecできる。claude-cacheボリュームはコンテナ再起動をまたいでClaudeの認証とセッションデータを保持する。
プロジェクト固有のコンテナには、プロジェクトごとに別のcomposeファイルを使う。それぞれが必要なファイルだけをマウントした分離された環境を持つ。
監視とログ管理
VPS上で長時間稼働するClaude Codeセッションは目を光らせておく必要がある。午前3時にプロセスが静かにクラッシュするのは避けたい。
SSH切断後もセッションが生き続けるようtmuxまたはscreenを使う:
# 新しいtmuxセッションを開始
tmux new -s claude-session
# tmux内でClaude Codeを実行
cd /opt/apps/myproject
claude
# デタッチ: Ctrl+B, 次にD
# 後で再アタッチ:
tmux attach -t claude-session常時稼働のClaude Codeワーカー用のsystemdサービス:
# /etc/systemd/system/claude-worker.service
[Unit]
Description=Claude Code Worker
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/apps/myproject
Environment=ANTHROPIC_API_KEY=sk-ant-...
ExecStart=/usr/bin/claude -p "Analyze /var/log/app.log for errors since the last check and write a summary to /opt/apps/myproject/issues/latest-report.md"
Restart=always
RestartSec=3600
[Install]
WantedBy=multi-user.targetsudo systemctl enable claude-worker
sudo systemctl start claude-worker
# ステータスを確認
sudo systemctl status claude-worker
# ログを表示
journalctl -u claude-worker -fよくあるエラーと実際の解決策
「EACCES: permission denied, mkdir '/usr/lib/node_modules'」
rootでNode.jsをインストールしたため、npmがグローバルインストールの書き込みアクセスを求めている。修正:
sudo chown -R $(whoami) /usr/lib/node_modules
# または、より良い方法: nvmのようなNodeバージョンマネージャーを使う「Error: Unable to open browser for authentication」
ヘッドレスサーバーでは正常。上記のAPIキー方式を使うか、別のデバイスのブラウザに認証URLを貼り付ける。
OOM(メモリ不足)によるClaude Codeプロセスのkill
VPSのRAMが不足している。多数のサブエージェントを生成するマルチエージェントセッションはエージェントごとにメモリを消費する。解決策:
# 現在のメモリ使用量を確認
free -h
# スワップ領域がなければ追加
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab長時間のClaude CodeセッションでSSH接続が切断される
ローカルマシンでSSHキープアライブを設定する:
# ~/.ssh/config
Host your-server
HostName your-server-ip
User deploy
ServerAliveInterval 60
ServerAliveCountMax 3あるいはtmux内で実行する(上記参照)。そうすればSSHが切断してもセッションは継続する。
セキュリティの考慮事項
実際の認証情報を保持するサーバー上でAIコーディングエージェントを動かすには、特別な注意が必要だ。
APIキーは絶対にコミットしない。環境変数またはシークレットマネージャーを使う:
# gitignoreされた.envファイルを使う
echo "ANTHROPIC_API_KEY=sk-ant-..." > /opt/apps/myproject/.env
# シェルで読み込む
set -a; source /opt/apps/myproject/.env; set +a自動タスクではClaude Codeのファイルアクセスを制限する。--sandboxフラグでファイルシステムとネットワークアクセスを制限できる:
claude --sandbox -p "Analyze this codebase for security issues"
Fail2banでSSHへのブルートフォース攻撃をブロックする:
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2banサーバーを常に最新の状態に保つ:
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y次のステップ
VPSにホストされたClaude Codeは、ローカルマシンではできないワークフローを可能にする。24時間365日稼働、眠っている間に動くスケジュールタスク、ノートパソコンのバッテリーを消費しないマルチエージェントセッション。gitのworktreeと組み合わせてブランチごとの分離された作業を実現したり、Remote Controlでスマートフォンからセッションを操作したりすることもできる。
小さく始めよう。SSHで基本的なVPS上でClaude Codeを動かすことから始める。分離が必要になったらDockerを加える。自動化が必要になったらsystemdサービスを加える。そこから拡張していく。
設定をやめて、構築を始めよう。
AIオーケストレーション付きSaaSビルダーテンプレート。