UbuntuでMinecraftサーバーを構築してみた
TL;DR
- minecraftを実行できるようにする
- minecraftを自動再起動ーバックアップを作る
- プラグインを導入してみる
対象
- こんなページを見に来るような人
- 筆者当時高校2年生と同程度の知識の人
- Windowsに飽きた人
- 身内でminecraftをやりたい人
セットアップ
筆者環境を以下に示します。
- CPU: Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz, 2900 MHz
- LAN-board: Gigabyte Onboard Ethernet
- HDD: WDC WD10EZRZ-22H
- RAM: CORSAIR 4GB 2
Javaのインストール
Minecraftはそのバージョンによって要求されるJavaのバージョンが異なります。例えば、1.18以降ではJava17以降が必須とされ、それ以前ではJava-8から16であれば動く、などです。せっかくなので複数バージョンのJavaをインストールして共存させてみましょう。
sudo apt search jre #現存するjreの検索
sudo apt install openjdk-8-jdk openjdk-11-jdk openjdk-13-jdk openjdk-16-jdk openjdk-17-jre # 今回は全部入れましたが、必要なものを選択してください。
sudo update-alternatives --config java # Javaのバージョンを切り替える。
echo export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") >> ~/.zshrc #JAVA_HOMEの設定
echo export PATH=$PATH:$JAVA_HOME/bin >> ~/.zshrc # JAVA_HOMEのPATHへの追加
echo source ~/.bashrc >> ~/.zshrc
Screenのインストール
ScreenはTmuxの亜種みたいなものです。Tmuxの方がメジャーで、多少操作が簡単なようなのですが、Screenはキャプションが付けられたり便利(と私は思っています)です。 比較は以下を参照してください。
tmuxとscreenのそれぞれの優れてる点
インストール自体はとても簡単で、
sudo apt install screen
これだけです。なぜScreenのインストールをわざわざ1項目作ったかというと、Screenがデフォで使いにく過ぎるためです。
ということで、~/.screenrcを設定していきます。
#コマンド履歴をスクロールして確認できるようにする
info linux ti@:te@
info xterm ti@:te@
info xterm-color ti@:te@
defscrollback 8192 #履歴の表示行数
# logの保存 logfileに保存されます。
logfile '/var/log/screen/%H.%Y%m%d-%02c:%s-%n.%t.log'
deflog flush secs
deflog on
verbose on
logtstamp on
logtstamp string "\n-- SCREEN [%Y/%m/%d %02c:%s] %n:%t --\n"
# 終了時にkで削除、rで再実行できるようにする
zombie kr # k:destroy window r:resurrect window
# ハードコピーの保存ディレクトリ
hardcopydir 'screen/hardcopy'
hardcopy_append on
# ハードコピーのバッファーファイル
bufferfile 'screen/screen-exchange'
# ビープ音を鳴らせるようにする
vbell on
# 他のWindowへのフォーカスの切り替え(Vim式キーバインド)
bind ^J eval 'focus down' 'command -c cfocus'
bind ^K eval 'focus up' 'command -c cfocus'
bind -c cfocus ^J eval 'focus down' 'command -c cfocus'
bind -c cfocus ^K eval 'focus up' 'command -c cfocus'
bind -c cfocus ^T eval 'focus top' 'command -c cfocus'
bind -c cfocus ^B eval 'focus bottom' 'command -c cfocus'
# 背景色の削除設定を有効にする
defbce on
# 太字には明るい色を使う。
attrcolor b '.I'
# TERM変数に`xterm'を設定することで、様々な環境に対応できます
term xterm
# 256色を有効にする
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
# 再装着時に端子幅をリサイズさせない
termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
# caption/hardstatusに合わせてwindowlistの形式を変更する
windowlist title '%{u .g}Num Flags Title%=[0-9] select the number [movement] j,C-n:Down k,C-p:Up (C-)f:PageDown (C-)b:PageUp'
windowlist string '%{.g}%3n %{.y}%f%09=%{dg} %t %='
caption always '%?%F%{= gW}%:%{= Kk}%?%2n%f%07=%t%='
hardstatus alwayslastline '%m/%d %02c:%s %{= .g}%H%{-} %L=%-w%45L>%{=u g.}%n %t%{-}%+w %-17<%=%{= .y}(%l)'
minecraft serverのインストール(本題)
本体のインストール
sudo groupadd mc_admin
sudo usermod -G mc_admin [操作ユーザー]
SERVER='[サーバーの配置パス]'
SERVER_NAME='[サーバー名]'
mkdir ${SERVER}
sudo chgrp -R mc_admin ${SERVER}
sudo chmod -R 770 ${SERVER}
cd ${SERVER}
mkdir ${SERVER}/${SERVER_NAME}
sudo chgrp -R mc_admin ${SERVER}/${SERVER_NAME}
sudo chmod -R 770 ${SERVER}/${SERVER_NAME}
cd ${SERVER}/${SERVER_NAME}
curl -O https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
sudo ufw allow 25565/tcp
java -jar BuildTools --rev [バージョン]
# 1.18をインストールする場合のみjavaは17が指定されています。
# 最新バージョンをインストールしたい場合はlatestを指定してください。
java -jar spigot.[バージョン].jar
vim ./eula.txt # eula=trueにしてください
実行環境の整備
Start.shなどは、Minecraftサーバをscreenとcronでプラグインを使わずに自動再起動する | 純規の暇人趣味ブログをコピペしていただけると確実です。せっかくLinux-basedでやるので、全部autoにしちゃいましょう。
参考までに私のstart.shとrestart.shを配置しておきます。
#!/bin/bash -x
DIR=`dirname $0`
JRE='/usr/lib/jvm/java-17-openjdk-amd64/bin/java'
JAR=spigot-1.18.1.jar
RAM=2G
THREAD=4
SCREEN_NAME='lobby'
cd ${DIR}
screen -UAmdS ${SCREEN_NAME} ${JRE} -Xms${RAM} -Xmx${RAM} -jar ${DIR}/${JAR} -nogui
#!/bin/bash -x
DIR=`dirname $0`
JRE=`which java`
RUNNER=start.sh
Wait=30
SCREEN_NAME='lobby'
BK_DIR=${DIR}/../backup/${SCREEN_NAME}/`date "+%Y%m%d%H"`
cd ${DIR}
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${Wait}'秒後にサーバーを定時 再起動をはじめます\015"'
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 現在の作業を一時停止できる状態にしてください\015"'
sleep ${Wait}
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "stop\015"'
mkdir ${BK_DIR}
mkdir ${BK_DIR}/world
mkdir ${BK_DIR}/world_nether/
mkdir ${BK_DIR}/world_the_end/
cp -r ${DIR}/world/ ${BK_DIR}/
cp -r ${DIR}/world_nether/ ${BK_DIR}/
cp -r ${DIR}/world_the_end/ ${BK_DIR}/
while [ -n "$(screen -list | grep -o "${SCREEN_NAME}")" ]
do
screen -p 0 -S ${SCREEN_NAME} -X 'stuff"k"'
sleep 1
done
${DIR}/${RUNNER}
Floodgate&GeyserMCの導入
流れとしてはGeyserMCを用いてBE勢力のパケットを変換し、Floodgateを用いてBE勢力を認証します。
wget https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/target/Geyser-Spigot.jar
wget https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/master/lastSuccessfulBuild/artifact/spigot/target/floodgate-spigot.jar
screen -UAmdS GFInstall java -jar ./../spigot-[バージョン].jar
screen -p 0 -S GFInstall -X eval 'stuff "stop\015"'
while [ -n "$(screen -list | grep -o "GFInstall")" ]
do
screen -p 0 -S GFInstall -X 'stuff"k"'
sleep 1
done
vim floodgate/config.yml # auth-type=floodgateにしてください。
sudo ufw allow 19132/udp
BungeeCordの導入
BungeeCordというプロキシサーバーを導入することで、サーバー間での接続が可能となります。一般には必要とされていないが、サバイバルサーバー、クリエサーバーなどで分ける場合などで便利です。ある程度のネットワーク知識を要求します。また、BungeeCordを導入する場合はGeyserMCはSpigotから外してください。
wget https://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/BungeeCord.jar
mkdir plugins
cd plugins https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/master/lastSuccessfulBuild/artifact/bungee/target/floodgate-bungee.jar
cd ../
screen -UAmdS BCSetup java -jar bungeecord.jar
screen -p 0 -S BCSetup -X eval 'stuff "stop\015"'
while [ -n "$(screen -list | grep -o "BCSetup")" ]
do
screen -p 0 -S BCSetup -X 'stuff"k"'
sleep 1
done
listeners:
- query_port: 25565
motd: |-
[概要]
tab_list: GLOBAL_PING
query_enabled: false
proxy_protocol: false
forced_hosts:
pvp.md-5.net: pvp
ping_passthrough: false
priorities:
- lobby
- server1
...
[サーバーにフォールバックする順番で列挙してください]
bind_local_address: true
host: 0.0.0.0:25565
max_players: 100
tab_size: 60
force_default_server: false
remote_ping_cache: -1
network_compression_threshold: 256
permissions:
default:
- bungeecord.command.server
- bungeecord.command.list
- bungeejapanizemessenger.dictionary
admin:
- bungeecord.command.alert
- bungeecord.command.end
- bungeecord.command.ip
- bungeecord.command.reload
log_pings: false
connection_throttle_limit: 3
server_connect_timeout: 5000
timeout: 30000
stats: [もともと埋められていた数値を使用してください]
player_limit: -1
ip_forward: true
groups:
replica_doll: null
remote_ping_timeout: 5000
connection_throttle: 4000
log_commands: false
prevent_proxy_connections: false
online_mode: true
forge_support: false
disabled_commands:
- disabledcommandhere
servers:
lobby:
motd: |-
[概要に貼るやつ]
address: localhost:[サーバーのポート]
restricted: false
[以下同様にサーバーを列挙していく]:
server-port=[25565以外で、サーバーのポート]
あとBungeeCordサーバーにあるplugins/floodgate/key.pemをSpigot上のplugins/floodgate/key.pemに上書きするとよいと思います。