夜、ヴォールト天井を持つ北欧風の部屋で、閉じたノートPCの傍らの石のベンチに座るNordBastionのホッキョクグマのマスコットが、シアン色のホログラフィックなループと時計の形の下でサーバーラックを見つめている
ハウツー · 実践25分·2026年更新

AIエージェントをVPSで24/7稼働させる。
ノートPCから離れ、眠らない金属の上へ。

AIエージェントをVPSで24/7稼働させるために必要なものは4つだけで、どれも特別なものではありません。稼働し続けるマシン、再起動してくれるスーパーバイザー、イメージに決して入り込まないシークレット、そして支出の上限 — それに加えて、身元を求めないホストです。

要点
  • 01

    ほとんどのエージェントは、ホスト型モデルAPIを結びつけるI/Oバウンドな接着剤にすぎません。推論はあなたのマシン上では行われないため、マシンは小さくて済みます。2 vCPUと4 GBあれば、シングルループのエージェントを支えられます。

  • 02

    稼働率はハードウェアの問題ではなく、スーパーバイザーの問題です。systemdユニットかDockerの再起動ポリシーを有効化し、実際の再起動でテストしておく — それがすべてです。

  • 03

    実際に痛い目を見る原因は2つだけです。イメージレイヤーに焼き込まれたシークレットと、支出上限のないエージェントが従量課金APIに対して一晩中ループし続けることです。

第1章

ノートPCはデプロイではない理由。4つの失敗モード、どれも地味なものばかり。

自分のマシンで動くエージェントは、動作するエージェントではあってもデプロイされたエージェントではありません。そのギャップは4つの地味な問題であり、どれもプロンプトエンジニアリングとは関係ありません。

スリープ。 蓋を閉じればプロセスは一時停止します。電源管理は蓋が閉じるよりずっと前からバックグラウンド処理を絞り始めるため、この失敗の最悪の形が生まれます。動くことは動くが、遅れて、しかも予測できないタイミングで動くエージェントです。

IPの変動。 自宅やカフェの回線は、再接続のたびに新しいアドレスを割り当ててきます。IPでレート制限されているもの、安定したコールバックを必要とするWebhook、登録したallowlistは、どれも間欠的に壊れます。

再起動。 OSのアップデートは、独自のスケジュールでマシンを再起動します。エージェントがサービスマネージャーに登録されていない限り、再起動後に戻ってくるのはデスクトップ画面であって、動作中のループではありません。たいていの人は1週間後になって気づきます。

環境の移動。 旅行する、マシンを買い替える、再インストールする。シェル履歴の中にしか存在しないものは再現できません — 3月のある午後に用意しただけのエージェントには、デプロイ手順そのものが存在しないのです。

サーバーが解決するのはこの4つだけであり、それ以外は何も解決しません — 正しさでも、コストでも、安全性でもありません。サーバーが与えてくれるのは、失敗した時にそれを直すのが自分自身であるようなランタイムです。それ以上のものとして売り込んでくる相手には警戒してください。

第2章

マシンのサイズを決める。どのエージェントの形に、どのVPSプランが合うか。

「人工知能」という言葉の響きから、つい過剰にプロビジョニングしたくなります。しかし、モデルが他人のハードウェア上で動く限り、それは重くありません。ホスト型APIを呼び出すエージェントは、その時間の大半をネットワークI/Oの待ちに費やしています。第3の形 — モデル自体を動かすこと — はここでは対象外です。そのワークロードが求めるのは仮想マシンよりむしろGPUです。

形その1 — シングルループ。 1つのプロセス、ポーリングまたはスケジュール実行されるループ、ホスト型モデルAPI、SQLiteに保存される状態。これがインディーエージェントや監視ボットの大半の姿であり、本当に小さくて済みます。

形その2 — 小さなスタック。 エージェントに加えて、Postgres、Redisを裏側に使ったキュー、ワーカー、そしてベクトルストア。ここで制約となるのはメモリです — プロセス内にロードされる埋め込みモデルは、それだけで1〜2ギガバイトを必要とします。

カタログと照らし合わせると、Sentinel(NB-V1 — 2 vCPU、4 GB RAM、120 GB NVMe、1 Gbps、無制限帯域、$3.90/month)は形その1を余裕でカバーします。Garrison(NB-V2 — 4 vCPU、8 GB、240 GB、$7.90/month)は、Postgresとキューが視野に入ってきた形その2にとっての現実的な下限です。Ravelin(NB-V3 — 8 vCPU、16 GB、480 GB、2.5 Gbps、$16.90/month)は、複数のエージェントが1台を共有する場合向けです。ローカル推論は専用サーバーの領分です。

契約は月単位ですが、長期契約には割引があります — 3か月で10%、6か月で20%、12か月で30%。あなたのエージェントがPythonプロセスではなくWindows専用のトレーディングクライアントであるなら、その場合のためにリモートデスクトップ向けプランが用意されています。

第3章

デプロイの手順 — 約15分でAIエージェントをVPS上で動かす。

サーバーはUbuntu 24.04 LTSかDebian 13でプロビジョニングします — どちらも注文時に選択でき、Ubuntu 22.04、Debian 12、AlmaLinux 9、Rocky Linux 9も用意されています。root権限の認証情報が渡されますが、それを手にして最初にすべきことは、それを使うのをやめることです。SSH鍵認証に馴染みがないなら、まず下のリンク先にあるハードニングガイドを読んでください。

1 — サービスユーザーを作成する。 adduser --system --group --home /srv/agent agent。エージェントはrootとして動かすべきではなく、対話的なシェルを持つべきでもありません。今この1コマンドを実行しておけば、後にエージェントが呼び出すツールが逆手に取られたとしても、被害の範囲は小さく抑えられます。

2 — コードをサーバーに配置する。 /srv/agentへgit cloneするか、サーバーにデプロイキーを残したくなければrsyncを使います。依存関係は固定してください。ロックファイルがあるかどうかで、再デプロイが再現可能になるか、思わぬ事態に驚かされるかが決まります。

3 — 環境を構築する。 python3 -m venv /srv/agent/.venvを実行し、そのvirtualenvのpipでロックファイルからインストールします。あるいはuvを導入し、インタプリタとロックファイルの両方を任せてもよいでしょう。どちらでも構いませんが、両者を混ぜるのはよくありません。

4 — 一度手動で実行する。 sudo -u agent /srv/agent/.venv/bin/python -m agent --once。この手順を飛ばしてサービスユニットに直行してはいけません。ここで起きる失敗の9割は、環境変数の欠落かノートPC相対のパスであり、そのどちらもjournaldよりターミナルで見た方がはるかに分かりやすいのです。

5 — スーパーバイザーに委ねる。 次の章で扱います。ここまでの手順は、あなたが起動しただけのスクリプトを、マシンが所有するサービスへと変えるものです。この一連の作業が15分よりも大幅に長くかかったなら、その原因はほぼ常に開発マシンへの暗黙の依存です — グローバルにインストールされたバイナリ、シェルプロファイルに書かれた認証情報、リポジトリの外にあるパスなどです。

第4章

24/7動かし続ける。systemd、Docker、そしてクラッシュループの罠。

SSHセッション経由で起動したプロセスは、セッションが終われば死に、再起動後に戻ってくることもありません。監視の仕組みは省略できるものではなく、そのための合理的な選択肢は2つあります。

systemd、単一プロセス向け。 /etc/systemd/system/agent.serviceにユニットを作成し、User=agent、WorkingDirectory=/srv/agent、ExecStartはvirtualenvのインタプリタを指すようにし、Restart=alwaysとRestartSec=5を設定します。そのあとsystemctl daemon-reload、続いてsystemctl enable --now agentを実行します。再起動を生き延びさせるのはenableの方です。enableせずにstartだけしておくことは、3週間後にエージェントを失う最もよくある原因です。

Docker、複数の構成要素向け。 エージェントに兄弟プロセス — データベース、キュー、ヘッドレスブラウザなど — がある場合は、それらを1つのComposeファイルに記述し、各サービスにrestart: unless-stoppedを設定します。unless-stoppedがalwaysと異なる重要な点が1つあります。意図的に停止したコンテナは、デーモンが再起動しても停止したままになるということです。

クラッシュループの罠。 systemdはデフォルトで再起動にレート制限をかけています。その時間枠の中で十分な回数クラッシュすると、ユニットはfailed状態に入り、再試行をやめてしまいます。ユニットファイルにはRestart=alwaysと明記されているのに、エージェントが静かに死んでしまったように見えるわけです。無期限に再試行させるにはStartLimitIntervalSec=0を設定し、壊れたエージェントが一晩中コアを回し続けないようRestartSecを大きくしてください。

生存していることは健全であることとは違います。9時間ソケットの読み込みで止まったままのループも、systemdが観測できるあらゆる指標から見れば「動作中のプロセス」です。ハートビートを公開してください。WatchdogSecを使ったウォッチドッグ、DockerのHEALTHCHECK、あるいはエージェントが各サイクルで触れるタイムスタンプファイルを用意し、それが古くなったら警告するタイマーを組み合わせるといった方法です。

第5章

シークレット。イメージに決して到達させてはいけない環境変数ファイル。

エージェントはWebアプリケーションよりも危険な材料を抱えています。モデルAPIキーは支出を伴う手段であり、トレーディングキーはレバレッジのかかったものであり、ウォレットキーは資金そのものです。そしてWebアプリと違い、エージェントは自分が書いたわけではないテキストに基づいて行動します。これにより、エージェントがキーを持っている状態と攻撃者がそれを持っている状態の境界が薄くなります。

イメージの外に置く。 Dockerfile内のENVやARGの値はイメージレイヤーに書き込まれ、そのイメージを入手した誰もがdocker historyで読み取れます。Composeのenv_file:、あるいはsystemdユニットのEnvironmentFile=を使い、そのファイルはビルドコンテキストの外に置いてください。

リポジトリの外に置く。 .gitignoreと.dockerignoreは、50回目のコミットではなく最初のコミットの時点で用意してください。一度でもコミットされたキーは、そのコミットを書き換えたとしても漏洩したものとして扱うべきです。オブジェクトはクローンやフォークの中に生き残るからです。履歴を書き換えるのではなく、キーをローテーションしてください。

そのファイルが触れられる範囲を制限する。 環境変数ファイルの所有者をサービスユーザーにし、mode 600を設定してください。root以外のサービスユーザーと組み合わせれば、サーバー上の他の場所で依存関係が侵害されたとしても、そこからディスク上のキーを単純に読み取ることはできなくなります。

各キーの権限は発行元で絞り込む。 1エージェントにつき1キーとし、プロバイダーが提供する最も狭い権限を選んでください — 読み取りだけで済むなら読み取り専用に、取引所のキーは出金を無効化し、サーバーのIPでallowlistを設定します。固定IPは、ノートPCから離れることで得られる目立たない利点です。ようやくallowlistが実用になるのです。複数人が同じ認証情報を必要とする場合は、姉妹ガイドで扱っているセルフホスト型のvaultの裏に置いてください。

第6章

スケジューリング。ループ、タイマー、そして足元をすくうタイムゾーン。

「常時稼働」という言葉は3つの異なるアーキテクチャを指しており、そのうち間違ったものを選ぶことが、処理の重複や実行漏れのよくある原因になります。

常駐ループ。 サイクルの間はスリープする、寿命の長い1つのプロセス。最も考えやすく、デフォルトとして正しい選択です。弱点は状態管理です。メモリ上のものはすべて再起動で失われるため、クラッシュを生き延びる必要があるものは変数ではなくSQLiteかPostgresに置くべきです。

スケジュール実行。 起動し、1単位の作業をこなして終了するプロセス。ここではOnCalendarを使ったsystemdタイマーの方が優れたツールです。主な理由はPersistent=trueにあります。ダウンタイムの後、persistentなタイマーは取りこぼした実行を発火させますが、cronは単にそれをスキップしてしまいます。

キュー。 プロデューサーがタスクをキューに入れ、ワーカーがそれを消費します。タスクが完了する速度より到着する速度の方が速くなった瞬間、これが欲しくなる仕組みです。再試行、デッドレター処理、同時実行数の上限も手に入ります。

どれを選んでも守るべき2つのルール。 すべてのタスクを冪等にすること — クラッシュ時に再起動するスーパーバイザーはタスクを再試行するため、再試行されたタスクが二重投稿や二重注文を起こしてはいけません。そして、サーバーの時計はUTCのままにし、変換は境界部分でのみ行うこと。年に2回、1時間ずれるスケジュールは見つけるのが面倒なバグです。

第7章

エージェントにツールを与える。同じマシン上のツールサーバー。

ツールを持たないエージェントは、ただのチャットループです。リポジトリを読み、データベースに問い合わせ、注文を出し、issueを立てることを可能にするのはツールであり、エージェントがサーバー上で暮らすようになったら、ツールもそこで暮らすべきです。

Model Context Protocol(MCP)は、こうしたツールを公開するための一般的な方法になりました。プライベートに運用するサーバーは、エージェントのすぐ隣に置くのが簡単です。同じマシン、同じプライベートなインターフェース、公開する必要もありません。姉妹ガイドがきちんと扱っています — リモートMCPサーバーのホスティングではTLS、streamable-HTTPトランスポート、OAuth、エージェントカードまでを扱い、身元証明不要でのホスティングという角度からは、同じスタックを身元の側面から扱っています。

まずlocalhostにバインドする。 利用者が同じマシン上のエージェントだけであるなら、ツールサーバーが公開ポートを持つ理由はありません。ループバックアドレスにバインドし、証明書は省略してください。2台目のマシンが必要になった場合にのみ公開し、その際にはTLSと認証の両方が必要です。どちらか一方では足りません。

ツールには機能する範囲で最小の権限だけを与える。 エージェントはテキストに基づいてどのツールを呼ぶかを決めますが、そのテキストの一部は外部から来ています。Webページや受信箱を読むエージェントにとって、プロンプトインジェクションは仮説的な話ではなく、想定すべき通常のケースです。読み取りしかできないツールは、書き込みをするよう言いくるめることができません。ツールがどうしても書き込みを必要とする場合は、破壊的な操作の経路には人間による確認を必須にしてください。

自分自身のエージェントではなく他人のエージェント向けにツールを作っているなら、マシン向けAPIエージェント向けの窓口が、このプラットフォームがプロビジョニングをエージェントに直接どう公開しているかを解説しています。

第8章

可観測性とコスト。何をログに残すか、そして暴走を止めるキルスイッチ。

実際のエージェント運用を支配する失敗モードは2つあり、どちらもクラッシュではありません。1つは、完璧に動作しているのに何の役にも立つものを生み出さないエージェント。もう1つは、完璧に動作しているのに一晩で4桁のAPI請求額を生み出すエージェントです。

内容ではなく「形」をログに残す。 タイムスタンプ、タスクID、ステップ数、呼び出したツール名、トークン合計、所要時間、結果。これだけで、実際に問うことになる運用上の疑問にはすべて答えられます。プロンプトと生成結果の全文は、そのエージェントがこれまで依頼されたすべてのことの記録であり、しかも平文のまま、他人の建物にあるディスクの上に置かれることになります。

保存期間に上限を設ける。 journaldは、止めるよう指示しない限り際限なく肥大化し続けます。journald.confのSystemMaxUseとMaxRetentionSecで、サイズと期間の両方に上限を設けてください。饒舌なエージェントを放置すれば数週間でディスクは埋まり、ディスクが満杯になった時の壊れ方は、きれいなクラッシュよりもずっと読み解きにくいものです。

支出を抑える3つの層。 プロバイダー側では、APIキーに厳格な上限を設けます — これはコード側のどんなバグでも回避できない唯一の制限であり、それでいて多くの人が省いてしまう部分です。エージェント内部では、実行ごとのトークンカウンターと中断の閾値を設けます。エージェントの周囲では、最大ステップ数と壁時計タイムアウトを設定し、自分自身と議論し続けるモデルが4000回ではなく20回で止まるようにします。

必要になる前にキルスイッチを用意しておく。 すべてを止める1つのコマンド。systemctl stop agent、あるいはdocker compose down。それが特定の鍵を持った特定のノートPCを必要としないことを確かめてください。悪い一晩と悪い一か月の違いは、暴走を止めるのに10秒かかるか1時間かかるかだけです。

第9章

身元に関する最低ライン。ホストが知っていること — そして、ホストが守ってくれないこと。

エージェントとは、認証情報を持ち、固定されたアドレスから、継続的にあなたの代わりに行動する寿命の長いプロセスです。そのため、レンタル記録は静的なWebサイトの場合よりも興味深いものになります。エージェントは何か月もの間、毎時間、あなたに帰属する行動を取り続けているからです。

ここでの最低ラインは、登録時のメールアドレスとパスワード、8種類の資産での決済 — Bitcoin、Ethereum、2つのチェーン上のTether、Monero、Litecoin、TRON、Solana — であり、どの段階でも身分証明書は必要ありません。データセンターは北欧の4つの立憲体制の国にあります。ストックホルム、ヘルシンキ、オスロ、レイキャビクです。運用方針のページでは何が保持されるかを、ネットワークのページでは経路について説明しています。

ここからが、宣伝文句よりも重要な限界の話です。身元を求めないホストが取り除くのはレンタル記録です。推論層には手を触れません。あなたのエージェントは、アカウントに紐づいたキーを使い、固定IPから、呼び出しのたびにモデルプロバイダーに対して認証を行っています。そのアカウントがあなたの本名で登録されているなら — たいていの人はそうです — 誰がハードウェアを借りているかとは無関係に、身元はそこで確立されてしまいます。ホスト層が取り除くのは1つのリンクだけです。それは本物のリンクですが、たった1つです。

ここから先は地味な話です。区画化してください。1エージェント、1サーバー、1キー、1ウォレット。ハードニングは30日目ではなく1日目に行ってください。何か月も無人で稼働するマシンにとって、最初の1時間のチェックリストにかける1時間は十分に価値があります。エージェントがプライベートネットワークに到達する必要があるなら、サービスを公開するのではなく、サーバー上でトンネルを終端させてください。設定についてはトンネルのガイドで扱っています。そして、エージェントが取引に使うのとは別のウォレットから暗号資産で支払ってください。

ここに挙げたことは何も特殊ではなく、また何も保証するものでもありません。これは、あなたが眠っている間にあなたの代わりに行動するものを運用するための、ごく普通の規律にすぎません — それこそが「継続的な運用」の意味のすべてです。残りのガイド群はガイド一覧にあります。

FAQ · VPS上のエージェント

質問、回答済み。

開発者がエージェントをlocalhostから移す前に、そしてその後の最初の1か月の間に尋ねる7つの質問。

AIエージェントを24/7稼働させるには、どの程度のVPSが必要ですか。

多くの人が想像するより少なくて済みます。推論を行うのはプロバイダー側のハードウェアであり、あなたのサーバーではないからです。ホスト型モデルAPIを呼び出してポーリングループを回すだけのエージェントはI/Oバウンドなプロセスであり、Sentinelプラン(2 vCPU、4 GB RAM、120 GB NVMe、$3.90/month)で十分に対応できます。Postgres、キュー、ローカルの埋め込みモデルを追加する段階になったら、Garrison(4 vCPU、8 GB、$7.90/month)に上げてください。

エージェントを稼働させ続けるには、systemdとDockerのどちらを使うべきですか。

どちらでも機能します。ただし故障のパターンが異なります。Restart=alwaysを設定したsystemdユニットは単一プロセスにとって最短の道であり、journald、リソース制限、起動順序を追加コストなしに手に入れられます。エージェントに兄弟プロセス(データベースやキューなど)がある場合は、restart: unless-stoppedを設定したDockerの方が向いています。Composeなら構成全体を1つのファイルで記述できるからです。何より重要なのは、実際にそれを有効化(enable)しておくこと、そして立ち去る前に一度再起動をテストしておくことです。

なぜ数回クラッシュした後、エージェントが再起動しなくなるのですか。

systemdが再起動にレート制限をかけているためです。StartLimitBurstとStartLimitIntervalSecは、短い時間枠内で許可される再起動回数を制限します。それを超えるとユニットはfailed状態に入ったまま留まり、まるで静かに死んでしまったかのように見えます。根本原因のクラッシュを修正するのが正しい対処法ですが、それが難しい場合はStartLimitIntervalSec=0でこの制限を無効化し、クラッシュループするエージェントがコアを再試行で消費し尽くさないようRestartSec=10を設定してください。

APIキーはどこに置けばよいですか。

コンテナイメージが決して見ることのないファイルの中に置いてください。環境変数ファイルはビルドコンテキストの外に置き、systemdユニットのEnvironmentFile=、あるいはComposeのenv_file:から参照し、サービスユーザーの所有でmode 600に設定します。シークレットのためにDockerfileでENVやARGを使うことは絶対に避けてください。それらの値はイメージレイヤーに焼き込まれ、docker historyで読み取れてしまいます。最初のコミットを行う前に、そのファイルを.gitignoreと.dockerignoreに追加しておいてください。

一晩でAPI予算を使い尽くされないようにするには、どうすればよいですか。

3つの層があり、そのすべてが必要です。プロバイダー側では、APIキーに厳格な支出上限を設定します。これはコード側のどんなバグでも回避できない唯一の制限です。エージェント内部では、実行ごとのトークン数や呼び出し回数を数え、閾値を超えたら中断します。エージェントの周囲では、タスクごとのステップ上限と壁時計タイムアウトを設けます。これはホスト側では代わりに行えません — VPSはレンタルした計算リソースであって、他社のAPIに対する予算ガードではないからです。

エージェントのログに絶対に書き込んではいけないものは何ですか。

プロンプトと生成結果の全文、ツール引数の生データ、APIキー、ウォレット関連情報、そしてユーザーが入力した内容です。代わりに実行の「形」を記録してください。タイムスタンプ、タスクID、ステップ数、ツール名、トークン合計、所要時間、結果です。饒舌すぎるエージェントログは、そのエージェントがこれまで依頼されたすべてのことの平文の記録であり、しかも物理的に自分が管理していないディスクの上にある、ということを忘れないでください。

KYC不要のホストを使えば、エージェントは匿名になりますか。

なりません。ここは正確に言っておく価値があります。身分証明書不要のサインアップと暗号資産決済は、ホスト側がサーバーに紐づけられる法的な身元情報を持たないことを意味するにすぎません。モデルプロバイダーの側には何の影響もありません。あなたのエージェントは、アカウントに紐づいたキーを使い、固定されたサーバーIPから、呼び出しのたびにそのAPIに対して認証を行っています。ホスト層が取り除くのは連鎖の中の一つのリンク — レンタル記録 — であり、取り除かれるのはそれだけです。

サーバーを取得する

KYC不要のVPSを借り、暗号資産で支払い、今夜のうちにエージェントをノートPCから移しましょう。

Sentinel — 2 vCPU、4 GB RAM、120 GB NVMe、無制限帯域、$3.90/month — シングルループのエージェントを、隣で動くツールサーバーの分の余裕も持たせて支えます。登録に必要なのはメールアドレスとパスワードだけ。どの段階でも書類は不要です。

最終レビュー · 2026-08-24 · 出典 · systemd.service、systemd.timer、journald.confの各マニュアルページ、Dockerのrestart-policyおよびComposeのドキュメント、Model Context Protocol仕様、NordBastionカタログ · 頻度 · 年次