はじめに
年末年始に遊ぶ用に、SteamのゲームサーバーをGCP上に構築しました。
めでたくGoogle Compute Engineのプリエンプティブインスタンス上に
Dockerで構築して、なんとなく運用できてるので紹介したく投稿してみます。
ちなみにゲームは7 Days To Dieというゾンビのゲームです。
前提
プリエンプティブインスタンスは格安でGoogleのComputeEngineを利用できるオプションですが、
- 突然インスタンスが停止するリスクがある。
- 1度の起動で最大24時間しか実行できない。
- 時々利用できないこともある。(有限のリソースを格安で借りるイメージのため)
- (*) 今のところ起動ができないことは一度も無し
という特徴があります。(それ以外は通常のCompute Engineとほぼ同じ)
なので、常時起動しておく必要はなくて、やりたい時だけサーバーを立ち上げられればOK!
という人に向いています。
構築
やりたかったこと
- 長期間プレイせず、サーバーの立ち上げ方を忘れてしまうことがあるので構築手順をコード化したい。
- データはインスタンスの外にバックアップしたい。
- プリエンプティブVMが突然シャットダウンされて、万が一セーブが間に合わなくても大丈夫なように。
- しばらくプレイしない時はインスタンスも、ストレージも消しておきたい。
以上の理由から、Dockerで構築し、データはGCSに定期バックアップするという構成にしました。
構築方法
こちらのGitHubリポジトリにソースやREADMEをまとめています。多少コードが汚い箇所ありますが、、、動いています!
https://github.com/suzukenz/7d2d-server-docker
(せっかくQiitaに記事を書くのにGitHub参照ですみません。。。)
- ゲームサーバーコンテナとバックアップ用コンテナを別々に作成
- データボリュームにデータを保存して、バックアップ用コンテナからGCSに定期バックアップ(Syncするだけ)
- バックアップ不要なら、ゲームサーバーコンテナだけ起動する
- 実行時にサーバにデータがなかったら、GCSからダウンロード(逆Sync)
という構成です。
ハマったところ
やはりハマったのはDocker周りでした。上記のソースコードでは解決している(諦めている)ので興味ない人は読まなくて大丈夫です。
データボリュームをDockerコンテナにマウントした時のPermission
当初はデータボリュームではなくホストのディレクトリを直接マウントしてゲームデータのディレクトリにしようとしたが、ディレクトリのPermissionの理由で、コンテナからアクセスできなくなったりしてしまった。
- 解決しようとするとコードが複雑になってしまう。
- ログなどを簡単に見たい(コンテナへのアクセスを省きたい)ためそうしたかったが、GCSにデータを上げればブラウザから見れるのでまあいいやと思ってデータボリュームにした。
Container-Optimized OSは難しかった
Container-Optimized OS を使えばインスタンスにDockerを準備する手間が省けるじゃん!!
と思いましたが、環境が色々と特殊になってしまいそのために書くことが増えるので諦めてDebianでインスタンスを立てました。
具体的には、ディスクが基本的にはnon-executableなので./hogehoge.sh
とかができない等。
代わりに、Debian上でDockerとdocker-composeを一発インストールするスクリプトを将来忘れないために置いておきました。
結果
なんとなくうまく運用できています。
インスタンスが突然終了することもありましたが、Dockerコンテナが終了シグナルを受信して、しっかりゲームデータはセーブされていました。
また、インスタンスを一回削除して作り直した時には、自動でGCSからデータをダウンロードしてきて途中のデータからゲームを続行できました。
以下に、今回の良かった点などをまとめておきます。
Compute Engineでやるメリット
- クラウドなので、自分が家にいなくてもコンソールにアクセスできればサーバーを起動できる。
- インスタンスのスケーリングが超簡単。(スペックを上げるも下げるも自由!)
Dockerでやるメリット
- ローカル(MacOS)で簡単にテストできる。
- インスタンスが停止させられてしまう時の擬似テストもしやすい。
- DockerコンテナをKillしてやればよい
- 今回一回作ったので、おそらく今後違うゲームにも流用できる。(★これが一番嬉しい!)
- 特にゲームをインストールする箇所なんかはAppIDを変えるだけでいけるはず。
今後やりたいこと
- サーバーがReadyになったらDiscordなどに通知したい
- これはコンテナを分けるか、完全に独立した監視用の何かを作るなど、別サービスとしてやりたい。優先度高
- GKEでもプリエンプティブVMが使えるのでやってみたい
- ただ、個人でやりたい範囲だとコンテナのスケーリングなどのGKEのメリットは不要なので、やるとしたら完全に趣味になりそう。
終わり
以上、この冬休みの自由研究のまとめでした。
ちなみに、プリエンプティブインスタンスでサーバーを立ててみようと思ったのはこちらの記事を読んだのがきっかけでした。どうもありがとうございます。
7 Days to Dieサーバをスポットインスタンスで構築して激安運用を目指す
7DTDに関しては今後も細く長くやっていくと思うのでリポジトリは時々メンテしていきます。
この仕組を流用して他のゲームのサーバ立ても今後やっていくと思います。(Arkとか、Citadelとか・・・。)
他の方も、これをそのまま使うなり、アレンジするなりと、参考になれば幸いです。