Raspberry PiでMinecraftForgeのMODサーバーを立てた

# はじめに
仲間内でマイクラMODサーバーやりたいなということで立ててみました。ほとんどForge君がやってくれます。

# ハードウェア
### 本体
https://www.amazon.co.jp/%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%ABB-Raspberry-%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4-TELEC%E8%AA%8D%E5%AE%9A%E5%8F%96%E5%BE%97%E6%B8%88%E3%81%BF/dp/B089GSG8Y1/ref=sr_1_3?crid=1W08D1WWP487G&keywords=raspberry+pi+4+model+b+8gb&qid=1679282029&sprefix=raspberry+pi+4+%2Caps%2C189&sr=8-3

高くなってますね...最新のRaspberry Pi 4にしました。
MOD入りということでRAM8GBを買いました。

### microSDカード
https://kakaku.com/item/K0001459533/#tab01

ラズパイで記憶領域となるのがmicroSDカードです。
microSDカードってこんな安いんですね。1TBとか出てて驚きました。
あまり使わないだろと思い、64GBを買いました。

### microHDMIコード
https://www.amazon.co.jp/dp/B08H4QHT67?ref_=cm_sw_r_apan_dp_DDZY890MPWM7HK687Z3V

ディスプレイとラズパイを結ぶコードです。Raspberry Pi 4には二つポートがあるので今後デュアルモニターになることも考えて干渉しないものを買いました。正直なんでもいいと思います。

### TypeC充電器
Raspberry Pi 4はUSB TypeCを電力とします。家にあったTypeC充電器をつなげてみても特に問題がなかったのでそれをつなげています。

:::note info
ラズパイには電源ボタンはないので電源を繋ぐと電源がつくようになってます。他のコードなどをつなげてから最後に電源を繋ぐとよいです。
:::

# 本題
:::note info
今回はOSは`Raspbian（64bit）`にしました。他のOSでも大丈夫ですが、メモリの関係上64bitにするといいと思います。
:::

java17をインストールします。してたら大丈夫です。

```
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install openjdk-17-jdk -y
```

バージョンを確認します。

```
$ java -version
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment (build 17.0.6+10-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 17.0.6+10-Debian-1deb11u1, mixed mode, sharing)
```

ここであらかじめ、今回サーバーを構築するディレクトリを作っときましょう。自分は`Documents/minecraft/`にしました。

[Forge](https://files.minecraftforge.net/net/minecraftforge/forge/)からお好きなバージョンのForgeInstallerをダウンロードします。

ダウンロードした`.jar`を実行します。

```
$ cd Downloads
$ java -jar forge-1.19.2-43.2.0-installer.jar
```

:::note warn
バージョンによって名前が違うので注意です。
:::

するとインストーラー画面が出ると思います。`Install Server`を選択し、先ほど作ったディレクトリを指定します。
`OK`を押したらあとは放置です。

成功した旨のメッセージが出たら生成された`run.sh`を実行します。

終わったら`eula.txt`が生成されているはずなのでこれを編集します。

```diff:eula.txt
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Mon Mar 20 13:56:52 JST 2023
- eula=false
+ eula=true
```

また、割り当てるメモリを`user_jvm_args.txt`で編集します。
```diff:user_jvm_args.txt
# 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
```
4GB割り当ててみましたが正直大量にMOD入れると足りないと思います。自分は`ZRAM`で12GBほどSWAPしているのでここを16GBほど割り当てていますがどうなんでしょうか...。`ZRAM`については以下の記事がめっちゃ参考になります。

https://www.fabshop.jp/%E3%80%90step-39%E3%80%91raspberry-pi%E3%81%A7%E3%82%82zram%E3%81%A7%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E6%8B%A1%E5%BC%B5%EF%BC%81/

最後に表示されるGUIがウザいので`nogui`オプションを追加します。

```diff_shell:run.sh
#!/usr/bin/env sh
# Forge requires a configured set of both JVM and program arguments.
# Add custom JVM arguments to the user_jvm_args.txt
# Add custom program arguments {such as nogui} to this file in the next line before the "$@" or
#  pass them to this script directly
- java @user_jvm_args.txt @libraries/net/minecraftforge/forge/1.19.2-43.2.0/unix_args.txt "$@"
+ java @user_jvm_args.txt @libraries/net/minecraftforge/forge/1.19.2-43.2.0/unix_args.txt "$@" nogui
```

最後に実行すれば完了です。

```
$ ./run.sh
```

:::note info
modsなどのディレクトリはこの時生成されます。
:::

:::note warn
バージョンが違うと、`run.sh`などがない場合があります。その際はWindowsと同じようにできるのでそのバージョンんで調べてみるといいと思います。
:::

現在のipアドレスを調べます。

```
$ ifconfig
```
自分は無線を使ってたので`wlan0`の項目を見ればいいのですが、有線の場合は`eth0`の項目にipアドレスの項目があると思います。ipアドレスを固定します。`/etc/dhcpcd.conf`を編集します。

:::note
今回は仮にipが`192.168.X.Y`でnetmaskが`255.255.255.0`だった時のことを考えます。このnetmaskの場合はすべてのipは`192.168.X`までが一致している形になります。
:::

```diff_conf:/etc/dhcpcd.conf
# 前略

# fallback to static profile on eth0
#interface eth0
#fallback static_eth0

interface wlan0 # 有線の場合はeth0
static ip_address=192.168.X.Y/24
static routers=192.168.X.1
static domain_name_servers=192.168.X.1
```

最後に、ご使用のルーター設定で`192.168.X.Y`のポート`25565`を開くように設定してください。
グローバルipアドレスを以下のサイトで確認できます。

https://www.cman.jp/network/support/go_access.cgi

アクセスできるかどうかは以下のサイトで確かめることができます。

https://www.cman.jp/network/support/port.html

`ホスト名(FQDN) または グローバルIPアドレス`にグローバルipアドレスを入力し、`チェックポート番号`に`25565`を入力すれば調べてくれます。

`Mods`フォルダにMODを入れてワールドを立ち上げましょう。

# マイクラ側
このサーバーにアクセスするにはForgeInstallerで今度は`Install Client`を選択し、Forgeをインストールする必要があります。また、サーバー側と同じModを`Mods`ファイルに準備する必要があります。（なお、Client MODと呼ばれる、Client側のみで動くMODはサーバー側には必要ありません）

Forgeをインストールした状態でランチャーを開くと、Forge版のバージョン選択ができるはずです。できなければ起動構成から新しい起動構成を作ってください。

Minecraft Java版を起動したらサーバー追加でサーバーアドレスにさっき調べたグローバルipアドレスを入力。仲間内でipは共有しときましょう。なお、サーバー名は自由に決めることができます。

### 鯖主が接続する場合
私の場合、鯖主である私だけグローバルipアドレスでは接続できず、ローカルipアドレス（つまり、192.168.X.Y）で接続できました。ラズパイでマイクラをしているわけではないのですがこうなってしまいます。インターネットに詳しくないのでとりあえず放置してます。

# さいごに
ラズパイを買って正解でした。鯖のON/OFFとか必要ないし、小さいので場所も電力もとりません。また、可能な限り今回はコマンドやvimを使ってみました。linux系のいい勉強になりました。

それでは、良きマイクラライフを！