Ibotenic by t-sin


Minecraftサーバを立てたい

ゲーム Minecraft IaaS クラウド

2021-06-15T19:00:02.251230+09:00

Minecraftサーバを立てたかった話です。

マインクラフトはじめました

6月3日からはじめたマインクラフトですが、みごとにハマっています。どれくらいハマっているかというと、

…と、まあどハマりですね。

マインクラフトのサバイバルモードでは、探索要素があり、開拓要素があり、農耕・牧畜要素があり、料理要素があり、とオープンワールドなゲームみたいに遊びがいがありおもしろいです。マイクラをしていると、『ゼルダの伝説 ブレス・オブ・ザ・ワイルド』や『天穂のサクナヒメ』をやってたときにも感じた、「人間って開拓すきじゃね…? 遺伝子に刻まれた性向なのか…?」という思いがまた感じられました。

木材を集めるのがダルすぎて友人に教えてもらった木の伐採modをいれたり、ミニマップのmodをいれたり、挙句の果てには描画がきれいになるmodをいれたりして、大いに楽しんでいます。

サーバを立てたい

そうして楽しんでいるわけなのですが、マイクラではどうもサーバをてると同じワールドに複数人で入って遊べるらしいのです。いわゆるマルチプレイというやつです。なにそれやりたい。

マイクラサーバを立てて友人とマイクラ遊びたい!

そんなわけでいろいろ調べはじめました。

マインクラフトのエディション

まず、マインクラフトのゲームにはエディションというものがあるようでした。現行のエディションは、

  1. Javaエディション
  2. Bedrockエディション

の2種類があるようです。1は昔からあるJavaで実装されたエディションで、個人でサーバを立て (てmodを入れ) たりできるのはこちらのエディションのようです。ぼくのマシンで常用しているOSはUbuntuなので、マイクラのクライアントアプリもJavaエディションです。2は、Javaエディションだとスマホやゲーム機で動かせないからなのか、Javaが動かない環境でもマイクラを移植できるように作られたエディションのようです。

公式のアップデートはどちらのエディションにも同時に提供されるので (直近だと6月9日に"Caves and Cliffs"という大型アップデートがありましたね) 、PCでどちらを選ぶかはどのように遊びたいかによって決めるとよさそうです。すなわち、

ときにはJavaエディションを、そうでないときはBedrockエディションを選べばよいというわけです。GNU/LinuxだとBedrockは選択肢外ですが。

modについて

Javaエディションでは、Javaのクラスローダをごにょごにょしてあるため、かつmod用のAPIが提供されているために、modを作成して読み込ませることができます。modによって、木の根本を斧で破壊するだけで木全体が破壊されるというユーティリティ的な変更から、ゲームの見た目をカスタムする、ゲームに新しいモードを追加するということまでができるようになっています。

modはJavaのjarファイルの形で提供され、所定の場所に置けば起動時に読み込まれるしくみです。ただ、素のmod用APIは低レベルなのか、それらをうまくラップして抽象化レイヤーを提供してくれるmodフレームワークが存在しており、わりといろんなmodがそれに依存していました。ぼくが利用している範囲だと、伐採modのCutAllや描画をカスタムするOptiFineは、Forgeというmodフレームワークに依存してた気がします。

サーバの立て方

マイクラのJavaエディションでは、サーバのプログラムもJavaのjarファイルとして提供されています。なのでもっともシンプルには、以下の手順で起動できるはずです:

  1. Javaの実行環境をインストールする
  2. ここからサーバのjarファイルをダウンロードする
  3. javaコマンドでサーバを起動する

もしサーバにアクセスしてマルチプレイをするときにもmodを有効にしたい場合、サーバにmodを導入しておく必要があるようです。

概要は以上のような感じです。

素のサーバを立てるチャレンジ

ここまでわかった時点で、まずは自分のマシン上にサーバを立てる実験をしてみました。ちなみにこれは失敗します

ぼくの環境はUbuntu 20.04 LTSなのでsudo snap install openjdkでJVMをインストールし、サーバをダウンロードするページにあるようにjava -Xmx1024M -Xms1024M -jar minecraft_server.1.17.jar noguiでサーバを起動しようとしました。

が、まずclassファイルのバージョンが新しくて実行できないと言われました。JDKの11ではだめなのか、と思ってsudo apt openjdk-16-jdkしなおして起動しても、ソケットがつくれないといって落ちてしまいます。root権限が足りないのかと思ってsudo chmod 777 -R ./path/to/minecraftするとサーバのjarファイルがないと言われて謎。jarファイルのownerがrootではないからが原因だったのでもういちどsudo chown root:root -R ./path/to/minecraftして実行してもソケットがつくれないエラー。なにもわからない。

ちなみにサーバとクライアントのバージョンが合っていなければ起動できても接続ができないので (手元の家までつくったワールドは1.16.5)、じつはそもそもサーバのjarファイルのダウンロードの時点で失敗していたのでした。

Dockerでサーバを立てるチャレンジ

ハマりどころがいろいろ多くてしゃらくさいので、Dockerで立ててみることにしました。有志の手によってDockerイメージが公開されているとのことだったので、以下のようにdocker-compose.ymlを書いて、

version: "3.8"

services:
  mc:
    image: itzg/minecraft-server:java8
    ports:
      - 25565:25565
    environment:
      EULA: "TRUE"
      VERSION: 1.16.5
      TYPE: FORGE
      FORGEVERSION: 36.1.0
    volumes:
      - ./minecraft-data:/data

ディレクトリminecraft-dataも用意しておいて、mod等の準備もした上でsudo docker-compose upすると、立ち上がる立ち上がる! しかも接続もでき、ワールドデータも手元のをそのまま持っていけました。

ちょっと解説すると、このイメージでは/dataにマインクラフトのデータを持ちます。volumesで外のディレクトリをマウントしてやると、既にあるデータを使ってサーバを起動できます。このイメージは起動時/data内に必要なディレクトリがなければ作成します。またForgeも自動でインストールしてくれます。なので、こちらでやることはmodのjarファイルを所定の場所 (Forgeのmodなら/data/mods) に置いておくだけです。もしワールドを引き継ぎたかったら、外から持ってきたworldディレクトリをそのまま/dataに置けば、起動時に読み込まれます。

イメージのタグとしてJava 8を利用するタグを指定していますが、どうもmodのほうがJava 8に依存していることがあるからのようです。実際指定なしにしたらmodの初期化で落ちて起動しませんでした。

もし入れるユーザを指定したい場合はenvironmentWHITELIST: user1,user2を追加してやるといいです。user1などはマインクラフトのアカウント名です。

クラウドにサーバを立てるチャレンジ

さて、ここまででサーバ上でマイクラを走らせてログインするところまでできました。ただ、ローカルのサーバだと2つ問題がありました。

  1. スペックがあまり高くないIntel NUCでサーバを立てたため、処理落ちする
  2. 友人にサーバを共有できない (LAN内なので)

1は単に性能が足りていない問題ですが、クラウドではどうなるんでしょう。2は、自分でグローバルIPを取得してうんぬんとしてもいいのですがめんどくさいので、クラウドにサーバを立ててみる実験をしてみることにしました。

GCPにアカウントをつくったりしたあと、GCEインスタンスのスペックを選びたいですがどのインスタンスタイプにしたらいいのかが謎でした。インスタンスタイプ選びの参考にこの記事GCP初心者がGCEでマイクラサーバを建ててみた話 - Qiitaを読んでn1-standard-2ならいけるかも、と思い、無料期間を利用してちょっと試してみました。

まずe2-standard-4にしてみると (あ、n1じゃないこれ) 一人でサーバに入ってもハチさんがカクカクします。つぎにe2-standard-8にすると、一人のときはハチさんが滑らかでしたが二人入るとハチさんがカクカクします。がーん。ちなみに手元のNUC (Celeron 4スレッド, 2018年くらい購入) だとハチさんがカクカクしました。

これけっこういいスペックでいいお値段だと思うんですよね、ウェブアプリ動かす分には。このあたりで怖くなったので一旦インスタンスを落としました。

まとめ

というわけで、クラウドだとe2-standard-*ではかなり上げないとだめそうでした。いったん普段遊びとしてはローカルで立てつつクラウドのほうも実験していきます。

というかそうかぁ。n2-standard-2ならいけたのかもしれないなあ。常に利用したときお金がどうなるかちょっと予想できないので、どうしたものか。

Minecraftサーバを立てたかった話です。

タグ: ゲーム , Minecraft , IaaS , クラウド

作成日時: 2021-06-15T19:00:02.251230+09:00

更新日時: -