🧊

VPSにマイクラサーバ構築 (Rocky Linux)

2024/08/30に公開

はじめに

久しぶりにマイクラがやりたくなったので、Minecraft サーバーをVPS上に構築しました!
構築手順を備忘録として残します。

環境情報、ソフトウェアバージョン

今回はcontaboでVPSを購入します。
以下が今回構築に使用した仮想マシンのスペックになります。

リソース スペック
CPU 4コア
メモリ 6GB
SSD 600GB

以下が使用するソフトウェアのバージョンになります。

ソフトウェア バージョン
minecraft_server 1.21.1
minecraft 1.21.1
java 21

VPS購入

まずは以下のサイトからVPSを購入していきます。
https://contabo.com/en/vps/
今回は一番左のCloud VPS 1を選択します。

VPSのOS、スペックなどを選択していきます。
1.Select your term lengthでは契約期間を指定します。期間が長いほどお得になります。
2.Regionはサーバが配置されている地域を指定します。使用地域が近いほどレスポンス速度が速くなります。レスポンス速度をそこまで重視しない使用方法であればどこでも問題ないので、私は無料のヨーロッパを選択しました。

3.Storage TypeではSSDかNVMeの選択と容量を選択します。
私は600GBのSSDを選択しました。

4.ImageではVPSのOSを選択します。私はRocky Linux9を選択しました。
好きなものを選択してください

5.Login & password for your serverではrootユーザのログインを選択します。推測されにくいパスワードを設定してください。

残りの項目は必要であれば選択してください。基本デフォルトで問題ないです。
Nextをクリックし購入処理に進みます。

購入後、サーバが構築されるとメールでサーバ情報が送られてくるので、しばし待ちましょう。
サーバ情報が届いてからサーバ構築を行います。

サーバ構築

構築後送信されるメールに接続先IPアドレスの記載があるのでそれを基にssh接続します。
[IP-address]にはメールに記載された接続先IPアドレスを入れ、以下のコマンドでssh接続します。
Tera Term等を用いてssh接続しても良いです。

ssh -l root [IP-address]

接続できれば以下のような画面が表示されます。

ログインユーザ、マイクラ用ユーザの作成

サーバに接続できたところでログインユーザとマイクラを起動させるユーザを作成します。

ログインユーザ作成

まずはログインユーザを作成します。rootで直接ssh接続できるのはセキュリティ的によろしくないので、代わりにログインするユーザを作成します。以下のコマンドを実行します。
[username]の部分は適当な名前に置き換えてください。

# ユーザを追加
useradd [username]
# パスワードを設定
passwd [username]
# sudo権限付与
usermod -aG wheel [username]
# 確認
id [username]
uid=1000([username]) gid=1000([username]) groups=1000([username]),10(wheel)

上記ユーザにはwheelグループに入れることでsudo権限を付与してます。
sudoersファイルの以下部分が同じようになっていることを確認してください。

/etc/sudoers
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

新しく作成したユーザでssh接続できるか確認します。
[username]は上記で作成したユーザ名に[IP-address]は接続先IPに変更してください

ssh -l [username] [IP-address]

マイクラ起動ユーザ作成

マイクラサーバを起動させる用のユーザを作成します。このユーザはssh接続でログインするのを禁止します。
ログインユーザを作成したときと同じように以下のコマンドを実行していきます。

# minecraftユーザを追加
useradd minecraft
# パスワードを設定
passwd minecraft
# 確認
id minecraft
uid=1000(minecraft) gid=1000(minecraft) groups=1000(minecraft)

/etc/ssh/sshd_configを編集し、minecraftユーザのssh接続を禁止させる設定を入れます。

vi /etc/ssh/sshd_config

以下の設定を設定ファイルに追加します。[username]は先ほど作成したログインユーザ名が入ります

/etc/ssh/sshd_config
AllowUsers [username]

変更できたらsshdを再起動して設定を反映させます。

# 設定を反映
systemctl restart sshd

minecraftユーザでssh接続できないことを確認してください。

ssh -l minecraft [IP-address]

rootユーザーのssh接続を禁止する

ログインユーザでsshの接続を確認できたらrootのssh接続を禁止します。
sshd_configファイルのPermitRootLoginをnoに変更します。以下のコマンドで設定ファイルを編集します。(rootユーザで実行)

vi /etc/ssh/sshd_config

以下のようにコメントアウトを外して編集します。

/etc/ssh/sshd_config
#変更前
PermitRootLogin yes
        ↓
# 変更後
PermitRootLogin no

変更できたらsshdを再起動して設定を反映させます。

# 設定を反映
systemctl restart sshd

# ログアウト
exit

rootユーザでssh接続できないことを確認してください。

ssh -l root [IP-address]

ファイヤーウォールの設定

ファイアウォールの設定をしていきます。
今回はマイクラの使用ポートを許可する設定を追加します。
まずはファイアウォールの状態を確認します。

# rootに昇格(現在rootであれば実行不要)
su - root
# 状態確認
systemctl status firewalld

Active: inactive (dead)となっている場合はファイアウォールが無効になっています。
無効になっている場合は以下のコマンドで有効化します。

# 起動
systemctl start firewalld
# 確認
systemctl status firewalld

# 自動起動
systemctl enable firewalld
# 確認
systemctl is-enabled firewalld

現状、許可されているサービスとポートを確認します。

# 許可されているサービスの確認
firewall-cmd --list-services --zone=public --permanent
# 許可されているポートの確認
firewall-cmd --list-ports --zone=public --permanent

マイクラで使用するデフォルトポート(25565番)を許可します。

# 25565番を許可
firewall-cmd --add-port=25565/tcp --zone=public --permanent
# リロードして反映
firewall-cmd --reload
# 許可されているポートの確認
firewall-cmd --list-ports --zone=public --permanent

本来、セキュリティ的には最低限sshのポート変更したり、ssh接続をパスワードで接続することを禁止し、公開鍵を使って接続させるようにするなどする必要がありますが、面倒なので今回は設定しません。以前に別のサーバで設定したの以下の記事を参照してください。
https://zenn.dev/goal_a/articles/76dc0404909378#公開鍵でssh接続する

ソフトウェアのインストール

minecraft_serverの起動に必要なソフトウェアをインストールしていきます。
tmux,jdk,minecraft_server.jarのインストールを行います。

TMUX

tmuxでセッションを作成し、バックグラウンドでMinecraftサーバーを実行します。
tmuxを用いることでユーザーがターミナルを閉じたり、SSH接続が切断されたとしてもセッションは維持され、常にバックグラウンドでMinecraftサーバーが実行され続けます。
以下のコマンドでインストールします。(rootユーザで実行)

# -yオプションをつけてインストール
dnf -y install tmux

Java

バージョン1.21.1のMinecraftサーバを動作させるためにはJava21が必要なためインストールします。
以下のコマンドでインストールします。(rootユーザで実行)

# -yオプションをつけてインストール
dnf -y install java-21-openjdk
# 確認
java --version

minecraft_server.jar

マイクラサーバのjarをインストールします。
インストールするjarを配置するためのディレクトリを作成します。

# ディレクトリ作成
mkdir /usr/local/minecraft
# 確認
ls /usr/local/minecraft

それでは作成したディレクトリに移動し、インストールします。
まずは以下のサイトからjarのダウンロードリンクを確認します。
https://www.minecraft.net/ja-jp/download/server
右クリックでリンクアドレスのコピーからダウンロードリンクをコピーします。

以下のようなリンクがクリップボードにコピーされると思います。

https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar

以下のコマンドでインストールします。[Download-Link]には上記でコピーしたリンクを貼り付けてください

# ディレクトリ移動
cd /usr/local/minecraft

# jarをインストール
curl -LO [Download-Link]

# バージョンを含むようにファイル名変更
mv server.jar minecraft_server.1.21.1.jar

/usr/local/minecraftの所有者とグループをminecraftユーザに変更します。

# 所有者・グループ変更
chown -R minecraft:minecraft /usr/local/minecraft
# 所有者・グループ変更確認
ls -l /usr/local

起動設定

それでは一時起動してみます。以下のコマンドを実行します。
マイクラサーバはminecraftユーザで起動することに注意してください

# minecraftユーザにログイン
su - minecraft
# 確認
whoami
# ディレクトリ移動
cd /usr/local/minecraft
# 起動
java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.1.jar nogui

以下のようにEULAへの同意が行われていないためエラーで初回起動は失敗します。

自動生成されているeula.txtを編集し、EULAへの同意を行います。

vi /usr/local/minecraft/eula.txt

以下のように変更します。

/usr/local/minecraft/eula.txt
#変更前 
eula=false
   ↓
#変更後
eula=true

それではもう一度サーバを起動させます。

java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.1.jar nogui


起動できていそうなのでクライアントからサーバに接続してみます。
クライアントのバージョンがサーバと同じバージョンであることを確認してください。私の場合は1.21.1になります。
無事に接続できました!

起動スクリプト作成

それではtmuxを用いてバックグラウンドでサーバを起動させるシェルスクリプトを作成し、実行します。とりあえずサーバを停止させます。

# サーバ停止
stop

スクリプト内で使用しているpgrepコマンドがない場合はインストールします。(rootで実行)

# pgrepを含むパッケージ群
dnf -y install procps-ng

シェルスクリプトを作成します。(minecraftユーザでファイル作成)

# ディレクトリ移動
cd /usr/local/minecraft
# スクリプト作成
vi minecraft_script.sh

以下のようなスクリプトを作成します。

minecraft_script.sh
/usr/local/minecraft/minecraft_script.sh
#!/bin/bash
#
# mincraft_server start/stop/status script
#

# mincraft_serverの実行ユーザ
USERNAME='minecraft'

# tmuxのsession名
TMUX_SESSION_NAME='minecraft'

# minecraft_serverディレクトリ
SERVER_PATH='/usr/local/minecraft'

# 実行するminecraft_server.jar
SERVICE="$SERVER_PATH/minecraft_server.1.21.1.jar"

# ヒープメモリの最大最小値の設定
XMX='4096M'
XMS='4096M'

cd $SERVER_PATH

# 実行ユーザの確認
ME=`whoami`

if [ $ME != $USERNAME ]; then
  echo "Please run as $USERNAME"
  exit
fi

# Minecraft 起動処理
start() {
    if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
        echo "$SERVICE is already running!"
    else
        echo "Starting $SERVICE..."
        tmux new-session -d -s $TMUX_SESSION_NAME
        tmux send-keys -t $TMUX_SESSION_NAME:0 "java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui" Enter
    fi
}

# Minecraft 停止処理
stop() {
    if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
        echo "Stopping $SERVICE"
        tmux send-keys -t $TMUX_SESSION_NAME:0 "say You have 10 seconds to stop the server. Saving..." Enter
        tmux send-keys -t $TMUX_SESSION_NAME:0 "save-all" Enter
        sleep 10
        tmux send-keys -t $TMUX_SESSION_NAME:0 "stop" Enter
        sleep 10
        echo "Stopped minecraft_server"
    else
        echo "$SERVICE is not running!"
        exit
    fi

    while :
    do
        if
            pgrep -u $USERNAME -f $SERVICE > /dev/null; then
            echo "Stopping $SERVICE"
            sleep 10
        else
            tmux kill-session -t $TMUX_SESSION_NAME
            echo "Stoped $SERVICE"
            break
        fi
    done
}


# Minecraft 状態確認処理
status() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
exit
  else
echo "$SERVICE is not running!"
exit
  fi
}

case "$1" in
    start)
        echo "Minecraft Server Start"
        start
        ;;
    stop)
        echo "Minecraft Server Stop"
        stop
        ;;
    status)
        echo "Minecraft Server Check Status"
        status
        ;;
    *)
        echo "Invalid!!"
        echo  $"Usage: $0 {start|stop|status}"
esac

上記のスクリプトは、Minecraftサーバーの起動、停止、および状態の確認を行うためのものです。
部分的に説明します。下記の部分で、スクリプトで使用するために実行ユーザ、jarの配置ディレクトリ、tmuxのsession名、メモリの最大値と初期起動時メモリ量を変数として設定しています。

# mincraft_serverの実行ユーザ
USERNAME='minecraft'

# tmuxのsession名
TMUX_SESSION_NAME='minecraft'

# minecraft_serverディレクトリ
SERVER_PATH='/usr/local/minecraft'

# 実行するminecraft_server.jar
SERVICE="$SERVER_PATH/minecraft_server.1.21.1.jar"

# ヒープメモリの最大最小値の設定
XMX='4096M'
XMS='4096M'

起動処理について
minecraftユーザーによってminecraft_server.1.21.1.jarのプロセスが存在するかどうかを確認するし、あればメッセージを出力する。
プロセスない(サーバが起動していない)場合はtmuxで新しいセッションを作成し、そこでサーバを起動させている。

start() {
    if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
        echo "$SERVICE is already running!"
    else
        echo "Starting $SERVICE..."
        tmux new-session -d -s $TMUX_SESSION_NAME
        tmux send-keys -t $TMUX_SESSION_NAME:0 "java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui" Enter
    fi
}

停止処理について
minecraftユーザーによってminecraft_server.1.21.1.jarのプロセスが存在するかどうかを確認し、なければメッセージを出力し終了する。
プロセスある(サーバが起動している)場合はサーバが起動しているセッションに"save-all"コマンドを送信しデータの保存を行い、続いて"stop"コマンドを送信することでサーバを停止させている。
サーバ停止後、起動していたセッションを削除し処理を終了している。

stop() {
    if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
        echo "Stopping $SERVICE"
        tmux send-keys -t $TMUX_SESSION_NAME:0 "say You have 10 seconds to stop the server. Saving..." Enter
        tmux send-keys -t $TMUX_SESSION_NAME:0 "save-all" Enter
        sleep 10
        tmux send-keys -t $TMUX_SESSION_NAME:0 "stop" Enter
        sleep 10
        echo "Stopped minecraft_server"
    else
        echo "$SERVICE is not running!"
        exit
    fi

    while :
    do
        if
            pgrep -u $USERNAME -f $SERVICE > /dev/null; then
            echo "Stopping $SERVICE"
            sleep 10
        else
            tmux kill-session -t $TMUX_SESSION_NAME
            echo "Stoped $SERVICE"
            break
        fi
    done
}

スクリプトの権限を変更し、起動させます。

# 権限変更
chmod 740 minecraft_script.sh
# 確認
ls -l minecraft_script.sh

# 起動
./minecraft_script.sh start

# 起動していることを確認
./minecraft_script.sh status

# 停止
./minecraft_script.sh stop

# 停止していること確認
./minecraft_script.sh status

TMUXセッションへのアクセス
サーバが起動しているへの接続は以下のコマンドを実行します。(minecraftユーザで実行)

# セッション確認
tmux ls
# セッションへ接続
tmux a -t minecraft

切断は「Ctrl + b」+ 「d」でセッションから抜けます。

マイクラ使用ポートの変更

マイクラのデフォルトポートは25565番ですが、デフォルトポートは狙われやすいためセキュリティ的には変更したほうがいいです。そのためマイクラで使用するポート番号を変更します。

設定するポート番号は1~65534の範囲であればなんでもいいですがウェルノンポートやその他サービスで使用しているポートは避けてください。server.propertiesを編集し、変更します。(minecraftユーザで実行)

vi /usr/local/minecraft/server.properties

以下のように変更します。

# 変更前
server-port=25565
  ↓
# 変更後
server-port=35566

次にファイヤーウォールの設定を変更します。

# rootに昇格(現在rootであれば実行不要)
su - root
# 25565番を許可しないように変更
firewall-cmd --permanent --remove-port=25565/tcp --zone=public --permanent
# 35566番を許可
firewall-cmd --add-port=35566/tcp --zone=public --permanent
# リロードして反映
firewall-cmd --reload
# 許可されているポートの確認
firewall-cmd --list-ports --zone=public --permanent

マイクラにアクセスするときは以下のように接続先を指定してください。

[IP-address]:35566

自動起動設定

Minecraftサーバを自動起動させるためにサービスを作成し、systemdで起動できるようにします。

# rootに昇格(現在rootであれば実行不要)
su - root
# サービスファイルの作成
vi /etc/systemd/system/minecraft.service

以下の内容を記載します。

/etc/systemd/system/minecraft.service
[Unit]
Description=Minecraft Server

[Service]
Type=forking
User=minecraft
WorkingDirectory=/usr/local/minecraft/
ExecStart=/bin/bash /usr/local/minecraft/minecraft_script.sh start
ExecStop=/bin/bash /usr/local/minecraft/minecraft_script.sh stop

[Install]
WantedBy=multi-user.target

適切に設定されているか起動と停止を確認します

# 起動
systemctl start minecraft.service
#確認
systemctl status minecraft.service

# 停止
systemctl stop minecraft.service
#確認
systemctl status minecraft.service

# 起動&自動起動設定
systemctl enable --now minecraft.service
# 確認
systemctl status minecraft.service
systemctl is-enabled minecraft.service

おわりに

最後にもう一度クライアントから接続します。
無事接続できました!構築完了です!

はじめてマイクラサーバを構築しましたが、tmuxやシェルスクリプトのことを学べて楽しかったです!

参考

https://blog.gurees.net/?p=726
https://mc.server-memo.net/almalinux9_java_minecraft-server_install/#google_vignette
https://al-batross.net/2020/08/06/ssh-allow-user/
https://dareblo.com/minecraft-server-port-settings/

Discussion