友達と遊ぶための Minecraft Server (Mohist) を建ててみた話

備忘録のため、完全に再現可能とは限りません。

経緯

友達がBuildCraftやIC2などのModが入った環境でマルチプレイをしたかったみたいなのでサーバーを建ててみました。 もともとは、ローカル環境で鯖を建てていたのですがいくつか問題点があったためVMに移行しました。

ローカルでの問題点

  • ポート開放が必要
  • 自分が入らないときもPCの実行が必要
  • 鯖とクライアントを同時に起動するとメモリをたくさん使ってしまう

手順

1. ローカルにある鯖フォルダをリモートに転送する

zip -r Server.zip /path/to/Server/*
scp /path/to/Server.zip user@remote.ip:/path/to/
ssh user@remote.ip
[user@remote.ip ~]$ cd /path/to/
[user@remote.ip /path/to/]$ unzip Server.zip

2. ファイアーウォールのルールを変更する

[user@remote.ip ~]$ sudo firewall-cmd --add-port=25565/tcp --zone=public --permanent
[user@remote.ip ~]$ sudo firewall-cmd --add-port=25565/udp --zone=public --permanent
[user@remote.ip ~]$ sudo firewall-cmd --reload

3. Mohist 起動/停止スクリプトを作成する

[run.sh]

#!/bin/bash

screen -AmdS Mohist /path/to/Mohist/CustomJAVA/bin/java -jar /path/to/Mohist/mohist-1.12.2-273-server.jar nogui

[stop.sh]

#!/bin/bash

screen -S Mohist -X stuff 'say サーバーを停止します。\015' &> /dev/null
sleep 10
screen -S Mohist -X stuff 'stop\015' && exit 0

スクリプトの確認

[user@remote.ip ~]$ bash run.sh
# 起動していることをクライアント側などから確認する
# もしくは
# screen -S Mohist
# を使用して CUI から確認する。 Ctrl+a Ctrl+d で CUI を抜けてバックグラウンド実行を続ける

[user@remote.ip ~]$ bash stop.sh

3. サービスを作成する

[Unit]
Description=Minecraft Server
After=network.target local-fs.target

[Service]
Type=forking
User=user
WorkingDirectory=/path/to/Mohist
ExecStart=/bin/bash /path/to/run.sh
ExecStop=/bin/bash /path/to/stop.sh

[Install]
WantedBy=multi-user.target
[user@remote.ip ~]$ sudo systemctl daemon-reload
[user@remote.ip ~]$ sudo systemctl enable mohist.service
[user@remote.ip ~]$ sudo systemctl start mohist.service