マインクラフトサーバーの構築方法

# 0.目的
友人から自前でサーバーを構築する方法を教えてほしいと言われたので,記事として残しておこうという目的で書きます。そこまで難しいことはやらないです。端的に言えばマイクラサーバーの構築は必要なソフトウェアを入れて,オプションを付けてコンソール上で実行するだけです。

:::note warn
``//``や``#``はコメントアウトや補足をしたい時に使ってます。
:::
# 1.必要なもの
<その1>
当たり前ですがPCがなきゃお話になりませんね。サーバー建てるPCなんてテキトーなもので良いんです。古い5,6年前のノートPC使ってもいいし,サーバー用のPCを新たに用意してもいいし,メインPCを使うでもなんでも良いんです。

<その2>
次に絶対必要なソフトウェアですが,``JAVA``ですね。マインクラフトというゲームは``Java Virtual Machine``を使って実行しているゲームなので,そのサーバーを建てるのにも``JAVA``は必要になります。

:::note warn
本格的に構築するならOS(Operating System)はLinuxの方が良い。
:::
<補足>
WindowsってServer版以外のHome,Pro,Pro for Workstations,Education,Business,Enterprise版のライセンスの制約で20台までのデバイスの接続しか認められていないので,そのような制限が存在しないLinux,macOSなどを使う方が良いでしょう。(Server版を買ってもいいけど最低55万円とかした気がする。)

Javaをインストールするといっても **JRE(Java Runtime Environment)** と **JDK(Java Development Kit)** の２つがあってどっちをインストールすりゃいいんやってなる人がいると思います。サーバーを建てる場合は必ずJDKの方が必要になります。(古いバージョンの場合はJava8で動いているのでJava8ベースのJREでも動くことがあるみたいですが。 ver1.12.2まではJava8,1.13からは知らん。)

 それではJDKのインストールをしていきましょう。まずはLinuxからです。(コマンド叩いて実行して終わりだから)
 
[手順] JDKのインストール
 <details ><summary>LinuxにJDKをインストールする場合</summary>


 ①ターミナルを開いて次のコマンドでインストールを行う。
 ```shell-session:Debian系(Ubuntu,Debianなど)
 user@localhost: ~$ sudo apt-get install openjdk-*-jdk openjdk-*-jre
 ```
 ```shell-session:RHEL系(CentOS 5・6・7,Fedora,RHELなど)
 user@localhost: ~$ sudo yum install java-*-openjdk
 ```
 ```shell-session:CentOS 8以降,Fedora,RHELなど
 user@localhost: ~$ sudo dnf install java-*-openjdk
 ```
:::note info
``*(アスタリスク)`` を使ってワイルドガードで公式リポジトリに存在する全てのバージョンのJDKをインストールしておくと楽です。``sudo update-alternatives --config java``と実行すれば変更ができるのでインストールできるだけしておくと良いでしょう。
:::
インストールが完了したら``java``コマンドが実行できるか確認をしましょう。コンソールに``java``と入力して実行するだけでもいいですし,``java --version``と入力し実行してバージョンの確認を行っても良いでしょう。
```shell-session:bash or zsh
user@localhost: ~$ java --version
 ```
 </details>

 <details><summary>WindowsにJDKをインストールする場合</summary>
 
 ①Oracleの公式サイトからJDKインストーラーを取得する。
 この記事を書いてる時点での最新のJDKはJDK23です。好きなJDKのバージョンを選びます。

 Windowsのセクションから*x64 MSI Installer*または*x64 Installer*のどちらかを選びダウンロードして実行しインストールをします。

[Oracle公式サイト](https://www.oracle.com/jp/java/technologies/downloads/ "Oracle Official Web")
![Oracle公式サイトのJDKダウンロードサイト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1807755/c32a5397-ba18-996c-acbf-440a95ba0e21.png)

 ②インストールができたら,コマンドプロンプトかPowershellを開きます。管理者権限は不要
 コンソール画面が出たら``java``と入力して実行するか``java --version``と入力して実行してJDKのバージョンを確認しても良いでしょう。
 ```: コマンドプロンプト or Powershell
 C:\Users\$USER> java --version
 ```
:::note warn
コマンドを実行したら 
「'java' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」と表示された場合はパスの設定を行います。システムの詳細設定を開くと,右下の方に「環境変数」と書かれた項目があるのでそれをクリックします。システム環境変数の方の項目にある「Path」を選択し編集します。
![system-path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1807755/f1915847-d364-dc05-9242-88a02bf3674d.png)
右側にある新規というボタンを押した後参照を押してJavaのバイナリーフォルダーを指定します。せんたくできたらOKを押してパスを追加します。OKを押せるだけ押して設定完了しました。パスの設定が出来たらまた②の最初の手順で``java``コマンドを実行できるか試してください。パスの設定をしても実行できなかったら一度Windowsを再起動してみてください。
![スクリーンショット 2024-12-06 175825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1807755/82dfc65a-091a-6a95-ad4a-be2b6fd929e4.png)
:::
 </details>

# 2.マインクラフトサーバーを選ぶ
 マインクラフトって結構色んな遊び方できますよね。例えば,modを入れたりバニラのままで遊んだりと。そのような感じでマインクラフトサーバーを建てるためのツールもたくさんあります。バニラ環境のみで遊びたい場合はMinecraft公式サイトやMinecraft Launcherから,バニラ環境にプラグインを入れたい場合はSpigotやBukkitなどがあります。他にもmodを入れたいならFablicやForge,プラグインとforge modを同時に入れたいのであればMohist MCやSpongeなどがあります。とりあえず色々あります。一番簡単なのはForgeとバニラですね。その次にSpigot/Bukkitになります。Mohist MCやSpongeは結構ややこしくて面倒です。

 まずは簡単なバニラとForgeを紹介したいと思います。(正直Forgeバニラと変わらん。てかForgeの方でバニラ環境作れるからForgeだけでいい説)
 ### バニラ/Forgeサーバー
 面倒なのでForgeで全て済ませます。Minecraft Forgeをダウンロードします。
 https://files.minecraftforge.net/
 自分の遊びたいバージョンを選んでダウンロードすればいいです。安定版の方が良いと言う人いますが正直Forgeの場合はBeta版じゃなければ最新版の方が良いと思います。ダウンロードできたら実行します。すると,選択肢がいくつか出てくると思いますが今回はクライアント側ではなくサーバー側の話なので Install Serverを選択します。ただ,このままOKを押すとマインクラフトのクライアント側のフォルダ内がめちゃくちゃになるので,サーバー用のフォルダを用意して右下の「・・・」のボタンから用意したフォルダを選択してサーバーのインストールをしてください。

 <details><summary>Windowsの場合</summary>
 [手順1]サーバーを起動する
 サーバーのインストールができたらコマンドプロンプトを開いてください。 コマンドプロンプトを使ってサーバーを起動していきます。その前にちょっとしたコマンドの軽い解説をしていきます。詳しい事を知りたい場合は調べてみてください。

:::note info
 ``cd``：change directoryのこと。コンソール内で作業するフォルダーを変更するコマンドになります。例えばC:\Users\shumaikun0716というユーザーフォルダ内に新しく作ったforgeという名前のフォルダがあるとします。そのフォルダに移動するときは``cd forge``と実行すると移動できます。(このコマンドを実行するときの作業フォルダがC:\Users\shumaikun0716だった場合)
:::
:::note info
``dir``：フォルダ内に存在するファイルとフォルダの名前の一覧を出力するコマンドです。
:::
では作業を始めていきます。``cd``コマンドでforgeフォルダに移動します。その次に``dir``コマンドで必要なファイルがあるか確かめます。(バージョンが古い場合のみ。多分1.12.2まで？)
<details><summary><バージョンが古い場合></summary>

``java``コマンドでサーバーを一度起動します。eula.txtが生成されその中身がデフォルトではfalseになっているのでサーバーの起動が失敗します。メモ帳などでeula.txtを編集してfalseをtrueに書き換えて上書き保存し再度サーバーを起動します。
```winbatch: コマンドプロンプト
C:\Users\$USER> cd forge
C:\Users\$USER\forge> dir
2024/12/06  18:27    <DIR>          .
2024/12/06  18:26    <DIR>          ..
2024/12/06  18:27         4,466,148 forge-1.12.2-14.23.5.2860.jar
2024/12/06  18:27    <DIR>          libraries
2024/12/06  18:27        30,222,121 minecraft_server.1.12.2.jar

//このように表示されればOK
C:\Users\$USER\forge> java -jar -Xms2G -Xmx2G minecraft_server.1.12.2.jar nogui
//-jarでjarファイルの指定,-Xmx2Gで最大2GBまでのメモリーを割り当て,
  -Xms2Gで最低2GB以上のメモリーを割り当て,
  noguiでコンソールと別でウィンドウが起動しないようにする
  2Gで2GBなので1536Mにすると1536MBが割り当てられるようになる。

// eula.txtが生成されるのでそれを編集したら再度サーバーを起動する
C:\Users\$USER\forge> java -jar -Xms2G -Xmx2G minecraft_server.1.12.2.jar nogui

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[サーバーコンソール]
> stop         //stopコマンドでサーバーの停止が可能。opコマンドでOP権限の付与ができる。
server closed.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
:::note warn
minecraft_server.1.12.2.jarはバニラ環境であるのでforgeで遊びたければ再度起動し直す必要がある。再度起動するときに指定するjarファイルをforge-1.12.2-14.23.5.2860.jarに変えるだけでforgeで遊べるようになる。modはmodsフォルダ内に遊びたいmodファイルをぶち込んで起動すればmod入りで遊べる。

※追記
forge-*.jarの方はJava8じゃないと起動できないみたいです。Oracleのアカウントを作ってJDK8をダウンロードして使うかJREの方を使うかすれば起動できます。
:::
これでサーバーの構築自体は完了です。サーバーPCのIPアドレスを入力すればサーバーに接続できます...と言いたいところですがポート開放されていないと接続できないです。(サーバーPCとクライアントPCが違う場合)

:::note
サーバーPCとクライアントPCが一緒であればMinecraftを起動してlocalhostをipアドレスとして打ち込めば接続できます。
:::
Windowsのポート開放だるいんだよなぁ。Linuxだったらfirewalldとかufwでコマンド打ち込んで開放できるし。でも面倒なのはGUIアプリケーションにおける話だ。コマンド上でも制御できる。

[手順２]ポート開放
管理者権限で起動したPowershellを用意しましょう。
``New-NetFirewallRule``コマンドを用いて新しいルールを作り通信できるようにします。
```powershell: 管理者Powershell
C:\Windows\System32> New-NetFIrewallRule -DisplayName {英数字のみで好きなルール名を付ける}`
                     -Protocol TCP  -LocalPort 25565 -RemotePort 25565 -Action Allow `
                     -Profile Any -Enabled True -LocalAddress Any -RemoteAddress Any
```
これでルール名が{好きなルール名}・プロトコルがTCP・ローカルポートが25565・リモートポートが25565・通信を許可・どのファイアウォールプロファイルでも適用する・ルールを作成後有効にする・どのローカルアドレスからも通信可・すべてのグローバルアドレスから通信可 という状態でポート開放が行われます。 

</details>

<details><summary><バージョンが新しい場合></summary>

``java``コマンドでサーバーを一度起動します。eula.txtが生成されその中身がデフォルトではfalseになっているのでサーバーの起動が失敗します。メモ帳などでeula.txtを編集してfalseをtrueに書き換えて上書き保存し再度サーバーを起動します。
```winbatch: コマンドプロンプト
C:\Users\$USER> cd forge
C:\Users\$USER\forge> dir
2024/12/06  23:57    <DIR>          .
2024/12/06  18:26    <DIR>          ..
2024/12/06  18:15    <DIR>          libraries
2024/12/06  18:15               374 run.bat
2024/12/06  18:15               366 run.sh
2024/12/06  18:49               346 user_jvm_args.txt

//このように表示されればOK
C:\Users\$USER\forge> run.bat
//バッチファイルを実行するとeula.txtが作られる。

// eula.txtが生成されるのでそれを編集したら再度サーバーを起動する
C:\Users\$USER\forge> run.bat

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[サーバーコンソール]
> stop         //stopコマンドでサーバーの停止が可能。opコマンドでOP権限の付与ができる。
server closed.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
これでサーバーの構築は完了です。あとは生成されたmodsフォルダー内に自分の遊びたいmodを実行するための``.jar``ファイルをぶち込んでサーバーを起動すればmod入りのサーバーで遊べます。

:::note info
user_jvm_args.txtというファイルがあるのでそのファイルを編集するとサーバー起動時に割り当てるメモリーの量を変更できる。
```shell: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  (デフォルトでは先頭に#タグが付いているので#を消してコメントを解除するか
#         新たにオプションを書くかのどちらかをすればよい。)
#That is an example
-Xms4G -Xmx4G

//  -Xms2Gで最低2GB以上のメモリーを割り当てる。
//  -Xmx2Gで最大2GBまでのメモリーを利用可能にする。
//  2Gで2GBなので1536Mにすると1536MBが割り当てられるようになる。
```
:::

サーバーPCのIPアドレスを入力すればサーバーに接続できます...と言いたいところですがポート開放されていないと接続できないです。(サーバーPCとクライアントPCが違う場合)

:::note
サーバーPCとクライアントPCが一緒であればMinecraftを起動してlocalhostをipアドレスとして打ち込めば接続できます。
:::
Windowsのポート開放だるいんだよなぁ。Linuxだったらfirewalldとかufwでコマンド打ち込んで開放できるし。でも面倒なのはGUIアプリケーションにおける話だ。コマンド上でも制御できる。


[手順２]ポート開放
管理者権限で起動したPowershellを用意しましょう。
``New-NetFirewallRule``コマンドを用いて新しいルールを作り通信できるようにします。
```powershell: 管理者Powershell
C:\Windows\System32> New-NetFIrewallRule -DisplayName {英数字のみで好きなルール名を付ける}`
                     -Protocol TCP  -LocalPort 25565 -RemotePort 25565 -Action Allow `
                     -Profile Any -Enabled True -LocalAddress Any -RemoteAddress Any
```
これでルール名が{好きなルール名}・プロトコルがTCP・ローカルポートが25565・リモートポートが25565・通信を許可・どのファイアウォールプロファイルでも適用する・ルールを作成後有効にする・どのローカルアドレスからも通信可・すべてのグローバルアドレスから通信可 という状態でポート開放が行われます。  
</details>

</details>