Minecraft統合版サーバをマンションに立てる(VPSからオンプレミスに移行)

### 目的
ワークステーションをいただく機会がありましたので、今までVPS上で動かしていた統合版のサーバをオンプレミス環境に移行しようと考えています。
備忘録の側面が強い記事ですので、稀に過度に詳細な説明があります(VPS→WSへの移行作業など)。あしからず。

### 初めて統合版サーバを作成される方へ
この記事の冒頭は旧環境からの移行がメインですので、初めてサーバを立てる際には以下の記事を参考にしてください。

https://qiita.com/kabegamikamio/items/9c1a30c63de31be834da

### 実施環境
- ワークステーション
    - HP Z640
        - Xeon E5-2637 v3 (4C8T) x2 (8C16T)
        - RAM: DDR4-2133 8GB x4
        - インストール先: SATA接続の256GB SSD
        - OS: CentOS 7 &rightarrow; ubuntu desktop 24.04 LTS
            - bedrock_serverがubuntu向けで、VPSでもubuntuを利用していたためCentOSから再インストールを行いました
            - serverでもいいと思いますが、せっかくオンプレミスでGUIも気軽に使えるのでdesktopにしました
- 自宅のネットワーク
    - 集合住宅のため、各戸にはグローバルIPが当たらない環境です。グローバルIP割り当てサービスもないようでした。
    - localto.netというサービスを使ってポートフォワードします

### 移行作業の概要
- ワークステーションへのOS導入
- ワークステーションへのbedrock_server環境移行
- ワークステーションのポート開放
- localto.net の導入
- 自宅ルータの設定
- 実行・接続確認

### ワークステーションへのOS導入
1. 別機でubuntu live usbを作成しました。live usbが作れればどんなやり方でもOKですが、私は [こちら](https://rtc-fukushima.jp/technical/6671/) を参考にUniversal USB Installerを使ってイメージ焼きしました。
1. ワークステーションにlive usbを挿入し、ubuntuをインストールしました。GUIで操作できるのであまり躓くことはないと思いますが……。

私が頂いたワークステーションはBIOSロックがかかっていたため、live usbからOSを起動するためにBIOS P/Wのクリアが必要でした。このワークステーションはCMOSクリアでBIOS P/Wが消えません。 [HPの公式ドキュメント](https://jp.ext.hp.com/content/dam/jp-ext-hp-com/jp/ja/ec/lib/products/workstations/maintenance_serviceguide_z440_z640_z840.pdf) のP118 「パスワードジャンパーのリセット」 にも記載があるように、パスワード・ジャンパのリセットを行います。

### ワークステーションへのbedrock_server環境移行
VPSから `scp` を使ってWSに bedrock のサーバ環境を移行します。
私が使っているVPSは公開鍵認証以外でのログインを認めない設定にしているので、公開鍵の設定から行っていきます。

```shell:ワークステーション側
> ssh-keygen
(適当に鍵を生成)
> cat id_ed25519.pub
ssh-ed25519 ... (鍵をコピー)
> vi config
```

```config:config
Host mc-ssh
    HostName (VPSのアドレス)
    User minecraft
    IdentityFile ~/.ssh/id_ed25519.pub
    ServerAliveInterval 60
```

```shell:VPS側
> cd .ssh
> cat >> authorized_keys
(鍵をペースト)
> 
```

```shell:WS側
> scp -r mc-ssh:~/bedrock/server/ ~/bedrock/
```

### ワークステーションのポート開放
localto.net 導入に先立ち、WS上で使用するポートを開放しておきます。
開放するポートは以下の通り。いずれもデフォルトポートなので、変更されている場合は随時読み替えていただければ結構です。

- 19132/udp
- 22/tcp (任意、外部からssh接続する際に有用)
- 80/http (任意、サーバ内においたHTMLにアクセスする際に有用)
- 443/https (同上)

```bash
# ufw をインストール
sudo apt install ufw -y

sudo ufw enable

sudo ufw allow 19132/udp

# optional
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
```

### localto.net の導入

#### 「踏み台」の必要性
集合住宅などで共有ルータがあるため各デバイスにグローバルIPが当たらない場合、一度外部の踏み台サーバを通じて自宅のオンプレミスサーバにフォワードする必要があります。
TCP通信ですとSSHポートフォワードを用いることで簡単に実現できるようですが、統合版MinecraftはUDP通信ですので別の方法を検討する必要があります。
友人に相談したところtailscaleというサービスを使ってVPN環境を構築する方法があるようなのですが(しかも個人利用は基本無料)、今回は [こちらの記事](https://zenn.dev/hrtk92/articles/mc-server-localtonet) を参考に、localto.net というサービスを使うことにしました。
いずれtailscaleなど他のサービスに移行するかもしれません。

#### localto.net とは
localto.net は、名が表す通りリバースプロキシによってローカルネットワーク内にあるサーバを外部に公開するためのサービスです。
特徴としてSSHやHTTPを始めとした様々なプロトコルに対応している点であり、統合版Minecraftに使われるUDPにも対応しています。
月1GBまでの通信であれば無料で利用することができ、それ以降は1トンネルにつき1ヶ月2ドルで利用することができます。

https://localtonet.com/#pricing

#### localto.net の導入
下の記事を参照。

https://zenn.dev/hrtk92/articles/mc-server-localtonet

<details><summary>ひとくちメモ: サブドメイン設定 & ポート固定</summary>

有料プラン加入でトンネルのサブドメイン定義やポートの固定ができるようになります。
複数人で使うならば便利な設定です。

まずサブドメインの設定から。トンネル作成の際に `Randome SubDomain` ではなく `Custom SubDomain` を選択することで任意のサブドメインの設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626368/45ec2a19-aab8-6661-a1b4-09dc541a3881.png)

ポートを固定するには、固定したいトンネル → 設定を開き、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626368/066999d5-9bdb-87f7-7abd-9074f3024b0f.png)

Is Reserved? にチェック をすればいいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626368/45215615-beda-56cb-d2f4-943ad5fcd846.png)

</details>

#### localto.net の自動起動設定
localto.netはサーバの電源が落ちるなどしてホストappが停止すると、トンネルが断絶してしまいます。
そこでPCの再起動時などにlocalto.netを自動で起動するスクリプトを組みます。

```~/bedrock/run.sh
#!/bin/bash

RUN_STATUS_MC=`screen -ls | grep minecraft | grep -v S-minecraft | wc -w`
RUN_STATUS_LTN=`screen -ls | grep localtonet | grep -v S-localtonet | wc -w`

if [ $RUN_STATUS_LTN -eq 0 ]; then
        # Start the localtonet host
        echo establishing new localtonet connection
        screen -dm -S localtonet /bin/bash -c /home/kkamio/localtonet-linux-x64/localtonet
fi
if [ $RUN_STATUS_MC -eq 0 ]; then
        # Start the bedrock server
        echo starting new server
        cd ~/bedrock/server/
        screen -dm -S minecraft /bin/bash -c ~/bedrock/server/bedrock_server
else
        echo "Server already running.\n"
fi
```

localto.netの管理画面を見たい場合は `screen -r localtonet` で見ることが出来ます。
閉じる場合は普通の `screen` 操作通りで、 `Ctrl-a d` です。

### 自宅ルータの設定
自宅のルータの設定を開き、下記ポートの通信をWSに転送するよう設定します。
またこのときWSのローカルIPを固定するように設定したほうがいいでしょう。

- 19132/udp
- 22/tcp (任意、外部からssh接続する際に有用)
- 80/http (任意、サーバ内においたHTMLにアクセスする際に有用)
- 443/https (同上)

### 実行・接続確認
bedrock_serverを起動します。

```bash
cd ~/bedrock/
./run.sh
```

Minecraftのゲーム・クライアントでサーバ情報を入力し、接続してみます。
このときPingが🔴になってしまう(少なくとも私の環境では)のですが、そのまま「サーバーに接続」を押して大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626368/166e960c-c118-8123-d1d6-29774d0265cf.png)

無事接続できれば成功です。
3コア・4GBくらいのよわよわマシンから8C/16T・32GBのモンスター笑マシンになったことでエリトラ飛翔してもチャンク読み込みがスムーズになりました。快適快適。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626368/71e44943-0bd5-2057-6e3e-b1b77f1f894e.png)

### 既知の問題
#### ネットワークによってサーバに接続できたりできなかったりする
原因は様々考えられますが、環境によっては `(トンネルのサブドメイン).localto.net` へのルーティングができていないことを友人の環境で確認しました。
私が試して成功したのはホスト名ではなくIPv4のアドレスを直打ちしてもらう方法でした。
もっと根本的な解決方法もある気がしますが、私の知識不足のためこの方法で対処しました。

### まとめと感想
自宅ネットワークがややこしいせいでかなり苦労をして、一回諦めた期間を含めると半年ほどサーバ公開までかかってしまいました……。
マンションなどネットワークの自由が効かない方がサーバを立てる際の参考になれば幸いです。