⛏️

alpine linuxではじめる軽量なマイクラ鯖の立て方

に公開1

TL; DR

#ツール等のインストール
doas apk add openjdk21-jre-headless curl
mkdir minecraftserver && cd minecraftserver
curl <ファイルのリンク> -o server.jar
# サーバ起動
screen -S minecraft java -jar -Xmx3G -Xmn2G -Xms1G server.jar
# eula.txtを編集して起動
# eula=false -> eula=true
screen -S minecraft java -jar -Xmx3G -Xmn2G -Xms1G server.jar

はじめに

この記事は私の気まぐれで書かれています。どこか直したほうがいいところあったら書き込んでにゃ。

前提条件

  • linuxのコマンド操作ができること
  • 動作させるためのマシンがあること(VM等)

鯖づくり(構築)

準備

OSインストール

ISOからのインストールとイメージファイルを使う方法がありますが、今回は既存のcloudimageを使用します。各自で使う方法を選んでくださいな

ここに転がっているイメージをダウンロードしてcloudinitでセットアップします。
https://alpinelinux.org/cloud/
ProxmoxVEを利用するときはcloud-initドライブを追加して設定するとネットワークとユーザの設定が一度にできます。

おまじない

はじめにアップデートをします

doas sh -c 'apk update && apk upgrade'

環境構築

サーバを動作させるためのランタイムとツールをインストールします

# javaとcurl, screenのインストール
doas apk add openjdk21-jre-headless curl screen

ユーザ作成(任意)

セキュリティを維持するためにサーバを動作させるための非特権ユーザを作成します。
次のコマンドを実行してください。

cat << EOL | doas sh -
useradd minecraft -d /minecraft
mkdir /minecraft
chown minecraft:minecraft -R /minecraft
EOL

Minecraftサーバインストール

ここからの作業はminecraftユーザで行います。
次のコマンドで切り替えてください。

doas su - minecraft

サーバファイルダウンロード

ファイルを公式からドロップするなど自身の使いたいものを選択してください。
今回は公式サーバファイルを落とします。

curl https://piston-data.mojang.com/v1/objects/4707d00eb834b446575d89a61a11b5d548d8c001/server.jar -o server.jar

起動スクリプト作成

スクリプトファイルを編集します

vi start.sh

start.sh

#!/bin/sh
screen -S minecraft java -jar -Xmx3G -Xmn2G -Xms1G server.jar

作成したスクリプトに実行権限を付与

chmod +x start.sh

起動

初回起動時はEULAに同意を求められるので勝手に止まります。

./start.sh

#[16:06:46] [ServerMain/WARN]: Failed to load eula.txt
#[16:06:46] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

eula.txtのeula=falseとなっている部分をtrueに変更します。

# 変更前
eula=false
# 変更後
eula=true

そして起動 ヨシ!

[16:16:58] [Server thread/INFO]: Done (10.696s)! For help, type "help"

サーバに接続してみよう

サーバが動いてるマシンのIPアドレスを確認しよう。 今回はeth0がデフォルトポートなのでinetの部分が接続に使用するアドレスになる。

alpine-dev:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:a7:b7:06:d4:de brd ff:ff:ff:ff:ff:ff
    inet 172.16.22.214/16 brd 172.16.255.255 scope global dynamic noprefixroute eth0
       valid_lft 527sec preferred_lft 452sec
    inet6 fe80::50a7:b7ff:fe06:d4de/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever

マルチプレイサーバを追加する。

接続 ここまでで一連の流れは完了です

鯖コンソールへの接続と切断

今回はscreenを使用しているのでバックグラウンドで動作させることができます。
デタッチ(切断)するときはCtrl+Aののちにdを押すと切断できます。

アタッチ(再接続)するときはscreen -r <セッション名>でコンソールに入れます。
今回はセッション名がminecraftなのでscreen -r minecraftで入れます。
screenコマンドのオプション等を調べれば自動再起とかも作れるのでやってみてくださいなー

外部公開

基本的にポート開放(IPマスカレード)の設定をおこなってサーバを外部公開することになるのですが、今回はポート開放ができない環境での公開を例にやってみます。

今回はngrokというサービスを利用してTCPトンネルを張って外から入れるようにしましょう。
特権ユーザで各自で置き換えて実行してください。

#ダウンロード
curl <ダウンロードリンク> -o ngrok-v3-stable-linux-amd64.tgz
#binに展開
doas tar -xvzf ~/Downloads/ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin

サーバを外部公開してみよう

#tokenを登録
ngrok config add-authtoken <token>

#起動
screen -S ngrok-tunnel ngrok tcp 25565

上のコマンドを実行すると次のようになります。
下記画像の0.tcp.jp.ngrok.io:xxxxxとなっている部分がサーバのアドレスになります。

外部公開に使用したコマンドをstart.shに追加すれば同時に外部公開することができます。
この例では起動時にアドレスを確認できるようにminecraftサーバ起動時に-dmオプションをつけて裏に遷移するようにしました。

変更例

#!/bin/sh
screen -dmS minecraft java -jar -Xmx3G -Xmn2G -Xms1G server.jar
screen -S ngrok-tunnel ngrok tcp 25565

Discussion

KazunyanKazunyan

地味にTL;DRで書いてあることと本文で違うんだよなあ...
単純に鯖立てるだけだったらディレクトリ作ればいいだけだけど、本文ではすこしセキュリティも意識した作りにしてるから... ね