きっかけ
マインクラフト(統合版)のサーバーを立てて3ヶ月半くらい経った。
もともと Splatoon 3 を一緒に遊んでいる人達が集まっている discord サーバーがあった。そろそろ Splatoon 3 の発売から 2 年が経とうかという 2024 年の夏、そこに集まっている人たちもなんとなく Splatoon 3 以外のこともしたいなぁという気持ちになってきていた。
もともと Splatoon 3 を遊ぶことを目的として集っている人たちではあったけど、 Splatoon 3 以外のゲームでもそこにいる人達と一緒に遊べるといいよね、という感じで、そこにいる面々で遊べるいい感じのゲームを模索するというのが続いていた。
そんなある日、ふとメンバーの1人がマインクラフトが遊びたいと言った。んだったと思う。
もともと Splatoon 3 を遊んでいる人たちが集まっている discord サーバーなので、Switch のマインクラフトを使って遊ぶ人もいると考えられるので統合版を一緒に遊ぶのが良いだろうということになった。
その際に問題になるのはみんなが一緒に遊ぶためのサーバーの用意である。
マインクラフト統合版のサーバーでメジャーどころというと、Minecraft Realms という公式のサーバがあるし、これを使うのが一般的なように思う。
これは 3人以上が一緒に遊ぶとなると、月額 7.99 ドルかかるし、10人以上は同時に接続できない。
Discord のサーバーの参加人数から言って、ピークで10人以上接続する可能性はあるし、接続できない人が出てくるとさみしいので上限人数に制限があるのはなんだか嫌だなぁと思った。
あと、大人にとって 7.99 ドルって大した額じゃないけど、毎月誰かにそれを負担してもらうのもなぁと思うし、みんなが遊ばなくなったときに、いつまで課金して維持し続けるかなど、ちょっと悩んでしまう所も多い。
なので、家の録画サーバーの性能が割と余裕があるので、そこでサーバーをホストすればいいのではないか、という気持ちになったのでやってみることにした。もともと、自分の子どもとその友達たちが一緒に遊ぶマインクラフトのサーバーがほしいと言っていたりとかして、やりたいなぁと思っていたいので。
その過程で、自前でマインクラフト統合版のサーバーを立てても、子どもやらが触ることが想定されている Switch 版では、自前で立てたものにつなぐことができないという制約があることを知っていた。
でも、色々調べてたら、この制約を回避する方法がある事がわかった。
というわけで、やってみることにした。
やったこと
大きく分けて以下のことをやった。
- マインクラフト統合版のサーバーを立てる
- Switch からの接続を可能にするための制約回避方法を用意する
- ログイン・ログアウト時に discord に書き込む bot を作る
- 自動バックアップの仕組みを作る
- マインクラフトにアップデートがあったら discord に書き込む機能を bot に追加する
以上の仕組みが、ここに書いてある録画サーバで動いている。
マインクラフト統合版のサーバーを立てる
この docker image が定期的にメンテナンスされているように見えたので、使うことにした。
https://hub.docker.com/r/itzg/minecraft-bedrock-server
docker image を動かすにあたっては、この docker image の元になっている github のレポジトリに、docker-compose.yml があるので、これをほぼそのまま使うことにした。
ただし、外向けのポート番号は変更してある。これは、後述の制約回避方法を使う仕組みを動かす際にポート番号が重複してしまい、重複回避方法側はポート番号を変更することが多分できないためである。
Switch からの接続を可能にするための制約回避方法を用意する
Switch 版等の家庭用 CS 機のマインクラフトでは、自前で立てた統合版サーバーにつなぐことができないという制約が一般にある。
この制約は、 BedrockConnect というサーバーに一旦接続することで回避する事ができる。
https://github.com/Pugmatt/BedrockConnect
BedrockConnect に接続するためには、Switch が参照する DNS サーバーを設定したり、通常のサーバーの接続方法とは異なる方法を使う必要がある。
これは若干面倒だし、公式のドキュメントは英語だしでハードルが高そうなので、接続するのに最低限必要な設定項目や手順をまとめた google document を作って共有した。
ここまではやろうと思い立ったその日のうちにできた。
ログイン・ログアウト時に discord に書き込む bot を作る
誰かがログインしてたら自分もログインして一緒に遊ぼう、みたいなことを思えるかなと思ったので、マインクラフトを起動しなくても、誰かがログインしているかを簡単に確認できるようにするため、ログイン・ログアウト時に discord に書き込む bot を作った。
マインクラフトのサーバーに対して、ログイン・ログアウトが行われると、サーバーの標準出力に、その旨が表示される。
その際に “list” というコマンドを標準入力から入力すると、ログインしているユーザーの一覧が表示される。
標準出力を監視しつつ、必要に応じて “list” コマンドを実行し、結果を整形して discord に書き込むことで簡単に作れた。
ちなみに、マインクラフトのサーバーは、 docker コンテナとして動いているため、このコンテナに attach することで、標準入力と標準出力は取得できる。
実装は、golang で書いた。docker に attach をするなら、docker 自体も golang で書かれているし、まぁ golang が楽だろうと思ったので。
自動バックアップの仕組みを作る
ログイン・ログアウト時に discord に書き込む bot を作る過程でユーザのログイン状況を把握できるようになった。
なので、全員がログアウトしたときに、一旦 docker container を停止して、バックアップを取る仕組みを作った。
バックアップの取得には、以前から docker container の volume のバックアップに使っている、下記 docker image を使った。
https://hub.docker.com/r/jareware/docker-volume-backup/tags
最初は、とりあえず全員がログアウトしたらすぐにバックアップを取ってたんだけど、マインクラフトのクライアントの調子が悪そう等の理由で、接続を切ってすぐにログインする場合がぼちぼちあって、そのたびにバックアップを取るのは無駄だなぁと思ったので、誰も接続していない状況が 10 分間続いたらバックアップを取るように変更した。
マインクラフトにアップデートがあったら discord に書き込む機能を bot に追加する
マインクラフトは定期的にアップデートされる。
運用していると、クライアントのアップデートにサーバーが追いつけなかったりとかして、接続できなくなることがぼちぼち起きたので、アップデートがあったら、 discord に書き込む仕組みを作った。
これは、自分がさっさとアップデート作業を開始するためでもある、全員にアップデートがあったということを知らせることで、繋がらなかったときに色々確認してもらうことを促すためでもある。
まとめ
そんなこんなで色々動かして、3ヶ月半くらいええ感じに動いていて、ほぼ毎日誰かがログインして遊んでいる。
ちなみに、自分はサーバーはホストしているものの、あまりマインクラフトという、こう、すごくコツコツとした作業が必要なゲーム自体には興味がイマイチ持てず、たまにログインしては友人たちが作った建物やら機械やらを眺めて、マインクラフトってすごいんだなぁと感心するばかりである。
かなりいろんなことが自動化できて、運用が楽な状態にはなったと思うので、みんなが飽きるまでのんびり運用していこうと思う。