もしも自サイトのDNSが変更された時にSNSやPushoverに通知するようにしたメモ
自宅で個人サーバーを運用していると、予期せぬ停電やルーターの再起動、あるいは回線の瞬断などによって、サーバーのグローバルIPアドレスが突然変わってしまうことがあります。
現在、ドメインの紐付け(DDNS)自体は NAS の機能を使って MyDNS.jp へ自動更新されるように設定しているのですが、IPアドレスが切り替わってからDNSの情報がインターネット上に浸透(キャッシュクリア)するまでには、どうしても数分から数十分ほどのタイムラグが発生してしまいます。
その間、サイトにアクセスしてくれた方には「ページが表示されない」状態になってしまうため、サーバー管理者自身がいち早く状況を把握できるようにした上で、訪問者の皆様へも自動でアナウンスできる仕組みを作ってみました。

今回構築した仕組みの概要
15分(または30分)おきにタスクスケジューラ(cron)で自動実行されるPHPスクリプトをサーバー内に配置しました。主な処理の流れは以下の通りです。
0. IPアドレス変更自体はDDNSで自動更新される
まず、MyDNS.jp の DDNS 機能を使って、サーバーのグローバルIPアドレスが変更された場合に自動でネームサーバーの情報が更新されるようにしています。これにより、訪問者の方々がアクセスする際には、常に最新のIPアドレスへ誘導されるようになっています。
1. 現在のグローバルIPアドレスの取得
基本的には自サーバーのグローバルIPアドレスを取得するために、$_SERVER['SERVER_ADDR'] を使うのですが、万が一サーバー側で何らかの理由で正しいIPアドレスが取得できない場合に備えて、外部のパブリックIP検出APIを利用して現在のIPアドレスを取得するようにしています。
2. 前回のIPアドレスとの比較
サーバー内の特定のキャッシュフォルダに保存された「前回確認したIPアドレス(例:xxx.xxx.xxx.xxx のような形で、生のアドレスは安全に隠蔽したファイル)」を読み込み、現在のIPアドレスと比較します。
3. 変動を検知したときのアラート・自動投稿
IPアドレスの変動を検知すると、以下の通知を一斉に自動送信します。
Pushover(管理者向け)
スマートフォン宛てに「IPアドレスの変更を検知しました」という通知を送り、変更前のIPと新しいIP、検知日時をリアルタイムに通知します。これにより、自宅サーバー周辺で停電や機器の再起動が起きたことがすぐに分かります。
X (旧Twitter) & Mastodon(ユーザー向け)
自サイトの公式アカウント宛てに「サーバーのIPアドレス更新に伴い、一時的にホームページにアクセスしづらい状態が発生しています」といった障害アナウンスを自動でポストします。
4. 新しいIPアドレスの安全な保存
確認が完了したら、新しいIPアドレスを保存ファイルに書き込みます。ファイル書き込み時の競合(破損)を防ぐため、PHPの flock を用いたファイルロック制御も組み込んでいます。
統合cron-jobファイルへのスマートな一本化
それと、今回のIPアドレスの監視処理を導入するにあたって、これまでサーバー内で個別に動きがちだったお掃除処理や、旅行・お仕事のWebhook自動投稿、ブログポイントの更新といったさまざまなcron-jobの整理と一本化も行いました。
15分ごとにこの統括ファイルが実行されるのですが、以下のようにかしこくタスクを切り分ける制御にしています。
ほぼリアルタイム(15分ごと)に動くべきタスク
現在のグローバルIPアドレスの取得
今回作成した「グローバルIPアドレスの監視」
閲覧数マイルストーン(100PV、1000PVなど)に達したときのお祝いおめでとうポストキューの処理
Webhookが正しく動作しているかのヘルスチェック
1日1回、特定の時間以降にだけ動くタスク
古いアクセスログやスケジュールのクリーンアップ
ブログ記事投稿ポイントの自動付与
ジャーナルの自動アーカイブ処理など
このように設定したことで、サーバーや外部APIへの不要な負荷はほぼゼロに抑えつつ、障害検知やお祝いポストといった「スピード感が欲しいもの」だけを15分間隔でテキパキと実行してくれるようになりました。タスクスケジューラに登録するコマンドも1つにまとまり、管理がかなり楽になりました。
終わりに
個人で自宅サーバーを運用していると、停電やルーターの突然の再起動といったトラブルは避けて通れない部分があるのですが、こうして自動で状況を教えてくれたり、代わりにアナウンスをしてくれたりする仕組みを少し付け足すだけで、運用の安心感がだいぶ変わるなと感じています。
また、DDNSを導入したことにより、今まではネームサーバーに手動でDNS情報を更新する必要があったのですが、自動化されたことによって、もしも自宅サーバーのIPアドレスが変わってしまったとしても、訪問者の方々がアクセスできない時間を最小限に抑えられるようになりました。
これからも、見に来てくださる方々がいつでも快適にイラストやブログを楽しめるよう、サイトの安定運用に向けてコツコツと手を入れていきたいですね。