一覧に戻る

ブログ

クラウドVMやヘッドレスLinuxサーバーでClaude Codeを動かし、iPhoneから操作する

エージェントはクラウドVM、リモート開発機、Dockerコンテナなど常時稼働するLinuxマシンであれば何でも動作します。iPhoneはどこにいても操作用の画面になります。

公開日 タグ: 使い始める / linux / cloud / systemd / claude-code / codex / amp / remote-coding / mobile-ai-coding
ブログ

このカテゴリのプロダクト/開発アップデートを確認できます。

カテゴリを見る

Tactic Remoteのほとんどのユーザーは、コードを書いているMacと同じマシン上でサーバーを動かしています。それが最も自然な出発点です。しかし、ホストのコンピューターはラップトップである必要はなく、同じ机の上にある必要もありません。

npx tacticremoteはNode.jsが動くLinuxマシンであれば何でも動作します。クラウドVM、リモート開発機、テレビの下に置いたヘッドレスボックス、Dockerコンテナなど、どこでも構いません。起動してしまえば、iOSアプリがCloudflare Tunnel経由で接続し、LAN上と同じChat Mode、Terminal Mode、Quick Prompts、プッシュ通知、ワンタップ承認が使えるようになります。

このガイドは、そのような構成についての解説です。リモートサーバーでエージェントを常時稼働させ、iPhoneでどこからでも操作する方法を説明します。

なぜエージェントをリモートサーバーで動かすのか

ラップトップからホストを移したい理由はいくつかあります。

ラップトップを充電器につなぎっぱなしにしなくていい長時間ジョブ。 数時間かかるリファクタリング、大規模なテストスイートの実行、探索的なコーディングセッションは、ラップトップの蓋を開け続けていられる時間を超えることがあります。クラウドVMなら継続的に動き続けます。ラップトップを閉じても、ジョブは続きます。

スマートフォンから常時アクセスできる。 サーバーが常に起動していれば、外出前に起動する必要がありません。アプリを開けばセッションがそこにあります。

CI周辺のワークロード。 パッチの草案作成、ブランチへのテストスイートの実行、プルリクエストの事前審査にAIエージェントを使うチームがあります。個々の開発者マシンとは別の専用Linuxボックスは、そのような用途に自然な選択です。

リソースの余裕。 CPUやRAMが豊富なマシンや、APIエンドポイントに近いマシンにエージェントのタスクをオフロードすることで、大きなタスクの実行時間を短縮できます。

Macが不要。 メインマシンがWindowsワークステーションでも、Linuxサーバーが使えれば、そこでエージェントを動かしてiPhoneから操作できます。

前提条件

以下の手順を進めるには、次のものが必要です。

  • インターネット経由で到達可能なLinuxサーバーまたはVM(ディストリビューション不問。Ubuntu 22.04以降での動作を確認済み)
  • Node.js 16以降がインストールされていること(node --versionで確認)
  • そのサーバーに使用したいAIエージェントがインストール・認証済みであること:
    • Claude Code: Anthropicのインストール手順に従い、claude loginを実行
    • Codex: OpenAIのドキュメントに従いインストールと認証を完了
    • Amp: Ampのドキュメントに従いインストールとサインインを完了
  • iPhoneにiOSアプリがインストールされていること(App Store)

MacのメニューバーアプリやWindowsアプリは不要です。これらはデスクトップ用のオプションのGUIラッパーです。ヘッドレスサーバーでは、ホスト側に必要なのはnpx tacticremoteだけです。

サーバーのインストールと起動

npx tacticremoteはグローバルインストールなしでサーバーを取得・実行します。新規サーバーでは次のコマンドを実行します。

npx tacticremote

初回起動時に次のような出力が表示されます。

Tactic Remote server listening on port 8765
API Key: tr_xxxxxxxxxxxxxxxxxxxx
Pair with QR or enter the address manually in the iOS app

リモートサーバー(LAN不使用、mDNS不使用)の場合はCloudflare Tunnel経由で接続します。上に表示されるAPI KeyがiPhoneの認証に使われます。コピーしておいてください。ペアリング時にアプリで入力します。

常に最新版ではなく特定のバージョンを固定したい場合は次のようにします。

npx tacticremote@latest

systemdで常時稼働させる

npx tacticremoteをシェルで実行するとサーバーが起動しますが、シェルセッションが終了するとプロセスも終了します。起動時に自動スタートし、クラッシュ時に再起動するバックグラウンドサービスとして動かすには、systemdを使います。

ユニットファイルを作成します。youruserはそのプロセスを所有するLinuxユーザー名に置き換え、エージェントを特定のフォルダで起動したい場合はWorkingDirectoryをプロジェクトディレクトリに変更してください。

# /etc/systemd/system/tacticremote.service
[Unit]
Description=Tactic Remote server
After=network-online.target
Wants=network-online.target
 
[Service]
Type=simple
User=youruser
WorkingDirectory=/home/youruser
ExecStart=/usr/bin/npx tacticremote
Restart=on-failure
RestartSec=5
Environment=HOME=/home/youruser
 
[Install]
WantedBy=multi-user.target

有効化して起動します。

sudo systemctl daemon-reload
sudo systemctl enable tacticremote
sudo systemctl start tacticremote
sudo systemctl status tacticremote

ログはいつでも次のコマンドで確認できます。

journalctl -u tacticremote -f

ユニットファイルに関していくつか補足します。

  • After=network-online.targetは、サーバーが起動する前にネットワークが利用可能であることを保証します。起動時にCloudflare Tunnelが接続する必要がある場合に重要です。
  • Restart=on-failureと5秒の遅延により、一時的なエラーからサーバーが自動回復します。タイトなループで即座にバウンスすることもありません。
  • npxが/usr/bin/npxにない場合は、which npxで正しいパスを確認しExecStartを更新してください。npxの代わりにnpm install -g tacticremoteでグローバルインストールしたバイナリのフルパスを使うこともできます。
  • Environment=HOMEの行は、Node/npmが正しいユーザーのホーム以下のキャッシュやグローバルパッケージを見つけられるようにします。sudo昇格で実行する場合に重要になることがあります。

Cloudflare Tunnel経由でiPhoneを接続する

リモートサーバーでは共有LANがないため、mDNSによる自動検出は機能しません。この構成での接続方法はCloudflare Tunnelです。

Tactic RemoteにはCloudflare Tunnelが組み込まれており、トンネル自体のために別途cloudflaredをインストールする必要はありません。サーバー起動時にフラグを渡して有効化します。

npx tacticremote --tunnel --api-key YOUR_SECRET_KEY

systemd経由で動かしている場合はユニットファイルを更新します。

ExecStart=/usr/bin/npx tacticremote --tunnel --api-key YOUR_SECRET_KEY

Cloudflare Tunnelが有効になると、サーバーはtrycloudflare.comのURLを出力します。

Cloudflare Tunnel active: https://example-random-name.trycloudflare.com
API Key: tr_xxxxxxxxxxxxxxxxxxxx

iPhoneでの手順:

  1. Tactic Remoteを開く
  2. Add Hostをタップし、Manualを選択
  3. ホストアドレスにtrycloudflare.comのURLを入力
  4. サーバー出力のAPI Keyを入力
  5. Connectをタップ

接続はCloudflare経由でエンドツーエンドで暗号化されています。コードやターミナルの出力がTactic Remoteのクラウドリレーを通過することはありません。そのようなリレーは存在しません。トラフィックはサーバーからCloudflareのエッジに送られ、トンネルを経由してiOSアプリに直接届きます。

恒久的なセットアップの場合、一時的なtrycloudflare.comアドレスではなく、独自ドメインに紐付けた名前付きCloudflare Tunnelを使うことを検討してください。再起動後もペアリングURLが変わらず安定します。その方法についてはCloudflare Tunnelセットアップガイドを参照してください。

セキュリティについて

この構成(リモートサーバー、Cloudflare Tunnel、API Key)に関連するセキュリティ上の特性は次の通りです。

  • サーバーのポート8765をインターネットに開放する必要はありません。Cloudflare Tunnelはサーバーからのアウトバウンド接続を使うため、インバウンドポートを公開する必要がありません。
  • API Key認証により、そのキーを知っているデバイスのみが接続できます。強固なキーを設定するか、自動生成されたキーを使用してください。
  • LANモードはプレーンなws://を使用します。リモートサーバーではLANモードを使用しないため、これは該当しません。Cloudflare TunnelのトラフィックはTLSです。

サーバーがプライベートVPC内にある場合、ファイアウォールに穴を開けることなくアクセスする方法がCloudflare Tunnelです。

サーバー上でのマルチエージェント

リモートサーバーの構成は、ローカルのMacやWindowsホストと同じエージェントの選択をサポートします。iOSアプリで新しいセッションを作成すると、セッションごとのピッカーでサーバーにインストールされているClaude Code、Codex、Ampから選択できます。

各セッションは独立しています。Claude Codeセッションで長いテストタスクを実行しながら、別のブランチでCodexセッションを同時に動かすことができます。iOSアプリはセッション間を切り替えます。

この構成でもプッシュ通知は機能します。エージェントが完了したとき、承認待ちで一時停止したとき、または予期せず終了したとき、iPhoneに通知が届きます。常にアプリを開いて監視するのではなく、定期的に確認するだけで済む長時間ジョブにとって、これが重要な機能です。

Dockerで動かす

サーバー環境がDockerベースの場合、コンテナ内でnpx tacticremoteを実行できます。主な考慮事項は次の通りです。

  • コンテナにエージェント(Claude Code、Codex、Amp)がインストールされ、認証済みであること
  • LANモードを使用する場合はポート8765を公開する必要がある(Cloudflare Tunnelでは不要)
  • Cloudflare Tunnelを使用する場合、コンテナはアウトバウンドのインターネットアクセスが必要
  • コンテナ内のプロセス管理(systemdの代わりにCMDやスーパーバイザーを使用)

最小限のDockerfileの断片:

RUN npm install -g tacticremote
CMD ["tacticremote", "--tunnel", "--api-key", "YOUR_SECRET_KEY"]

エージェントの永続的な認証情報(例えばClaude Codeの~/.claudeディレクトリ)はボリュームとしてマウントし、コンテナ再起動後も維持できるようにしてください。

注意事項

エージェントの認証情報は依然としてサーバー上に必要です。 npx tacticremoteはClaude Code、Codex、Ampの認証を処理しません。Tactic Remoteがセッションを開始する前に、それらのエージェントがサーバーマシンにインストールされ、サインイン済みである必要があります。

Cloudflare Tunnelはわずかなレイテンシーオーバーヘッドを加えます。 インタラクティブな使用では通常は気になりません(ほとんどの地域で100ms未満)。非常にスループットの高いターミナル出力では目立つことがあります。LANモードは利用可能な場合は高速ですが、LANモードはiPhoneとサーバーが同じネットワーク上にある必要があります。

Node.jsのバージョンが重要です。 最低限Node 16が必要で、Node 20 LTSを推奨します。node --versionで確認してください。

初回のnpx実行時はパッケージをダウンロードします。 サーバーのエグレスルールが厳しい場合は、npmレジストリをホワイトリストに追加してください。またはnpm install -g tacticremoteでグローバルインストールし、systemdユニットファイルでtacticremoteを直接使用することもできます。

Linuxではセッションの永続化にtmuxを使用します。 tmuxがインストールされていることを確認してください(apt install tmuxまたは同等のコマンド)。tmuxがない場合、セッションは再接続後に維持されません。

この構成ではiOSアプリの無料プランで十分に機能します。 Chat Mode、Terminal Mode、プッシュ通知、マルチエージェントは無料で利用できます。Proプランは追加機能を提供します。料金:無料 / Pro 月額$2.99 / 年額$19.99。


常時稼働のサーバーでエージェントを動かすことは、リモートコントロールモデルで最大の効果を発揮する使い方です。エージェントは夜通し、会議中、フライト中も作業を続け、iPhoneが確認用の窓口になります。

初めてこれをセットアップする場合は、まずnpx tacticremote --tunnel --api-key YOUR_SECRET_KEYの基本的なアプローチから始め、iPhoneからエンドツーエンドの接続を確認した上で、信頼性のためにsystemdサービスを追加してください。

関連記事

Tactic Remote を試す

スマートフォンからコーディングエージェントを操作

Mac、Windows、Linux 上の Claude Code や Codex などに接続。iPhone や iPad で進捗を確認し、次の指示を送れます。