Minecraft Server を構築してみた

# なにこれ
Windows 11 Pro !!
RAM 64 GB !!
i7 12700kf !!
RTX 4060ti !!!

いええええええええい！！！！

ってノリノリに話してたら「じゃあ Minecraft サーバ立てて」とぶん殴られてひいこら立てた話。

# Hyper-V
Pro なので、せっかくだから Hyper-V で構築しようと考え構築開始。

とりあえず脳死で Microsoft 社のページに行って、Hyper-V 有効化のコマンドを powershell にﾎﾟｲ。

```
Set-VMProcessor -VMName Windows10 -ExposeVirtualizationExtensions $true
```

https://techcommunity.microsoft.com/t5/modern-work-app-consult-blog/using-wsl2-in-a-docker-linux-container-on-windows-to-run-a/ba-p/1482133

## Setting

そのあとのプロセスは以下ページを参照して Hyper-V、CentOS 再起動まで構築。

https://thinkit.co.jp/article/11131

# CentOS Stream 9
OS は Ubuntu か CentOS どっちにしようかなと悩んでいたのでとりあえず調査。

Ubuntu は 22.04 が安定版の最新で 2027/4 ぐらいにサポ終、20.04 は 2023/4 にサポ終とのこと。
対して CentOS Stream 9 は 2027/5 にサポ終。
また、RHEL 9 と同じくらいまで品質を保つと Red Hat 社が明言していたそう。

じゃあ CentOS でいいじゃんってことで選択。

ちなみに minecraft の java のバージョンと CentOS のデフォルトのバージョンの対応が以下なので、合うもので作るのがおすすめです。

|Minecraft|Java|CentOS|
|:-:|:-:|:-:|
|1.20.1|17|Stream 9|
|1.21.2|21|Stream 10|

## Install

早速インストールしようとしたらなんか Hyper-V で起動しないエラー。
なんやこれと調べて以下を発見。

https://se-abeaver.com/linux-install-on-hyperv/#google_vignette

デフォルトじゃダメみたいですね。

その後は上の Hyper-V->Setting に貼った thinkit のページを参考にしながらﾎﾟﾁﾎﾟﾁ

ちなみにインストールタイプは thinkit のページと違う上、 java の選択がなかったので、FTP があればよいのかなと Server を選択し、FTP やほかに使いそうなもの(Network 関係とか System 関係とか)のチェックを入れてインスコ。(結局 FTP は使わず sftp で全部やり取りした)

基本的に以下設定でいいと思います。
```
言語 : English または 日本語
キーボード : japanese
言語サポート : English, Japanese
Security policy : 放置
Install Source : Local
ソフトウェアの選択 : Server
インスコ先 : クリックして即 Done(完了)
KDUMP : チェックを外す
ネットワークとホスト : 以下参照
```

その他、Minecraft サーバの IP を固定したいので、ネットワーク設定にて IP アドレスは Manual を選択し、マスク内の適当なアドレスをセット。

再起動->ログインした後に DNS の名前解決ができないという問題が発生したが、ネットワーク設定でやらかしをしていたので、/etc/resolv.conf にて nameserver をとりあえず 8.8.8.8 に設定。しばらく待ったらつながった。

その後は以下を参考にしながらｺﾞﾆｮｺﾞﾆｮ。
ちなみに結論から言うと screen は使わず tmux を使用したので、epel の設定などはやらなくていいです。

https://qiita.com/AnaKutsu/items/146a5afa3a3070d15cec

https://access.redhat.com/documentation/ja-jp/red_hat_build_of_openjdk/17/html-single/installing_and_using_red_hat_build_of_openjdk_17_on_rhel/index

https://qiita.com/nagomu1985/items/2b9a7b2c48a07187cf0f

この辺で forge と spigot どっちを入れようか迷って結局 spigot にしました。
mod の管理ダルそうだし、慣れたら forge にしよう。

GeyserMC とかは公式のページが変わっていたようで、あまりよく分からないで以下にあった似てるのを入れました。
あとから最新バージョンが出ているのでインスコしよう！的なメッセージが流れてきたので、公式にあるのを入れたほうがいいかも。(ちなみに Bedrock ver では結局バージョンが古くて入れなかった。)

https://ci.opencollab.dev//job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/build/libs/

https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/master/lastSuccessfulBuild/artifact/spigot/build/libs/

systemd の .service ファイルを書き始めたところで、以下の記事を参考に screen を tmux に変更。
ちなみに Type=forking を抜くと起動しないので [Service] 以下につけましょう。

https://mattyan1053.hatenablog.com/entry/2022/01/29/210202

https://0sn.net/posts/20220821/mcserver-systemd/

# セキュリティあれこれ

あとは最後に firewalld の設定として、/usr/lib/firewalld/services/ 以下に minecraft-bedrock.xml と ssh-neo.xml を設定。

ベースファイルとして ssh.xml をコピーして内容を変更。

```
$ sudo cp ssh.xml ssh-neo.xml
$ sudo cp ssh.xml minecraft.xml
$ sudo vi ssh-neo.xml
$ sudo vi minecraft-bedrock.xml
$ cat ssh-neo.xml
 ...
  <port protocol="tcp" port="2222"/>
 ...
$ cat minecraft-bedrock.xml
 ...
  <portt protocol="tcp" port="25565"/>
  <portt protocol="udp" port="25565"/>
 ...
```

```
$ sudo firewall-cmd --add-services={ssh-neo,minecraft-bedrock} --permanent
$ sudo firewall-cmd --remove-services=ssh --permanent
$ sudo firewall-cmd --reload
```
ssh のポートを 2222 に変え、ssl 公開鍵認証を設定して完了！

https://qiita.com/miyuki_samitani/items/ea481bb274aed1022792

https://qiita.com/jinnai73/items/f1822f2e4d567847e215

https://pan-shoku.com/ed25519-github/

https://qiita.com/HamaTech/items/21bb9761f326c4d4aa65

SELinux を有効にしているので SSH のポート変更に備えて以下も実行。

```
# semanage port -a -t ssh_port_t -p tcp 2222
```


おしまい。

# 後日談
Hyper-V で起動しようとしたら、復元できませんでしたとのエラーが発生。
原因を調べていると以下を発見。

https://masablg.blogspot.com/2022/07/hyper-v.html

状態を保存していると復元の際にメモリエラーで死ぬらしい。

学び。

# 後々日談
別鯖にて 1.21.2 の minecraft server が欲しいとの要望が来まして。
CentOS Stream 10 が対応する java バージョンに合うからと前々に Download しておいた CentOS Stream 10 にて構築しようとしたら、 dnf update の際に `package ほげほげ requires debhelper, but none of the providers can be installed` とか怒られました。

原因は古い rpm がサポートされなくなって依存関係がぶっ壊れてたらしい。

参考:

https://qiita.com/okemessi/items/8e6c9ea501be9f696c26

その為 `--allowerasing` オプションが必要でした。

学び。