
はじめに
前回の記事で、自宅サーバーの管理を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 closed、Connection refused、ETIMEDOUTなどのパターンを検出して、3秒待ってから1回リトライする。リトライ後も失敗した場合だけ異常として報告する。
修正は2段階。並列→直列でSSH接続数を削減し、リトライで一時的な切断に対応。 どちらも人間の介入なし。Discordに「修正しました」と通知が来て、それで終わりだ。
深夜パトロールが見つけたもの
毎日深夜4時にAIがサーバー全体を巡回する。セキュリティ設定、リソース使用量、コンテナの構成、ログの中身。人間が日常的にチェックしない部分を、AIが代わりに見る。
Nextcloudのログが21GB
運用2日目のパトロールで、AIがNextcloudのログファイルの異常に気づいた。
/var/mnt/nextcloud_data/nextcloud.log — 21.3GB。
ログファイルが21GBに膨れ上がっていた。NFS上にあるためディスクの逼迫は起きていなかったが、ログローテーションが機能していない。自分では気づけなかった。
SELinuxの拒否ログが1,241件
もう一つ。SELinuxがauction-botのauction.dbに対するlockアクセスを毎分拒否していた。過去24時間で1,241件。
SELinuxはPermissiveモードで動いているので、実際にブロックはされていない。アプリは正常に動く。ただ、拒否のたびにsetroubleshootというデーモンが起動して分析を行い、CPU 22.9%を一時的に消費していた。
実害はないが、無駄にリソースを食っている。AIが見つけなければ、ずっと放置されていたと思う。
日々の定点観測
パトロールは毎日サーバー全体を見て回る。何を見るかもAIが判断するが、結果として日をまたぐとトレンドが見えてくる。
スワップ使用率の推移
| 日付 | スワップ使用率 | 備考 |
|---|---|---|
| 4/2 | 89% | |
| 4/3 | 92% | 微増傾向 |
| 4/4 | 62% | サーバー再起動でリセット |
スワップが日々積み上がっていく傾向をAIが追跡していた。4/4にサーバーが再起動されてリセットされたが、再起動なしの長期稼働ではスワップが逼迫する可能性がある。AIはレポートに「継続監視が必要」と毎回書いている。
fail2banのBAN推移
| 日付 | 現在BAN中 | 累計BAN |
|---|---|---|
| 4/2 | 14 IP | 235 |
| 4/3 | 10 IP → 14 IP | 242 → 293 |
| 4/4 | 8 IP | — |
SSHへのブルートフォース攻撃が日常的に来ている。admin、ubuntu、mysqlといった汎用ユーザー名での接続試行。fail2banが淡々とBANしている。パスワード認証は無効で鍵認証のみなので突破はされないが、攻撃が来ていること自体は知っておきたい。AIがレポートで毎日報告してくれる。
おわりに
3日間で起きたことを振り返ると、AIが対処した問題のほとんどは「自分では気づけなかったもの」だ。
SSH接続の上限に引っかかっていたこと。Nextcloudのログが21GBに膨れていたこと。SELinuxの拒否ログが毎分積み上がっていたこと。スワップが日々逼迫していたこと。どれも、人間がわざわざログを開いて確認しない限り見えない。
自分が寝ている間にAIがサーバーを見て、朝起きたらDiscordに結果が来ている。問題があれば直してくれるし、直せなければ報告してくれる。3日間動かしてみて、この仕組みは思った以上に機能していると感じた。