[2024年版] GCPで構築するMinecraft Modサーバー

こんちわ。

普段はゲーム会社でソシャゲを作ってます、あまがみです！
今回は誰でもMinecraftのModサーバーを構築する方法をまとめてみました！
参考記事があまりなかったので備忘録的な意味も込めて投稿します！

※ VMインスタンスは無料クレジット分で作成します。
※ バックエンド初心者なので大目に見てね ^^;

## 構築環境
- Windows10 Home 22H2
- Google Cloud Platform
- CentOS 7 (VM内)


## 1. VMインスタンスの作成
まずはVMインスタンスを作成します。

ComputeEngine > VMインスタンス > インスタンスの作成 をクリック。

|項目|内容|備考|
|:-:|:-:|:-:|
|名前|minecraft-mod-server|お好きな名前で！|
|リージョン|asia-northeast1（東京）|お好きなところで！|
|ゾーン|asia-northeast1-b||
|マシンの構成|n1-standard-2（2vCPU, 7.5GB）||
|可用性ポリシー|標準|スポットのが費用抑えられます。|
|ブートディスク|CentOS7||
|ディスクの種類|SSD 永続ディスク||
|ディスクサイズ|50～60GB|多いに越したことはない！|

基本ここだけ変更すればいい感じに動くと思われ！

## 2. Forgeのインストール
続いてModサーバーに必須なForgeをインストールします。
> デスクトップ等にお好きな名前のフォルダを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/416d8c53-b9f3-be01-c4f5-6d01cde5c585.png)


> 次に [Forge DL](https://files.minecraftforge.net/net/minecraftforge/forge/) からForgeをダウンロードします。
今回は Minecraftバージョン `1.19.2` で運用したいので、下記画像の「Download Latest」のインストーラーをダウンロードします。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/2523bdfc-ef3a-6af9-10b8-769e7c55fde8.png)

> インストーラーを起動し、先ほど作成したフォルダを指定します。
この時 `Install server` が選択されているか確認してください！
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/70fe30c0-c0f7-9eb5-8c23-ba1031c69767.png)

>この画面が出たらインストール完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/01a84bf1-6639-e7af-dd8a-6bc4d35c7807.png)

## 3. 起動構成の変更
次にサーバーの起動構成を変更します。
> Forgeをインストールしたフォルダを開き、`user_jvm_args.txt` ファイルを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/c1f83fe6-633f-ac4c-a434-cca8e452489e.png)

> メモリ割り当ての設定を行います。
> 以下のコードを追加し、保存してください。
> ```diff_api_blueprint
> # Xmx and Xms set the maximum and minimum RAM usage, respectively.
> # They can take any number, followed by an M or a G.
> # M means Megabyte, G means Gigabyte.
> # For example, to set the maximum to 3GB: -Xmx3G
> # To set the minimum to 2.5GB: -Xms2500M
> 
> # A good default for a modded server is 4GB.
> # Uncomment the next line to set it.
> + # -Xmx4G
> + # -Xms4G
> ```

> 次に `run.bat` をダブルクリックし、実行します。
色々ファイルが生成されるのですが、その中の `eula.txt` を開きます。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/fa5edc78-40d9-c443-65d5-2a19e063d2bc.png)

> 以下のように `eula=false` を `eula=true` に書き換え、保存してください。
> ```diff_api_blueprint
> #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
> #Sun Apr 21 05:51:14 JST 2024
> - eula=false
> + eula=true
> ```

> 再度 `run.bat` をダブルクリックし、実行します。
> こんな感じのGUIとフォルダ構成になればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/0968c89c-672a-e1b6-e9da-7194263f88f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/a675edbf-6a34-88ef-1ed5-a28fab998059.png)

## 4. アップロードデータの準備
サーバーにアップロードする準備をします。
※この段階で入れるmodが決まっていれば、`mods` フォルダ内に入れてください！
※今回は `Mekanism-1.19.2-10.3.9.13` をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/12687b7c-9ea7-ccd2-fec9-8ca0d109b9c2.png)
Modのインストールは [こちら](https://www.curseforge.com/) からどうぞ！

次にサーバーデータをzip化します。
先ほど作成したファイルたちをzipにしてください。(7zipおすすめ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/6d4fa3f8-8e96-da86-5e23-f1ee0c1cbbfb.png)
こんなかんじ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/b5e8e07b-7c18-89d1-5e7b-7b787a6fdd04.png)


## 5. ファイルアップロード
いよいよコンソールを触っていきますよ～
VMインスタンスのSSH接続を行います。

上部の「ファイルをアップロード」をクリックし、先ほど作成したzipファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/7a24333d-9b03-2688-9a9e-8e10fa08dea5.png)

チェックマークがつけばOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/3d26d3b9-125a-3e39-c207-175f59238e05.png)

念のためファイルがちゃんとアップロードされているか確認するために以下のコマンドを実行してください。
```bash
ls
```

以下のようにzipファイルが表示されたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/4122c741-e54f-7d41-9955-34a0a028c06b.png)

## 6. サーバーセットアップ
続いてサーバーのセットアップを行います。
> 既存パッケージを最新にアップデート
>> 以下のコマンドを実行してください。
>> ```bash
>> sudo yum -y update
>> ```

> OpenJDKのインストール
>> ここは運用するMinecraftのバージョンで変わってきます。
>> 詳しくはGoogle先生にお聞きください...。
>> ※1.19.2はJava17が推奨のため、以下のコマンドを実行します。
>> ```bash
>> sudo yum -y install https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
>> ```
>> ちゃんとインストールされているか確認しましょう。
>> これないと動かないので...。
>> ```bash
>> java -version
>> ```
>> 17.0.11～みたいなのが出力されていればOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/226c4b21-ad22-13c9-c262-c96ea2a36d05.png)


> unzipのインストール
>> zipファイルを解凍するやつです。
>> 以下のコマンドを実行してください。
>> ```bash
>> sudo yum -y install unzip
>> ```

> screenのインストール
>> バックグラウンドで動かしてくれるやつです。
>> 以下のコマンドを実行してください。
>> ```bash
>> sudo yum -y install screen
>> ```

## 7. サーバー、始動。
長らくお待たせいたしました。
ついにサーバーの起動です。

> zipファイルを解凍する
>> 以下のコマンドを実行し、ファイルの解凍を行います。
>> ```bash
>> unzip ファイル名
>> ```
>> ※僕の場合は `unzip MinecraftVM.zip` と実行します。

> ファイル確認
>> 先ほども行った `ls` コマンドを実行し、ファイルの確認を行います。
>> 以下のように色々入っていたらOKです！
>> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/cfc8cc62-0504-bfc4-20d9-470f9cf140f9.png)

> サーバー起動する
>> 以下のコマンドを実行し、実行権限を付与します。
>> ```bash
>> sudo chmod 777 run.sh
>> ```

>> 以下のコマンドを実行し、サーバーを起動します。
>> ```bash
>> ./run.sh
>> ```

以下のように `Done (34.127s)! For help, type "help"` と出力されていればOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/c0de4dd7-1fed-9eba-25f0-103a1994a3dd.png)

まだ設定が残っているので、一旦以下のコマンドでサーバーを停止させます。
白いテキストに戻ればOK。
```bash
stop
```

## 7. ポート開放
Minecraftのポートは `25565` なので、こいつを開放していきます。
以下のコマンドを順番に実行してください。
```bash
sudo firewall-cmd --permanent --add-port=25565/tcp
```

```bash
sudo firewall-cmd --reload
```

```bash
sudo firewall-cmd --list-all
```
こんな感じで `ports: 25565/tcp` と出力されていればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/d504d374-c51d-b6f8-8af3-84dd24d8f835.png)

## 8. ファイアウォール作成
外部からアクセスできるように、VMインスタンスにファイアウォールを設定していきます。

VPCネットワーク > ファイアウォール > ファイアウォールルールを作成をクリック。

以下の情報を入力します。
|項目|値|備考|
|:-:|:-:|:-:|
|名前|minecraft-25565|なんでもよし！|
|ターゲット|ネットワーク上のすべてのインスタンス|※1|
|送信元IPv4範囲|0.0.0.0/0||
|プロトコルとポート|TCPにチェック + 25565||

※1：本来はVMに対し個別でタグを作成し、そのタグと紐づけを行うほうが安全です。
詳しくはGoogle先生にお聞きください。

## 9. 静的外部IPの設定 [任意]
これは正直やってもやらなくてもって感じです。
やらなかった場合、接続IPが定期的に変わるので、変わるたびプレイヤーに入力してもらわなければなりません。（セキュリティ的にはいいけどね...。）
なので一応説明だけ。

VPCネットワーク > IPアドレス > 外部静的IPアドレスを予約します をクリック。
以下の情報を入力します。
|項目|値|備考|
|:-:|:-:|:-:|
|名前|minecraft-ip|なんでもよし！|
|IPバージョン|IPv4||
|リージョン|asia-northeast1（東京）|サーバーと同じとこ！|
|接続先|minecraft-mod-server|自分のサーバー名で！|

予約ボタンを押せば外部静的IPが発行され、割り当てられます。

## 10. 最後に
さぁ、マルチプレイできる環境が整いました。

サーバーを起動する際は、コンソールを閉じてもいいように `screen` コマンドを使用します。
> スクリーンを作成します。
> ```bash
> screen -S スクリーン名
> ```

> スクリーン内でサーバーを起動します
> ```bash
> ./run.sh
> ```
この2つさえ実行すればサーバーは立ちます。
screenコマンドを実行していれば、コンソール画面を閉じても大丈夫です！


以下の外部IPを、Minecraftの マルチプレイ > サーバー追加 > サーバーアドレス欄 に張り付けてして接続してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774693/7ff7c0a8-128f-0f3e-4474-2e10b035ba82.png)

無事には入れたら完璧！
エラーが出た場合は、プレイヤー側にサーバーと同じModが入っていなかったり...。
Google先生に聞いてください（n回目）

## あとがき
以上になります。
海外の記事とかいろいろ参考にさせていただいたのでリンク張っておきます。

- Modサーバーの立て方

https://qiita.com/kkst/items/2942db4ba9a14a0e926f

- OpenJDK17

https://computingforgeeks.com/install-java-openjdk-17-on-centos-rhel-7/

- Java17

https://www.oracle.com/java/technologies/downloads/#java17

- IPアドレス

https://note.com/yucco72/n/n4e3605d1ac3e


間違っている部分、記載ミス等ありましたらコメントにてお願いいたします。