Minecraft Java Editionの設定 第3回 Linuxで本格マルチプレイサーバを建てる
このドキュメントは@ProjectCBWが利用するサーバやサービスの設定・運用手順のドキュメントを元に作成した、LinuxでのMinecraftサーバ環境構築マニュアルです。
内容的にタイトルは「Minecraftで学ぶLinuxサーバ」が適切かもしれない。
更新履歴 見出しにジャンプ
日時 | 内容 |
---|---|
2020-07-30 |
|
今からやること 見出しにジャンプ
- サーバスペックの話をするよ
- LinuxサーバとWindowsクライアントを接続して遠隔操作するよ
- LinuxサーバでMinecraftを動かす準備をするよ
- Minecraftサーバを動かすよ
- Vanilla以外の派生サーバの動かし方を教えるよ
- サーバのバックアップ環境をつくるよ
- 応用編
Minecraftサーバが快適に動く条件 見出しにジャンプ
-
CPUの動作周波数が高い
JavaのGC(ガベージコレクション、≒メモリ解放)はほぼ全てのスレッドを使えますが、Minecraftサーバ自体の処理はマルチスレッドで動かないので、コア数よりクロックの方が影響します。
例えば、サーバ向けCPU Intel Xeonシリーズの多くはコア数は多いもののクロックが低いので思うように性能が出ません。 -
メモリが潤沢にある
メモリが足りないとJavaは頻繁にGCを実行し、CPUリソースを占有します。
また、WorldEditやその他Modを同時に動かすと、そもそも大量のメモリ資源がある前提の動作になってくるので、多めにあった方が良いでしょう。 -
ストレージが高速
圧縮保存されているMinecraftサーバのセーブデータやCoreProtectのデータベースなど、ストレージが遅いと足を引っ張ります。 -
Linuxを使う
同じスペックならWindowsは遅い。 -
日本にある
ゲームサーバ用途において光は遅いので、アメリカやシンガポールにサーバの実体があると体感で分かります。
上記の条件を踏まえて、海外のVPSホスティングサービスVultrのプランを例として見ていく。
プラン | SSD | 月額 | CPUのコア数 | CPUのクロック周波数 | RAM | Bandwidth | rsync --bwlimit |
---|---|---|---|---|---|---|---|
Cloud Compute | 320GB | $80 | 6vCore | 2.5GHz | 16GB | 5000GB | 1929KB/s |
Cloud Compute | 640GB | $160 | 8vCore | 2.5GHz | 32GB | 6000GB | 2314KB/s |
Dedicated Cloud | 120GB | $60 | 2vCore | 3.6GHz | 8GB | 10000GB | 3858KB/s |
※CPUの動作周波数はプランには明記されていないが、cat /proc/cpuinfo
の結果を貼った。
実際に@ProjectCBWで運用している限りでは、
- 大規模なレッドストーン回路を動かすサバイバルマルチプレイサーバ(Vanilla)
- 参加型大人数マルチプレイサーバ(PaperMC)
ではDedicated Cloudのような高クロックのプランが有効だった。
これらを踏まえると、
- 高クロックなデスクトップPCのリソースが余っている場合
Windowsで手軽に建てる
-
そこそこのデスクトップPCが余ってる場合
サブ機にLinuxを入れて建てる -
低クロックなノート、マシンスペックが足りない場合
VPSを契約する -
外部に公開したり、大勢でマルチプレイする
(光ファイバーが這い、サーバが生い茂り、メモリが床から生えてくるような逸般の誤家庭でない限り)VPSを契約する
用意するもの 見出しにジャンプ
-
Visual Studio Code(以下VSCode)
Microsoft製。エディタ戦争を起こすつもりはないが、メモ帳やワードパッド、サクラエディタを使っているなら非効率極まりないので即インストール。
同じくMicrosoftのRemote Development拡張機能を導入することで、SSHクライアントにもなる。
以降の解説はVSCodeの機能を利用してより簡単に構築を進めるので、入れましょう。 -
Windows Subsystem for Linux(以下WSL)
Microsoft製。Windows上でLinuxを動かせるやつ。
即必要って訳じゃないけど、使わないと話にならない部分がなくはないので、入れておくとよい。 -
Linuxサーバ
余ったPCを使っても、VPSを借りても良い。
Ubuntu 20.04 LTSをベースに進めるので、初めての方・特に拘りがなければ同じOS・バージョンにしておくと、躓きにくくなる。
Linux環境構築 見出しにジャンプ
Windowsマシン上のWSLで動かす 見出しにジャンプ
WSLのパフォーマンスには期待できないので、あくまで"別のLinuxサーバで動かすためのテスト用"です。
VPSを契約する前にLinuxを試しておきたい、本番環境とは別の開発用に使う、といった用途です。
- Windowsの機能の有効化または無効化でWindows Subsystem for Linuxを有効にする
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
- Microsoft StoreでUbuntuをインストール
Set-Location ~/Downloads
Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing | Add-AppxPackage
Win
- R
-> wsl
やubuntu
を打って実行するとWSLが立ち上がる
https://docs.microsoft.com/en-us/windows/wsl/install-manual#downloading-distros
https://qiita.com/moriai/items/850ee91d60edc91e7b7e
https://wiki.ubuntu.com/WSL
サブPCにLinuxを入れて動かす 見出しにジャンプ
"Ubuntu Server LTS"で検索してください。
VPS Vultrで動かす 見出しにジャンプ
プランには帯域幅/月の表記があるが、実際は時間毎に計算される。
https://www.vultr.com/resources/faq/#bandwidthhourly
超過すると余計に課金されるため、大きなデータ転送を行う時は、Minecraftサーバが快適に動く条件の表にあるように、rsyncの--bwlimit
等で帯域を絞った方が良い。
bwlimit(KB/s) = Bandwidth(GByte) x 1000(MByte) x 1000(KByte) / 30(day) / 24(hour) / 60(min) / 60(sec)
5000x1000x1000/30/24/60/60
SSHでクライアントPCからサーバを遠隔操作する 見出しにジャンプ
サブPCにLinuxを入れて動かすにしろ、VPSで動かすにしろ基本的にクライアントPC(普段お使いWindowsマシンなど)からSSHして遠隔操作するのが基本。
そもそもLinuxはWindowsと違い、CLI(コマンドラインインターフェース)で完結する設計になっているので、直接操作したり、リモートデスクトップをする必要はない。
VSCodeのインストール 見出しにジャンプ
クライアントPCがWindows 10 1903以降であることを前提に進めます。
バージョンが異なる場合、手順や挙動が若干変わります。
まず、SSHに使うクライアントを選びインストールする。
私の場合は、
- WSLで鍵の生成、.ssh/config、rsync、Git
- 鍵はVSCode Remote Development、PowerShell Remoting over SSH用にWindowsにも複製
- VSCode Remote DevelopmentでSSH、開発
- pwsh + WSL rsyncで自動バックアップ
という少々複雑な環境になっているが、趣旨から逸れるので取り敢えず
- VSCode
- VSCode Remote Development (拡張機能)
だけでよい。
ssh-keygenで鍵ペアを作成 見出しにジャンプ
ssh-keygen
で秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)の鍵ペアを生成する。
既定値のRSAは脆弱なので、より強力な方式Ed25519を選択する。
Windows10 1903ではOpenSSH クライアントがプリインストールされていると思いますが、それ以前では
設定 -> アプリ -> アプリと機能 -> オプション機能
で追加する必要があります。
-
VSCodeで
Ctrl
-Shift
-`
でターミナル(既定値ではPowerShell)を起動します。 -
WindowsのOpenSSHが参照する場所にカレントディレクトリを移動します。
PS C:\Users\sbn> cd ~/.ssh PS C:\Users\sbn\.ssh> ssh-keygen -t ed25519
-
ssh-keygen
でEd25519を明示します。RSAはダメです。ssh-keygen -t ed25519
-
秘密鍵の保存ファイルパスを指定します。
普通に
cmd
を起動していれば、%USERPROFILE%
の部分を抜いた相対パスで構いません。 分からない場合は、()内をコピペして実行してみて下さい。ssh-keygen -t ed25519 Generating public/private ed25519 key pair. Enter file in which to save the key (C:\Users\sbn/.ssh/id_ed25519): hoge_id_ed25519
-
パスフレーズは特に必要がなければ何も入力せずに
Enter
連打で構いません。Enter passphrase (empty for no passphrase): Enter same passphrase again:
-
このように出力されたら成功です。
The key fingerprint is: SHA256:juCqizoe+PRS5ZfGE3xtWwJG8J7DGZ1rIsWEH6SvGTY sbn@HOGE-380119 The key's randomart image is: +--[ED25519 256]--+ | .=+ | | .=+. . | | ..o=+o | | . o=o++.. | | .o .E+O.o+ | |. ....+** +. | |..... .o+. | |oooo | |B=o.. | +----[SHA256]-----+
-
%USERPROFILE%\.ssh
に鍵ペアが生成されている筈です。PS C:\Users\sbn\.ssh> ls ディレクトリ: C:\Users\sbn\.ssh Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/03/09 20:32 216 authorized_keys -a---- 2020/02/24 19:37 411 hoge_id_ed25519 <-- この鍵ペアが生成 -a---- 2020/02/24 19:37 98 hoge_id_ed25519.pub <-- されていれば良い -a---- 2020/02/24 19:37 737 config -a---- 2020/05/02 17:40 4154 known_hosts
- VSCodeで公開鍵(.pub)を開く
code .\id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGDSeHy7DlHIidRfT4aeNmWt/0zZNaWKyMRcchV30ISW sbn@SHIBA-200224
後で使います。
公開鍵(.pub)は見られても問題ありません。Tシャツに印刷しても良い。
秘密鍵は厳重に管理しましょう。
SSH接続(パスワード認証) 見出しにジャンプ
サーバにパスワード認証でSSHする。
ssh ユーザ名@サーバのIPアドレスまたはドメイン
> ssh [email protected]
password: (打っても・ペーストしても表示されない)
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-26-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Sun 03 May 2020 09:20:22 PM JST
System load: 0.05 Processes: 110
Usage of /: 4.2% of 108.25GB Users logged in: 0
Memory usage: 37% IPv4 address for ens3: 202.182.96.243
Swap usage: 0%
* Ubuntu 20.04 LTS is out, raising the bar on performance, security,
and optimisation for Intel, AMD, Nvidia, ARM64 and Z15 as well as
AWS, Azure and Google Cloud.
https://ubuntu.com/blog/ubuntu-20-04-lts-arrives
0 updates can be installed immediately.
0 of these updates are security updates.
Last login: Sun May 3 01:26:58 2020 from XXX.XXX.XXX.XXX
root@SHIBA-190801:~#
SSH接続(公開鍵認証) 見出しにジャンプ
次に、公開鍵認証ができるよう、ssh-keygenで作成した公開鍵をサーバ側に登録する。
# ホームディレクトリ下.sshに移動する
cd .ssh
bash: cd: .ssh: No such file or directory
# ない場合つくる
mkdir .ssh
cd .ssh
# ~/.ssh/authorized_keysに登録
vi authorized_keys
# 確認
cat authorized_keys
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGDSeHy7DlHIidRfT4aeNmWt/0zZNaWKyMRcchV30ISW sbn@SHIBA-200224
vi
エディタはI
キーでInsertモードとなり、文字入力できるようになる。
編集後はEsc
キーを押下し、保存して終了するには:wq
、保存せずに終了するには:q!
。
# SSHセッション終了
exit
クライアント側に戻り、公開鍵認証で再度SSHする。
ssh -i 秘密鍵 ユーザ名@サーバのIPアドレスまたはドメイン
cd ~/.ssh
ssh -i example_id_ed25519 [email protected]
.ssh/config 見出しにジャンプ
クライアント側に新しいファイル.ssh/config
を作成する。
configファイルをつくると、例えばssh sub
だけでSSHできるようになる。ヤバいですねっ!
cd .ssh
code config
Host sub
HostName 192.168.100.5
User root
IdentityFile ~/.ssh/hoge_id_ed25519
IdentitiesOnly yes
Host ex
HostName example.com
User sbn
Port 23456
IdentityFile ~/.ssh/example_id_ed25519
IdentitiesOnly yes
VSCode Remote Developmentもconfigを参照できる。
よくあるエラー 見出しにジャンプ
- 再度SSH接続を試みても鍵認証が失敗しパスワード認証になってしまう場合
# リアルタイムでsudoログを確認
sudo tail -f /var/log/auth.log
# 鍵認証を試みて、アクセス権エラーが出ている場合
Authentication refused: bad ownership or modes for directory /root/.ssh
# .sshディレクトリのパーミッションを変更する
chmod 700 /root/.ssh
# authorized_keysのパーミッションを変更する
chmod 600 ~/.ssh/authorized_keys
cf. https://kana-linux.info/linux/ubuntuのsudo実行ログはどこ?
cf. https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95
cf. https://www.atmarkit.co.jp/ait/articles/1605/23/news020.html
cf. http://katzplus.com/centos-6/ssh/ssh-でログイン時に-authentication-refused/
- 別のユーザがつくった.sshは、chownで所有者を変更しないとPermission Deniedになる
chown -R username .ssh
cf. http://okdtsk.hateblo.jp/entry/20111218/1324239928
- REMOTE HOST IDENTIFICATION HAS CHANGED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# known_hostsから削除
ssh-keygen -R XX.XX.XXX.XXX
cf. https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938
- UNPROTECTED PRIVATE KEY FILE!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
まっさらな環境ではじめてこれが出るならクリーンインストールしよう。
WSLの鍵はPermission的に共有できないよ。
sshd_configの設定 見出しにジャンプ
パスワード認証の無効化やポートの設定等を必ず行う。
sudo code /etc/ssh/sshd_config
# ポートの変更
Port 23456
# パスワード認証でのログインを禁止する
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
# Powershell Remorting over SSHへの対応(使う場合)
# override default of no subsystems
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile
# sshdの状態を確認
sudo systemctl status sshd
# 再起動
sudo systemctl restart sshd
cf. https://docs.microsoft.com/ja-jp/powershell/scripting/learn/remoting/ssh-remoting-in-powershell-core?view=powershell-6
cf. https://qiita.com/shuthimaru/items/2334f63845d8b0d85bdd
クライアントとサーバ間のファイル送受信 見出しにジャンプ
サーバとのファイルのやり取りは主にrsync
やscp
を使用する。
SSH | 帯域制限 | 差分・増分転送 | |
---|---|---|---|
rsync | O | O | O |
scp | O | O | X |
ネットワークを経由し、ストレージに書き込みが発生する以上、差分転送は実質的に必須条件になるため、rsyncを推奨する。
他にもrsyncはいいことが盛り沢山なので、使わない手はない。
https://stackoverflow.com/questions/20244585/how-does-scp-differ-from-rsync
rsync 見出しにジャンプ
サーバとのファイルのやり取りはrsyncを使用する...のがベスト。
残念ながらWindowsにはなくWSLを使うことになるので、SSHよくわからん状態の方はscpで手応えを得てからでも良い。
rsync -e 'ssh -p ポート番号 -i 秘密鍵' オプション 送り元 送り先
※残念ながら.ssh/config
は使えない
クライアント -> サーバ
- カレントディレクトリのworldフォルダを、サーバの~/Servers/Vanillaの下に送る
rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' -av ./world [email protected]:~/Servers/Vanilla
- worldフォルダの中身を、サーバのworld_newフォルダの中へ送る
rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' -av ./world/ [email protected]:~/Servers/Vanilla/world_new/
- クライアント側にないファイルをサーバからも削除する
rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' -av --delete ./world/ [email protected]:~/Servers/Vanilla/world_new/
サーバ -> クライアント
- 2048KB/sに帯域制限してサーバからクライアント(WSLから見た
H:\Backup
)にバックアップする。(サーバにないものは削除する)
rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' --bwlimit=2048 -av --delete [email protected]:~/Servers/Vanilla/world /mnt/h/Backup
- セーブデータとCoreProtectのデータベースを除外して、それ以外をカレントディレクトリにバックアップする
rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' --exclude='world/' --exclude='plugins/CoreProtect/database.db' -av --delete --delete-excluded [email protected]:~/Servers/Vanilla .
scp 見出しにジャンプ
scp -P ポート番号 -i 秘密鍵のパス 送信元 送信先
クライアント -> サーバ(アップロード)
デスクトップのstructureをアップロードする例
scp -i ~\.ssh\id_ed25519 .\Desktop\hoge.nbt root@192.168.100.5:~/Servers/structures
サーバ -> クライアント(ダウンロード)
schematicをデスクトップにダウンロードする例
scp -i .\.ssh\id_ed25519 root@192.168.100.5:~/Servers/schematics/hoge.schem .\Desktop
フォルダの場合は-r
(recursive)が必要。
帯域幅を超過し課金されないよう、-l 16384
で転送速度を制限する。
Vanillaのセーブデータをデスクトップにダウンロード(ファイルサイズが大きいため、実行する際は許可をとって下さい)
scp -rp -l 16384 -i .\.ssh\id_ed25519 root@192.168.100.5:~/Servers/Vanilla/world .\Desktop\
cf. https://www.computerhope.com/unix/scp.htm
cf. https://qiita.com/koara-local/items/777f2a182788a7310fcd
パッケージの更新 見出しにジャンプ
# アップグレード可能なパッケージを表示
apt list --upgradable
# パッケージのアップデート・アップグレード
sudo apt update && sudo apt upgrade -y
# ゴミ掃除 ログにやっておけと書かれてたら
sudo apt autoremove -y
# 必要であれば再起動
sudo shutdown -r now
cf. https://linuxfan.info/ubuntu-18-04-basic-settings
タイムゾーンの設定 見出しにジャンプ
cronの実行時刻やMinecraftのログがズレるので日本に設定する。
cf. https://qiita.com/zaki-lknr/items/cd9844fa6a1efa58cab1
# 日付、タイムゾーンの確認
date
Thu Mar 14 07:58:23 UTC 2019
timedatectl
Local time: Thu 2019-03-14 07:59:35 UTC
Universal time: Thu 2019-03-14 07:59:35 UTC
RTC time: Thu 2019-03-14 07:59:36
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
# 東京を探す
timedatectl list-timezones | grep -i tokyo
Asia/Tokyo
# 東京に設定
timedatectl set-timezone Asia/Tokyo
JDKのインストール 見出しにジャンプ
Vanilla、Spigot、Fabricでは大抵Oracle OpenJDK 14などの最新のOpenJDKが使用できるが、
PaperMCでは現在OpenJDK 13、fabric-carpetではOpenJDK 8が要件になる。
OpenJDK 14 見出しにジャンプ
2020年現在、公開のMinecraftサーバに使用するJDKとして、Oracle OpenJDK(Oracle JDKではない!)を使用しても問題ない。
Oracle JDK のライセンスに関する重要な変更
2019年4月16日のリリースより、Oracle JDKのライセンスが変更されました。 新しいライセンス、Oracle Technology Network License Agreement for Oracle Java SEは、これまで提供してきた過去のバージョンのJDKのライセンスと大きく異なります。新しいライセンスでは、個人での利用や開発での利用などには無償で使用できます。しかし、以前のOracle JDKライセンスで許可されていたその他の目的には使用できなくなっている可能性があります。これらの製品をダウンロード、使用する前にライセンスの内容を十分にご確認ください。 FAQも合わせてご確認下さい。
商用ライセンスおよびサポートは低コストのJava SE Subscriptionでご利用いただけます。
また、オラクルは jdk.java.net で最新のOpenJDKリリースをオープンソースの GPL ライセンスで提供しています。
上記は Oracle JDK(Oracle Java SE) のライセンスが「個人での利用や開発での利用などには無償」についての記述であり、jdk.java.netの OpenJDK リリースの話ではない。
無償で Oracle Java SE バイナリを入手していた企業や組織の場合、jdk.java.net から入手可能なオクラルの OpenJDK リリースにより無償利用を継続できます。個人利用や開発用途として無償で Oracle Java SE バイナリを入手していたのであれば、Oracle Java SE リリースをjava.com (個人ユーザー向け)や Oracle Technology Network (“OTN”) (開発者向け) から引き続き入手できます。Oracle JDK や Oracle JRE をその他の用途で利用する場合、Java SE Subscription が必要となります。オラクル製品のサポートをお持ちのお客様は、My Oracle Support (MOS) 、 Oracle Software Delivery Cloud 、またはその他所定の場所から、引き続き Oracle Java SE バイナリを入手可能です。
このように、「無償で Oracle Java SE バイナリを入手していた企業や組織」が「jdk.java.net から入手可能なオクラルの OpenJDK リリースにより無償利用」する分にはまったく問題ない。
と読み取れるが、「それ違反だよ!」という場合はTwitter @shibanyan_1へこっそり教えていただけると嬉しい。
他にも、OpenJDKには複数のディストリビューションが存在し、中身も若干異なるため挙動が違ったりする。
Latest release | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries
Download Java for Azure - New - Azul Systems, Inc.
参考
OpenJDK(Open Java Development Kit) どれを使ったら良い? - ts0818のブログ
# カレントディレクトリ
cd /usr/lib/jvm
# 無ければディレクトリ作成
sudo mkdir /usr/lib/jvm
# OpenJDK のダウンロード (AdoptOpenJDKの例 URLはブラウザ等でリンクをコピーして置き換える)
wget https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.1%2B7/OpenJDK14U-jdk_x64_linux_hotspot_14.0.1_7.tar.gz
# そこへ展開
sudo tar -xvf OpenJDK14U-jdk_x64_linux_hotspot_14.0.1_7.tar.gz
# 確認
ls
# jdk-14.0.1+7 OpenJDK14U-jdk_x64_linux_hotspot_14.0.1_7.tar.gz
# シンボリックリンク作成
sudo ln -s /usr/lib/jvm/jdk-14.0.1+7/bin/java /usr/bin/java
# sudo ln -s /usr/lib/jvm/jdk-14.0.1+7/bin/jps /usr/bin/jps
# sudo ln -s /usr/lib/jvm/jdk-14.0.1+7/bin/jstat /usr/bin/jstat
# 確認
java -version
# openjdk version "14.0.1" 2020-04-14
# OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.1+7)
# OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.1+7, mixed mode, sharing)
cf. https://qiita.com/charon/items/af0f0de2ae9adbc03bfe
cf. https://www.linuxuprising.com/2019/01/how-to-install-openjdk-11-in-ubuntu.html
cf. http://charleysdiary.hatenablog.com/entry/2018/12/27/013605
cf. https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f
OpenJDK 8 見出しにジャンプ
# aptでインストール
sudo apt install openjdk-8-jre
# デフォルトのjavaのバーションを確認
java -version
# openjdk version "1.8.0_252"
# OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1ubuntu1-b09)
# OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
update-alternatives 見出しにジャンプ
複数バージョンのJDKを使用する場合、update-alternatives
で管理するとよい。
実際には、java
(/usr/bin/java
)としてOpenJDK 14/usr/lib/jvm/jdk-14.0.1+7/bin/java
を使いながらOpenJDK 8を使う場合、/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
とフルパスを指定することになるので、必須ではない。
update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-14.0.1+7/bin/java 1111
1111
の数字が大きい方が優先される
update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/jdk-14.0.1+7/bin/java 1111 auto mode
1 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode
2 /usr/lib/jvm/jdk-14.0.1+7/bin/java 1111 manual mode
Press <enter> to keep the current choice[*], or type selection number:
firewallの設定 見出しにジャンプ
VPSやVMではLinux上でのファイアウォールが無効で、VPSのWebコンソールやホストマシン側でファイアーウォールを設定する場合もある。
# ufwが動作しているか確認
sudo ufw status
# Status: inactive
# ufwを有効化する
sudo ufw enable
# ufwを無効化する(既に有効化されていた場合、基本的には無効化してはダメ)
sudo ufw disable
# SSH用の22番ポートを許可する例
sudo ufw allow 22/tcp
# Minecraft Bedrock Editionサーバ用のポートを許可する例
sudo ufw allow 19132/tcp
# Minecraft Java Editionサーバに使用するような25560~25565を許可する例
sudo ufw allow 25560:25569/tcp
# 番号付きでufwのルールを表示する
sudo ufw status numbered
# 番号指定でルールを削除する
sudo ufw delete 6
crontabの設定 見出しにジャンプ
sudo code /etc/crontab
MAILTO=""
# m h dom mon dow user command
0 6 * * * root /usr/bin/pwsh /root/Servers/AutoBackupWSL.ps1
0 8 * * sun root /usr/bin/pwsh /root/Servers/ScoreBoard.ps1
0 */1 * * * root /usr/bin/pwsh /root/Servers/OptifineNotifier.ps1
*/30 * * * * root /usr/bin/pwsh /root/Servers/MCServerUpdater.ps1
#1-51/10 * * * * root /usr/bin/pwsh /root/Servers/YTNotifier.ps1
0 */1 * * * root /usr/bin/pwsh /root/Servers/GoogleFormsSubscriber.ps1
*/30 * * * * root /usr/bin/pwsh /root/Servers/VultrBillingSubscriber.ps1
0 */1 * * * root /usr/bin/pwsh /root/Servers/LoginSubscriber.ps1
0 5 * * Tue,Sat root /usr/bin/pwsh /root/Servers/regenWorldResource.ps1 end
#crondを再起動(不要だと思う)
sudo systemctl restart cron
Vanilla 見出しにジャンプ
初期設定 見出しにジャンプ
server.jarのダウンロード 見出しにジャンプ
server.jarをMinecraft Launcherから取得 見出しにジャンプ
クライアントにあるMinecraft Launcherの起動構成でダウンロードしたserver.jarをrsyncやscpでサーバに送る。
単一のjarファイル程度なら、VSCodeでフォルダストラクチャの中にD&Dで良いと思う。
server.jarをshで取得 見出しにジャンプ
ダウンロード先をつくって移動
mkdir -p ~/Servers/versions
cd ~/Servers/versions
Mojangからバージョンリストを取得
curl 'https://launchermeta.mojang.com/mc/game/version_manifest.json' -o version_manifest.json
jsonファイルをVSCodeで開く
code version_manifest.json
{"latest": {"release": "1.15.2", "snapshot": "20w18a"}, "versions": [{"id": "20w18a", "type": "snapshot", "url": "https://launchermeta.mojang.com/v1/packages/8d428d8e5a482c253f973a73d5c04ea73d0addd3/20w18a.json", "time": "2020-04-29T15:21:00+00:00", "releaseTime": "2020-04-29T15:16:34+00:00"}, {"id": "20w17a", "type": "snapshot", "url":
...
Alt
- Shift
- F
で整形できる
...
{
"id": "1.15.2",
"type": "release",
"url": "https://launchermeta.mojang.com/v1/packages/97e7f6c94e2f9841d128011d4d9192fabdc874d4/1.15.2.json",
"time": "2020-04-28T06:31:30+00:00",
"releaseTime": "2020-01-17T10:03:52+00:00"
},
...
version_manifest.jsonを参考に、バージョン固有のjsonを取得する
curl 'https://launchermeta.mojang.com/v1/packages/97e7f6c94e2f9841d128011d4d9192fabdc874d4/1.15.2.json' -o 1.15.2.json
VSCodeでserver.jar
を検索し、ダウンロードURLを見つける(整形に時間かかるかも)
...
"assets": "1.15",
"downloads": {
"client": {
"sha1": "e3f78cd16f9eb9a52307ed96ebec64241cc5b32d",
"size": 15531492,
"url": "https://launcher.mojang.com/v1/objects/e3f78cd16f9eb9a52307ed96ebec64241cc5b32d/client.jar"
},
"client_mappings": {
"sha1": "bd9efb5f556f0e44f04adde7aeeba219421585c2",
"size": 4971989,
"url": "https://launcher.mojang.com/v1/objects/bd9efb5f556f0e44f04adde7aeeba219421585c2/client.txt"
},
"server": {
"sha1": "bb2b6b1aefcd70dfd1892149ac3a215f6c636b07",
"size": 36175593,
"url": "https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar"
},
"server_mappings": {
"sha1": "59c55ae6c2a7c28c8ec449824d9194ff21dc7ff1",
"size": 3737122,
"url": "https://launcher.mojang.com/v1/objects/59c55ae6c2a7c28c8ec449824d9194ff21dc7ff1/server.txt"
}
},
...
server.jarをダウンロード
curl "https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar" -o ~/Servers/versions/server-1.15.2.jar
使い終わったjsonを削除
# カレントディレクトリのファイル一覧
ls
1.15.2.jar 1.15.2.json version_manifest.json
# 全てのjsonを削除
rm *.json
# 確認
ls
1.15.2.jar
server.jarをpwshで取得 見出しにジャンプ
#Mojangからバージョンリストのjsonを取得
$Versions = Invoke-WebRequest -Uri 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | ConvertFrom-Json
#結果を見る
$Versions
<#
latest versions
------ --------
@{release=1.14.2; snapshot=1.14.2} {@{id=1.14.2; type=release; url=...
#>
$Versions.latest.release
#1.14.2
#バージョン固有のjsonを取得(例: 最新のリリース)
$Latest = Invoke-WebRequest -Uri ($Versions.versions | Where-Object {$_.id -eq $Versions.latest.release}).url | ConvertFrom-Json
#server.jarのダウンロードURLを取得し、ダウンロード
Invoke-WebRequest -Uri $Latest.downloads.server.url -OutFile ~/Servers/versions/server-1.14.2.jar
シンボリックリンクの作成 見出しにジャンプ
server.jarをダウンロードした場所に移動します。
cd ~/Servers/versions
server.jarを直接使っても良いが、バージョン管理のためserver-バージョン.jar
にシンボリックリンクを張る運用がオススメ。
~/Servers/ +--Vanilla | +--crash-reports | +--debug | +--logs | +--world | +--banned-ips.json | +--banned-players.json | +--eula.txt | +--ops.json | +--ops.txt.converted | +--server.jar -------------------------+ | +--server.properties | | +--usercache.json | | +--whitelist.json 参照 +--versions | | +--server-1.14.4.jar | | +--server-1.15.2.jar <-----------------+ +--msl.ps1
# シンボリックリンクを作成 ln -s ../versions/server-1.15.2.jar server.jar # 確認 ls -la lrwxrwxrwx 1 1001 1001 29 Aug 9 2019 server.jar -> ../versions/server-1.15.2.jar # シンボリックリンクを上書き ln -sf ../versions/server-1.14.4.jar server.jar
初回起動 見出しにジャンプ
cd ~/Servers/Vanilla
java -jar ./server.jar
この時点ではサーバは起動しません。
eula.txtの編集 見出しにジャンプ
VSCode等のテキストエディタでfalseをtrueに書き換えて保存します(tureじゃないよ!)。
MINECRAFT エンド ユーザー ライセンス条項に目を通しておきましょう。
code eula.txt
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Wed Jul 18 04:41:13 UTC 2018
eula=true
server.propertiesの設定 見出しにジャンプ
code server.properties
設定項目 | 解説 | |||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
pvp=true | プレイヤー同士で殴ることを許可するかの設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
level-type=default | flat 、legacy 、default から選べます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
hardcore=false | 難易度とは別に、リスポーンしてサバイバル等を再開できなくするモードがあります。 所謂"ハードコア"は hardcore=true 且つdifficulty=hard であることを指すようです。新しいバージョンでは死んでしまってもスペクテイターで閲覧は可能のようです。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
enable-command-block=true | コマンドブロックを許可するかどうかを指定します。 | |||||||||||||||||||||||||||||||||||||||||||||||||
allow-flight=false | クリエイティブ飛行を許可するかの設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
level-name=world | ワールドデータのディレクトリ名を指定します。 | |||||||||||||||||||||||||||||||||||||||||||||||||
view-distance=10 | ||||||||||||||||||||||||||||||||||||||||||||||||||
entity-broadcast-range-percentage=100 | ||||||||||||||||||||||||||||||||||||||||||||||||||
generator-settings= | ||||||||||||||||||||||||||||||||||||||||||||||||||
force-gamemode=false | true の場合、ログイン時にゲームモードが強制されます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
allow-nether=true | false の場合、ネザーポータルが使えなくなります。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
gamemode=creative | プレイヤーの初回ログイン時、force-gamemode=true の場合毎ログイン時のゲームモードを設定します。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
difficulty=normal | 難易度を設定します。 この設定はクライアント側のEsc画面に表示されます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
generate-structures=true | 構成物を生成するかの設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
spawn-monsters=true | Mobのスポーンを許可するかの設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
spawn-npcs=true | NPC(村人等)のスポーンを許可するかの設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
spawn-animals=true | false の場合、動物がスポーンしなくなります。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
spawn-protection=0 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||
white-list=true | ホワイトリスト(登録したプレイヤーのみ許可)の有効/無効の設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
enforce-whitelist=false | true の場合、whitelist reload コマンドでホワイトリストを更新した時に、ホワイトリストから削除されたプレイヤーをログアウトさせます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
player-idle-timeout=0 | プレイヤーがAFK状態になってから何分でkickするかの設定です。0 でAFKキックを無効化します。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
max-players=20 | プレイヤーの最大接続数を指定します。 | |||||||||||||||||||||||||||||||||||||||||||||||||
max-world-size=29999984 | 29999984 より大きくしても無視されます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
max-tick-time=-1 | 処理が遅れるtick数を制限して、閾値を超えるとサーバが停止するようになっています。 超高負荷を掛ける必要があり勝手に止まっては困る場合、 -1 で回避できます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
enable-query=false | true の場合、UT3 query protocolを使用して、サーバに関する情報を取得できるようになります。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
query.port=25562 | ||||||||||||||||||||||||||||||||||||||||||||||||||
enable-rcon=false | true の場合、rconプロトコルを使用してMinecraftサーバと通信できます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
rcon.port=25575 | ||||||||||||||||||||||||||||||||||||||||||||||||||
rcon.password= | ||||||||||||||||||||||||||||||||||||||||||||||||||
broadcast-console-to-ops=true | op全員にコンソールで実行されたコマンド内容を送信します。 | |||||||||||||||||||||||||||||||||||||||||||||||||
broadcast-rcon-to-ops=true | op全員にrconコンソールで実行されたコマンド内容を送信します。 | |||||||||||||||||||||||||||||||||||||||||||||||||
op-permission-level=4 | 1 opはspawn-protection を回避できます。2 opは/publish /debug 以外のほぼ全てのコマンド、コマンドブロックを使用できます。3 opは/ban /op を使用できます。4 opは/stop /save /save-on /save-off を含む全てのコマンドを実行できます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
function-permission-level=2 | ||||||||||||||||||||||||||||||||||||||||||||||||||
server-ip= | 127.0.0.1 を指定すると自分以外のLAN内の別のマシンから接続できなくなります。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
server-port=25562 | サーバのポート番号を指定します。 複数のMinecraftサーバを立てる場合はポートを変えてください。 デフォルトは 25565 です。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
online-mode=true | MCIDをMojangに照会するかの設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
max-build-height=256 | 高度限界を設定します。 | |||||||||||||||||||||||||||||||||||||||||||||||||
level-seed= | ワールド生成時のシード値を設定します。 | |||||||||||||||||||||||||||||||||||||||||||||||||
snooper-enabled=false | Mojangへサーバの統計情報を送信するかの設定です。 | |||||||||||||||||||||||||||||||||||||||||||||||||
network-compression-threshold=256 | -1 で圧縮を無効化、0 で全て圧縮されます。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
resource-pack= | : と= を\ でエスケープする必要があります。http\://example.com/hoge.zip?hoge\=hoge |
|||||||||||||||||||||||||||||||||||||||||||||||||
resource-pack-sha1= | ||||||||||||||||||||||||||||||||||||||||||||||||||
use-native-transport=true | ||||||||||||||||||||||||||||||||||||||||||||||||||
prevent-proxy-connections=false | true では、サーバから送信されたプレイヤーのISPやASの情報がMojangの認証サーバからのものと異なる場合、プレイヤーは弾かれます。VPNやプロキシが使えなくなります。false では、プレイヤーがVPNやプロキシを使ってサーバに接続することを許可します。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
enable-status=true | true では、今まで通りクライアントのサーバリストにオンライン状態を表示します。false では、常にオフライン表示に偽装されますが、ログインは可能です。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
enable-jmx-monitoring=false | net.minecraft.server:type=Server と averageTickTime tickTimes 属性を公開し、MSPT(MilliSeconds Per Tick)を公開します。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
motd=A Minecraft Server |
https://minecraft.gamepedia.com/Server.properties
screen, tmux 見出しにジャンプ
初回起動はSSHセッションのコンソール内でjavaプロセスを実行している状態なので、SSHセッションを終了するとMinecraftサーバが停止してしまいます。
SSHを切断してもMinecraftサーバのプロセスを維持しMinecraftサーバコンソールへの接続を行うには、screen
やtmux
を使用します。
Minecraftサーバの起動
# screenを使う場合
screen -DmS Vanilla /usr/bin/java -jar server.jar
# tmuxを使う場合(推奨)
tmux new-session -ds Vanilla /usr/bin/java -jar server.jar
セッション一覧を確認
screen -ls
There is a screen on:
1302.Vanilla (05/05/2020 09:43:27 PM) (Detached)
1 Socket in /run/screen/S-root.
tmux ls Vanilla: 1 windows (created Wed Jul 29 19:32:34 2020)
Minecraftサーバのコンソールを覗く(アタッチ), コンソールから出る(デタッチ)
# アタッチ
screen -r Vanilla
# (誰かが既にアタッチしている場合)重複アタッチ
screen -x Vanilla
# デタッチ
# Ctrl + a を2度押すとscreenコンソールが操作不能になるので注意 要するにtmuxを使うべき
Ctrl + a -> Ctrl + d
tmux attach-session -t Vanilla tmux a -t Vanilla Ctrl + b -> d
外部からMinecraftコンソールへコマンドを実行
# プレイヤー一覧
screen -p 0 -S "Vanilla" -X eval "stuff 'list'\\015"
tmux send-keys -t "Vanilla" "list" ENTER
# sayでチャットを送る (再起動アナウンスの例)
screen -p 0 -S Vanilla -X eval 'stuff "say\\040The\\040server\\040shuts\\040down\\040after\\04010\\040seconds."\\015'
tmux send-keys -t "Vanilla" "say The server shuts down after 10 seconds." ENTER
# セーブ・Minecraftサーバの停止
screen -p 0 -S Vanilla -X eval "stuff 'stop'\\015"
tmux send-keys -t "Vanilla" "stop" ENTER
Discordへ通知できるMinecraftサーバ管理スクリプト
Man page of SCREEN
Tmux Cheat Sheet & Quick Reference
Minecraftサーバ起動中のバックアップ 見出しにジャンプ
Minecraftサーバは、メモリからストレージへ定期的にオートセーブを行いますが、バックアップを走らせた時点でセーブデータがそれ単体で正常に動作する、整合性の取れたものとは限りません。
Minecraftサーバ実行中にバックアップするとき、下記の手順を踏まければセーブデータが破損した状態でバックアップされる・バックアップにならない場合があります。
save-off
でオートセーブを無効化save-all flush
で強制的にオンメモリのデータをストレージへセーブrsync
等を走らせる- バックアップが終わったら
save-on
でオートセーブを再開させる
screen -p 0 -S Vanilla -X eval 'stuff "save-off"\\015'
screen -p 0 -S Vanilla -X eval 'stuff "save-all\\040flush"\\015'
rsync ~~
screen -p 0 -S Vanilla -X eval 'stuff "save-on"\\015'
とは言え、バックアップは起動中ではなくstopコマンドで停止してから、が一番確実です。
Minecraftサーバコマンド 見出しにジャンプ
# プレイヤ一覧
list
# アナウンス例
say server restart
# Minecraftサーバのセーブ・停止
stop
# whitelistに追加、削除
whitelist add Shibanyaan
whitelist remove Shibanyaan
# opに追加、削除
op Shibanyaan
deop Shibanyaan
# 撮影用のスペクテイター切替
gamemode spectator nyanshiba
gamemode survival nyanshiba
JVMの引数 見出しにジャンプ
JVMの引数をチューニングすると、より良いパフォーマンスを発揮できます。
システムメモリ > Xmx
+ MaxMetaspaceSize
になるよう余裕を持って設定します。
java -server -Xms24G -Xmx24G -XX:MaxNewSize=6G -XX:MetaspaceSize=6G -XX:MaxMetaspaceSize=6G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=12 -XX:ConcGCThreads=12 -XX:+DisableExplicitGC -jar server.jar
java -server -Xms12G -Xmx12G -XX:MaxNewSize=3072M -XX:MetaspaceSize=3072M -XX:MaxMetaspaceSize=3072M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:+DisableExplicitGC -jar server.jar
java -server -Xms6G -Xmx6G -XX:MaxNewSize=1536M -XX:MetaspaceSize=1536M -XX:MaxMetaspaceSize=1536M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=4 -XX:+DisableExplicitGC -jar server.jar
https://software.fujitsu.com/jp/manual/manualfiles/m170006/b1ws1303/01z200/b1303-00-11-01-06.html
Fabric 見出しにジャンプ
Fabricは、スナップショットの時点から新しいバージョンに対応されるほど開発が盛んな、Vanilla準拠のMinecraftの改造ツールチェーン。
レッドストーン回路やトラップの検証に欠かせないCarpet Mod、大規模建築を効率よく進めるのに役立つWorldEditも対応している。
Fabricサーバを建てることで、プレイヤーがそれぞれModを導入する必要もなく、これらの改造の恩恵を受けられる。
https://fabricmc.net/use/ で"Server"を選択し、Universal版のインストーラをダウンロード。
curl https://maven.fabricmc.net/net/fabricmc/fabric-installer/0.5.2.39/fabric-installer-0.5.2.39.jar -o fabric-installer-0.5.2.39.jar
https://fabricmc.net/wiki/install の通り、Fabric Installerを実行してサーバの実行ファイルfabric-server-launch.jar
を生成する。
# Fabric Installerを実行
java -jar fabric-installer-0.5.0.33.jar server
#Mon Aug 26 19:49:12 JST 2019
serverJar=server.jar
他の手順はVanillaと一緒。
FabricへModを導入する 見出しにジャンプ
Carpet Mod、Fabric API、WorldEdit、必要であればMaLiLib、Bounding Box Outline Reloadedを導入する。
# modsへ移動して
cd mods
# そこにダウンロードするだけ(例)
wget https://github.com/gnembon/fabric-carpet/releases/download/v1.3-frozen/fabric-carpet-1.15.1-1.3.1+v191212.jar
wget https://media.forgecdn.net/files/2844/436/fabric-api-0.4.25%2Bbuild.282-1.15.jar
wget 'https://ci.enginehub.org/repository/download/bt10/13391:id/worldedit-fabric-mc1.15.1-7.1.0-SNAPSHOT-dist.jar?branch=master&guest=1'
wget https://media.forgecdn.net/files/2744/842/malilib-fabric-1.14.4-0.10.0-dev.20.jar
wget https://media.forgecdn.net/files/2758/498/BBOutlineReloaded-1.0.13-1.14.4-fabric.jar
このように、server.jarやfabric.jarだけでなく、structuresやschematicsもシンボリックリンクで纏めるとアクセスし易いのでオススメ。
~/Servers/ +--Fabric | +--config | | +--worldedit | | | +--schematics -> ~/Servers/schematics | | | +--sessions | | | +--worldedit.properties | +--logs | | +--2019-05-28-1.log.gz | | +--2019-05-28-2.log.gz | | +--... | | +--latest.log | +--mods | | +--fabric-carpet-1.15.2-1.3.6+v200121.jar | | +--worldedit-fabric-mc1.15.1-7.1.0-SNAPSHOT-dist.jar | +--world1 | | +--advancements | | +--data | | +--datapacks | | +--DIM-1 | | +--DIM1 | | +--generated | | | +--minecraft | | | | +--structures -> ~/Servers/structures | | +--playerdata | | +--poi | | +--region | | +--stats | | +--carpet.conf | | +--icon.png | | +--session.lock | +--world2 | | +--generated | | | +--minecraft | | | | +--structures -> ~/Servers/structures | | +--... | +--banned-ips.json | +--banned-players.json | +--eula.txt | +--fabric-server-launcher.properties | +--fabric.jar -> ../versions/fabric-server-launch.jar | +--ops.json | +--server.jar -> ../versions/server-1.15.2.jar | +--server.properties | +--usercache.json | +--whitelist.json +--schematics | +--*.schem | +--*.schematic +--structures | +--*.nbt +--versions | +--fabric-installer-0.5.2.39.jar | +--fabric-server-launch-1.14.4.jar | +--fabric-server-launch.jar | +--server-1.14.4.jar | +--server-1.15.2.jar +--msl.ps1
また、Modによっては最新のJDKに対応していない場合も多いので、その場合はOpenJDK 8を使用する。
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
Spigot 見出しにジャンプ
Spigotは、Vanillaの動作からかなり手が加えられたCraftBukkitベースの改造されたMinecraftサーバであり、多様なプラグインがあるのが特徴。
荒らし対策プラグインCoreProtectや軽量化プラグインClearlag、Vanillaでは難しい複雑な権限管理が行えるLuckPermsや複数のサーバを接続するプロキシBungeeCordなど、大規模マルチプレイサーバの運営ならSpigot一択である。
Spigotをビルドする 見出しにジャンプ
Spigotはビルド済みバイナリを配布していないので、自分でビルドする必要がある。
Windowsでもビルドツールに同梱されているPortable Gitでビルド可能だが、WSLやLinuxには初めからGitが入っているので、そちらで実行するのが早い。
作業ディレクトリに移動
cd /tmp
ビルドツールをダウンロード https://www.spigotmc.org/wiki/buildtools
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
ビルドツールの実行
# 最新安定版
java -jar BuildTools.jar --rev latest
# バージョン指定
java -jar BuildTools.jar --rev 1.15.2
~~
Success! Everything completed successfully. Copying final .jar files now.
Copying spigot-1.15.2-R0.1-SNAPSHOT.jar to /tmp/./spigot-1.15.2.jar
- Saved as ./spigot-1.15.2.jar
# 確認
ls *.jar
BuildTools.jar spigot-1.15.2.jar
PaperMC 見出しにジャンプ
PaperMCはよりパフォーマンスに重点を置いたSpigotの派生サーバであり、Spigotプラグインと互換性があります。
https://papermc.io/downloads からPaperサーバの実行ファイルをダウンロード
cd ~/Servers/versions
curl https://papermc.io/api/v1/paper/1.14.4/243/download -o paper-243-1.14.4.jar
Minecraftサーバのアップデート 見出しにジャンプ
- サーバを止めて
- バックアップして(バックアップせずにアップデートは論外)
- 新しいバージョンのserver.jarをダウンロードし、入れ替えて(シンボリックリンク張り直して)
- 下記のように、server.jarに対するアップデート最適化の引数を組み合わせた、ヒープサイズの指定を除いたJVM引数を実行して
java -server -jar server.jar --forceUpgrade --eraseCache
- 普段のJVM引数で起動し直す
IPアドレスではなく、example.comで入れるようにする 見出しにジャンプ
ドメインを購入(¥1,500/年 程度)し、DNSを設定する。
Google Domainsのカスタムリソースレコードの例 | |||
---|---|---|---|
名前 | タイプ | TTL | データ |
vanilla | A | 1h | (サーバのグローバルIPアドレス) |
fabric | A | 1h | (サーバのグローバルIPアドレス) |
この例では、サーバアドレスはvanilla.example.com
やfabric.example.com
になる。
cf. https://ascii.jp/elem/000/000/458/458858/
cf. https://wa3.i-3-i.info/word12301.html
cf. https://gadget-tips.com/google-domains-dns/
cf. http://fujiike.hateblo.jp/entry/2015/09/14/191934
Discordへ通知できるMinecraftサーバ管理スクリプト msl.ps1 見出しにジャンプ
- 複数のサーバの設定を一括管理できる
- コマンド一行でサーバにメッセージやコマンドを送れる
- Minecraftサーバ起動中のバックアップを容易にする
- WebhookでDiscordに通知できる(上の画像)
Powershellのインストール・設定 見出しにジャンプ
msl.ps1はLinux・Windows双方に対応しています。
PowerShell 7以降に対応しています。
(Ubuntu 18.04)
cf. https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7
# Move to /tmp
cd /tmp
# Download the Microsoft repository GPG keys
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
# Update the list of products
sudo apt update
# Install PowerShell
sudo apt install -y powershell
# Start PowerShell
pwsh
公式にサポートされていない Linux ディストリビューションの場合(Ubuntu 20.04)
cf. https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7#binary-archives
# Download the powershell '.tar.gz' archive
curl -L -o /tmp/powershell.tar.gz https://github.com/PowerShell/PowerShell/releases/download/v7.0.0/powershell-7.0.0-linux-x64.tar.gz
# Create the target folder where powershell will be placed
mkdir -p /opt/microsoft/powershell/7
# Expand powershell to the target folder
tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/7
# Set execute permissions
chmod +x /opt/microsoft/powershell/7/pwsh
# Create the symbolic link that points to pwsh
ln -s /opt/microsoft/powershell/7/pwsh /usr/bin/pwsh
msl.ps1の設定 見出しにジャンプ
グローバル設定に各サーバ毎の設定が上書きする形になるので、共通の項目はグローバル設定に記述すると各サーバの設定を省けます。
プロファイル名。
コマンド実行時に使用し、Linuxではscreen名、WindowsではMainWindowTitle名になる。
Name = "CBWSurvival"
実行ファイルのパス。
Linuxではscreen
、Windowsでは"C:\jdk-14.0.1\bin\java.exe"
(例)を指定する。
File = "/usr/bin/screen"
JVM引数 値は各環境のRAMの量、CPUコア数に見合った値にする。
Linuxではscreen
プロセス内でjava
プロセスを実行するので、下記のようにプロファイル名やjavaのパスを記述する必要がある。
Windowsで既に実行ファイルのパスでjava
を指定している場合、-server -Xms...
以降のみ記述すれば良い。
Arg = "-DmS CBWSurvival /usr/bin/java -server -Xms7G -Xmx7G ... -jar server.jar"
Arg = "-DmS CBWLab /usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java -server -Xms4G -Xmx4G ... -jar fabric.jar"
WorkingDirectoryの場所を指定する ここがカレントディレクトリの状態でFile、Argのプロセスが実行される
Dir = "/root/Servers/CBWSurvival"
Windowsのみ ProcessWindowStyleを指定する(Hidden、Maximized、Minimized、Normal)
Window = 'Minimized'
Webhook時のusername(Discordのみ)
UserName = "Dedicated CBWSurvival"
DiscordへのWebhook時に使用するIconを設定する(この画像リンクはDiscordサーバへ追加した絵文字から)
Icon = "https://cdn.discordapp.com/emojis/604360349461774336.png"
hookUrl = 'https://discordapp.com/api/webhooks/XXXXXXXXXX' #Project:CBW server-info
msl.ps1の使い方 見出しにジャンプ
# サーバ起動
pwsh msl.ps1 CBWSurvival start
# サーバ停止(プレイヤーへのアナウンス・タイムアウトあり)
pwsh msl.ps1 CBWSurvival stop
# 忙しい人のためのサーバ停止(プレイヤーへのアナウンス・タイムアウトなし)
pwsh msl.ps1 CBWSurvival faststop
# サーバ再起動
pwsh msl.ps1 CBWSurvival restart
# 忙しい人のためのサーバ再起動
pwsh msl.ps1 CBWSurvival fastrestart
# コマンドの実行 (チャットの送信)
pwsh msl.ps1 CBWSurvival "say hogepogepuu"
# コマンドの実行 (セーブ操作)
pwsh msl.ps1 CBWSurvival "save-off"
pwsh msl.ps1 CBWSurvival "save-all flush"
# rsync -av ...
pwsh msl.ps1 CBWSurvival "save-on"
(pwshコンソール限定)複数サーバ同時操作
pwsh
./msl.ps1 CBWSurvival,CBWLab restart
Minecraftサーバのバックアップ 見出しにジャンプ
Minecraftサーバの自動バックアップ 見出しにジャンプ
Minecraftサーバのリモートバックアップの設定例
$Settings +=
@{
#ミラーバックアップリスト
MirList =
@(
#[email protected]
[PSCustomObject]@{
SrcPath = "[email protected]:~/Servers"
SrcClude = "--exclude='Fabric/world/'"
DstPath = "D:\RemoteBackup"
Execute = "-e 'ssh -o StrictHostKeyChecking=no -i ~/.ssh/hoge_id_ed25519' --bwlimit=3858"
Begin =
({
#msl.ps1でsave-off, save-all flushを送る
$ScriptBlock =
({
~/Servers/msl.ps1 -Name CBWSurvival -Action "save-off"
~/Servers/msl.ps1 -Name CBWSurvival -Action "save-all flush"
})
# -o StrictHostKeyChecking=no が出来なさそうなので、The authenticity of host can't be established.でyes/noを聞かれないようにしておくこと
Invoke-Command -ScriptBlock $ScriptBlock -HostName "[email protected]" -KeyFilePath "~/.ssh/hoge_id_ed25519"
})
End =
({
#msl.ps1でsave-onを送る
$ScriptBlock =
({
~/Servers/msl.ps1 -Name CBWSurvival -Action "save-on"
})
Invoke-Command -ScriptBlock $ScriptBlock -HostName "[email protected]" -KeyFilePath "~/.ssh/hoge_id_ed25519"
#バックアップが終わったことを投稿
Send-Webhook -UserName "Shibanyan Server" -Content "192.168.100.5 のリモートバックアップが終わりました" -hookUrl 'https://discordapp.com/api/webhooks/XXXXXXXXXX'
})
}
)
#世代管理バックアップリスト
GenList =
@(
[PSCustomObject]@{
SrcPath = "D:\RemoteBackup"
#SrcClude = "--exclude='Archive/'"
DstParentPath = "D:"
DstGenThold = 180
DstGenExclude = 'RemoteBackup','200310_070002','200611_070002'
}
[PSCustomObject]@{
SrcPath = "$env:APPDATA\.minecraft"
SrcClude = "--include='*.*' --exclude='*/'"
DstParentPath = "D:"
DstChildPath = "/AppData/Roaming"
}
)
}
肥大したセーブデータをtar.bz2・tar.xzで圧縮する 見出しにジャンプ
使用しないセーブデータ等は世代管理するまでもないので、まるっとtarで固めてアーカイブ。
# フォルダ -bzip2-> tar.bz2
tar -cjvf filename.tar.bz2 ./folder
# tar.bz2 -bunzip2-> フォルダ
tar -xjvf filename.tar.bz2
# フォルダ -xz-> tar.xz
tar -cJvf filename.tar.xz ./folder
# tar.xz -unxz-> フォルダ
tar -xJvf filename.tar.xz