DebtCraft のプラグインを本番に入れた直後、「サーバーに入れない」と連絡が来た。家の中からは入れるのに、外からだけ入れない。
調べた順番
1. サーバーは起動しているか
マイクラのログの最後に Done (10.793s)! が出ていて、プラグインもエラーなく起動していた。
2. ポートは開いているか
外からポートが開いているか調べるサイトでは、「開いている」と出た。
このサーバーは、入口の Velocity(プロキシ)がつなぎを受けて、ロビー、サバイバルの順に送る構成になっている。docker ps で見ると、Velocity・ロビー・サバイバルは3つとも起動していた。
3. 接続が届いているか
Velocity のログには、外から入ろうとしたプレイヤーの記録が1件もなかった。サーバーまでつなぎが届いていない。
4. ドメインはどこを向いているか
ここで原因が分かった。
curl -s https://ifconfig.me # 今のグローバル IP
getent hosts mc.ch1w4.com # ドメインが向いている IP
この2つの IP が違っていた。プロバイダーの都合でグローバル IP が変わったのに、ドメインは古い IP を向いたままだった。
ポートを調べるサイトは「今の IP」で調べるので、開いていると出る。一方、プレイヤーはドメインで古い IP につなぎに行くので入れない。家の中からは家の中の IP で入るので、影響がなかった。
なぜ IP の変更が反映されなかったか
IP が変わったら自動でドメインを書き換えるように、DDNS のコンテナ(Cloudflare 用)を動かしていた。そのログを見ると、こう出続けていた。
😞 Failed to check if a zone named home.ch1w4.com exists: Invalid access token (9109)
Cloudflare の API トークンが無効になっていた。IP は正しく取れているのに、書き換えができていなかった。トークンが無効になっていても、IP が変わるまでは困らないので、気づけなかった。
直したこと
- すぐに直す:Cloudflare のダッシュボードで、A レコードを今の IP に手で書き換えた。マイクラはプロキシ(オレンジの雲)を通せないので、「DNS のみ」のままにする
- トークンを作り直す:権限は「ゾーン - DNS - 編集」と「ゾーン - ゾーン - 読み取り」、対象は自分のドメインだけ。IP での制限と有効期限は付けない(IP で制限すると、IP が変わったときにまた更新できなくなる)
- DDNS のコンテナだけ作り直す:マイクラと同じ compose にあるので、
docker compose up -d --force-recreate --no-deps ddnsのようにサービス名を指定した。指定を忘れると、マイクラまで再起動してしまう
学んだこと
- 「ポートは開いているのに入れない」ときは、ドメインと今の IP が合っているかを最初に見る
- DDNS は、IP が変わるまで失敗に気づけない。ログに失敗が出たら通知が来る仕組みがほしい
- 自宅サーバーを公開するなら、固定 IP か、Cloudflare Tunnel のように IP に頼らない方法も考えておく(ただし、マイクラの通信は普通のトンネルでは通せない)