Claude Code 始めました
AIにサーバーを任せて3日間で起きたこと

はじめに

前回の記事で、自宅サーバーの管理をAIに丸ごと任せた話を書いた。深夜にAIがパトロールして、昼間は監視スクリプトが異常を検知したらAIが出動する仕組みだ。

仕組みを作った話はした。では、実際に動かしてみてどうだったか。3日間の運用で起きたことを書く。


監視スクリプトが自分自身を壊した

運用3日目の朝、監視スクリプトが異常を検知した。license_api_prodコンテナが応答しない、と。

AIが出動して調査を始めた。SSHでサーバーに接続して、コンテナの状態を確認する。結果——コンテナは正常に動いていた。

誤検知だった。しかも2分後、今度はddnserでも同じ誤検知が出た。

原因:SSH接続の開きすぎ

AIが突き止めた原因はこうだ。

監視スクリプトは60秒ごとにサーバーの状態をチェックする。システムリソース(ディスク、メモリ、スワップ)で3本、7つのコンテナのヘルスチェックで最大9本。合計10本以上のSSH接続を同時に開いていた。

OpenSSHにはMaxStartupsという設定がある。同時接続数の上限だ。デフォルトは10。監視スクリプトがこの上限を超えていて、接続が弾かれていた。つまり、監視スクリプト自身がサーバーに負荷をかけて、自分のSSH接続を失敗させていた。

1回目の修正:並列を直列に

AIはヘルスチェックの実行方式をPromise.allSettled()による全並列からfor...ofによる順次実行に変更した。SSH接続が同時に1本しか開かれなくなった。

2回目の修正:リトライの追加

直列にしても、一時的なSSH切断は起こりうる。サーバー側の負荷やネットワークの瞬断で、1回だけ接続が切れることはある。

2分後の2回目の誤検知を受けて、AIは「SSHトランスポートエラー」を判別するヘルパー関数を追加した。Connection closedConnection refusedETIMEDOUTなどのパターンを検出して、3秒待ってから1回リトライする。リトライ後も失敗した場合だけ異常として報告する。

修正は2段階。並列→直列でSSH接続数を削減し、リトライで一時的な切断に対応。 どちらも人間の介入なし。Discordに「修正しました」と通知が来て、それで終わりだ。


深夜パトロールが見つけたもの

毎日深夜4時にAIがサーバー全体を巡回する。セキュリティ設定、リソース使用量、コンテナの構成、ログの中身。人間が日常的にチェックしない部分を、AIが代わりに見る。

Nextcloudのログが21GB

運用2日目のパトロールで、AIがNextcloudのログファイルの異常に気づいた。

/var/mnt/nextcloud_data/nextcloud.log21.3GB。

ログファイルが21GBに膨れ上がっていた。NFS上にあるためディスクの逼迫は起きていなかったが、ログローテーションが機能していない。自分では気づけなかった。

SELinuxの拒否ログが1,241件

もう一つ。SELinuxがauction-botのauction.dbに対するlockアクセスを毎分拒否していた。過去24時間で1,241件。

SELinuxはPermissiveモードで動いているので、実際にブロックはされていない。アプリは正常に動く。ただ、拒否のたびにsetroubleshootというデーモンが起動して分析を行い、CPU 22.9%を一時的に消費していた。

実害はないが、無駄にリソースを食っている。AIが見つけなければ、ずっと放置されていたと思う。


日々の定点観測

パトロールは毎日サーバー全体を見て回る。何を見るかもAIが判断するが、結果として日をまたぐとトレンドが見えてくる。

スワップ使用率の推移

日付スワップ使用率備考
4/289%
4/392%微増傾向
4/462%サーバー再起動でリセット

スワップが日々積み上がっていく傾向をAIが追跡していた。4/4にサーバーが再起動されてリセットされたが、再起動なしの長期稼働ではスワップが逼迫する可能性がある。AIはレポートに「継続監視が必要」と毎回書いている。

fail2banのBAN推移

日付現在BAN中累計BAN
4/214 IP235
4/310 IP → 14 IP242 → 293
4/48 IP

SSHへのブルートフォース攻撃が日常的に来ている。adminubuntumysqlといった汎用ユーザー名での接続試行。fail2banが淡々とBANしている。パスワード認証は無効で鍵認証のみなので突破はされないが、攻撃が来ていること自体は知っておきたい。AIがレポートで毎日報告してくれる。


おわりに

3日間で起きたことを振り返ると、AIが対処した問題のほとんどは「自分では気づけなかったもの」だ。

SSH接続の上限に引っかかっていたこと。Nextcloudのログが21GBに膨れていたこと。SELinuxの拒否ログが毎分積み上がっていたこと。スワップが日々逼迫していたこと。どれも、人間がわざわざログを開いて確認しない限り見えない。

自分が寝ている間にAIがサーバーを見て、朝起きたらDiscordに結果が来ている。問題があれば直してくれるし、直せなければ報告してくれる。3日間動かしてみて、この仕組みは思った以上に機能していると感じた。