どういう記事?
Discordのサーバーでマイクラ鯖を立てようという事になり、ProxmoxのLXC上にマイクラのサーバーを立てたので、その備忘録です。筆者はマイクラを遊んだ事が無く、基礎的な知識が欠落していますのでご留意ください。一応想定プレイヤー人数は全部で10人もいかないだろう、ぐらいで建てました(なので同時にアクセスするのは多くて2,3人想定)。
めっちゃ雑に書いていて、「手順書」ではないので注意してください
環境
- CPU: 8 x Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
- proxmox 8.4.1
- LXC image: Ubuntu 24.04.3 LTS
- LXC RAM: 8GB
- LXC Swap: 4GB
- LXC Cores: 3
サーバーアプリケーションの選定の話
マインクラフトのサーバーアプリケーションには:
- Vanilla: 純正のやつ
- MODサーバー: MODが使えるやつ
- Pluginサーバー: Pluginが使えるやつ
の3種類ぐらいがあるようです(新しいキャラやブロックを追加するならMOD、ゲームシステム自体に変更が必要ならPluginという住み分けのようです)。
今回はJava版と統合版(Bedrock版)のユーザーが一緒に遊べるようにしたく、Geyserというプラグインを使いたかった為、Pluginサーバーの中でメジャーそうなPaperMCを使う事にしました。
参考:
LXCのRAMについては、以下のページで最低でもRAMが6~10GBはあった方が良いと書いてあったので、8GBにしています。
立てていく
step1: LXC自体の準備
自分は、Ubuntuベースでサーバーを立てる時には、ロケールの設定やgitの設定などをshell scriptにしてそれを実行しています。以下はその一部です(全部出すのは、自分の稚拙なshell scriptだと怒られが発生しそうなので止めておきます。適当にLLMにでも作ってもらってください。そっちのが良いと思います)。
storageは30GBほど用意しましたが、これはあんまりよくわかってないからです。
ネットワークについては、LXC自体にもIPアドレスを割り当てています。
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 基本パッケージ更新
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
apt update
apt upgrade -y
apt autoremove -y
apt clean
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# タイムゾーン&ロケール設定
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
timedatectl set-timezone Asia/Tokyo
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# UFW 設定
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw --force enable
ufw status verbose
# などなど....あとはお好みでnvimの設定など
step2: minecraft userの追加
マイクラサーバー自体をrootで実行するわけにもいかないので、sudo権限を持たないminecraftのuserとgroupを作っておきます。
# Minecraftグループを作成
sudo groupadd minecraft
# Minecraftユーザーを作成
# -r: システムユーザーとして作成
# -g: プライマリグループを指定
# -d: ホームディレクトリを指定
sudo useradd -r -g minecraft -d /home/minecraft minecraft
セキュリティの事を考えると、ログインシェルは無い方が良いとは思ってます。
step3: 必要な物のインストール
Java21のinstall
PaperMCの以下のページの説明に従ってJavaをLXCにinstallします。ドキュメントはapt-getですが自分はaptを使いました。まぁ、その辺はお好みで....。
PaperMCのインストール
su minecraft
でスー(ダイアン津田)した後、
このぺージで、PaperMCのjarのリンクをコピーして、/home/minecraft
でwgetしてjarをダウンロードします。
cd /home/minecraft
wget {download url}
すると、jarがdownloadされます。
step4: 一旦動かしてみる
paperMCのドキュメントに従うだけではありますが、startup script generatorでワンライナーが生成出来るので、それを使います。
startup script generatorでメモリの割り当てを選択する項目がありますが、Aikar's flagの説明にある通り、LXCに割り当てたRAMと同じサイズで実行してはたぶん(OS分のメモリまで使って)良くないのでstartup script generatorではメモリは8-1.5=6.5GBを選択しています。
生成されたスクリプトは以下です
java -Xms6656M -Xmx6656M -jar paper-1.21.8-31.jar nogui
これを最初に実行すると、eula.txt云々
みたいなログが出てサーバーがFailします。
この時、同じディレクトリ(つまり/home/minecraft
)にeula.txt
というファイルが生成されているので、好きなエディタを使ってこれの中でtrue
に変えます。
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Thu Aug 14 13:56:30 UTC 2025
eula=true #<-ここ
再度、上記のコマンドを実行すると、サーバーが動くかと思います。
step5: 接続してみる
今回はFirewallとしてUFWを使用しているので、minecraftのdefault portである25565/tcpを開けます
sudo ufw allow 25565/tcp
これでMinecraftのMultiplay画面でIPアドレスを入れれば、接続が出来るかと思います。
(Minecraftを持ってない人は買いましょう。自分は公式HPで買いましたが、MicrosoftアカウントでSign Upしたため、Microsoft Storeでも購入済みになっていて、どっちで買っても同じなんだなってなりました。もしかしたらMojangアカウントの場合との違いはあるのかもしれませんが....)
サーバーの停止は、サーバー側のInteractive shell(?)で
stop
で出来ます。
Pluginのインストール
Geyserのインストール(未検証)
/home/minecraft/plugin
というディレクトリが生成されているので、そこに移動して、wgetでgeyserのjarをdownloadします。ダウンロードリンクは以下のページのspigotのボタンを右クリックで取得できます。
リンク上、spigotという名前になってダウンロードされるので、適当な名前にリネームします。
mv spigot Geyser-Spigot.jar
この状態で再度サーバーを起動すると、/home/minecraft/plugins/Geyser-Spigot
というディレクトリが生成され、その中にconfig.yml
などが生成されています。
MinecraftのPlugin導入においては、このjarとConfig類が入っている同名のディレクトリというセットの構成が一般的な?ようです。
特に今回このConfigは変えていません。
また、Bedrock版とJava版では使用ポート及びプロトコルが異なり、TCPではなくUDPになります。
なのでUFWのルールを追加します。
```shell
sudo ufw allow 19132 /udp
Floodgateのインストール(未検証)
jarを/home/minecraft/plugins/
にダウンロードしてサーバーを起動させると、Configが生成されるところまではGeyserと同じです。
ここで、Geyserのconfig.yml
の中のAuth-type
をonlineからFloodgate
に変更します。
これでBedrock版のユーザーが、Bedrock版の認証でサーバーにアクセスできると信じています。
DiscordSRVのインストール
Githubの最新のリリースからこれも同様にjarをダウンロードします。
DiscordSRV自体がDiscord botとなってサーバーと色々同期をしたりするわけですが、そのあたりのセットアップは公式ドキュメントを読むのが最もわかりやすいです(Discord botの開発経験があると尚良し)
余談ですが、DiscordSRVがメッセージを送る(=Minecraftと同期する)チャンネルのIDをスレッドのIDにしたらどうだろうと思ったものの、それは動きませんでした。
今回は、Discordのサーバーに参加しており、かつ特定のロールを持つ人だけがMinecraftに参加できるようにしたいので、/home/minecraft/plugins/DiscordSRV/linking.config
を変えておきます。変更する項目だけ抜き出します。ロールのIDはDiscordの権限設定で、右クリックメニューからコピーできます。
Require linked account to play:
Enabled: true
# デフォルトではDiscordSRVの開発者の名前が入ってるので、自分の名前に変える
Bypass names: [{username(IGN)}]
Subscriber role:
Require subscriber role to join: true
Subscriber roles: ["{Role_Id}"]
# Message to kick players with telling them to link their accounts
# Use {BOT} as a placeholder for the bot's name
# Use {CODE} as a placeholder for the code people need to DM the bot
# Use {INVITE} as a placeholder for the invite link people need to join the Discord server, uses DiscordInviteLink configured in config.yml
Not linked message: "&7アカウントを&9Discord&7とリンクする必要があります。\n\n&7Discord内で&b{BOT}&7にDMで&b{CODE}&7を送信してください。"
ちなみに、Minecraftのusername(In-Game Name)というのはGlobalで一意なもののようです。
また、デフォルトではDiscord上でマインクラフトのコマンドを実行できる機能がオンになっているのですが、今回はオフにしておきます(管理人以外が実行出来ても怖いので)。
DiscordChatChannelConsoleCommandEnabled: false
LuckPermsのインストール
権限管理用のLucky Permsを入れます(権限管理の何かが無いと、DiscordSRVのコマンド打つのもダルイっぽい)。
以下のページのBukkitのアドレスをコピーして、/home/minecraft/plugins/
でwgetします。
今まで同様、Minecraft serverを再起動するとLuckPerms
ディレクトリが生成されています。
基本的な設定は公式のページに従うだけではあります。
マイクラ内ではなく、サーバーのconsoleで以下のコマンドを実行し、管理者に全ての権限を与えます。
lp user <your username> permission set luckperms.* true
今回は、管理者と利用者の2グループを作って置きます。具体的な権限の設定は後でやります。
lp creategroup admin
lp creategroup member
memberよりはadminの方が権限を多く持つハズなので、adminはmemberの権限を継承するようにしておきます。
lp group admin parent add member
EssentialXのインストール
discord上での名前とマイクラ上での名前を一致できるようにしたく、/nick
コマンドを使えるようにしたいので、EssentialXを入れます(ほかにもいろいろ便利なコマンドがあるらしい)。
EssentialXはいくつかのjarに分かれているそうですが、とりあえずCoreを入れます。
また、EssentialXがPermission系のpluginとやり取りをするのにVaultというプラグインが必要なようです。
最新のjarを/plugins
でwgetすれば大丈夫っぽいです。
EssentialXも同様にlatest releaseのjarを/plugin
でwgetします。
この状態でサーバーを起動させると、/plugins/Essentials
が生成されて、その中にconfig.yml
が生成されています。
この段階で一部のコマンドはvanillaのコマンドからEssentialXのものに置き換えられるようですので、LuckPermで許可をする場合、EssentialXのものを指定する必要があります。
今回は、マイクラ内でもマイクラのユーザー名ではなくDiscord上での名前で表示出来るようにしたいので、その辺りの設定をしていきます。基本的にはEssentialXのdisplayNameを使ってusernameを置き換えていきます。
今回変えた部分を抜粋しておきます。
# The character(s) to prefix all nicknames, so that you know they are not true usernames.
# Players with 'essentials.nick.hideprefix' will not be prefixed with the character(s).
nickname-prefix: ''
# Disable this if you have any other plugin that modifies the display name of a player.
change-displayname: true
# This option will cause Essentials to show players' display names instead of usernames when tab completing Essentials commands.
# If your tab completions include prefixes and suffixes, set this option to false.
change-tab-complete-name: true
# When this option is enabled, the (tab) player list will be updated with the display name.
# The value of 'change-displayname' above must be true.
change-playerlist: true
# Set the locale for all messages.
# If you don't set this, the default locale of the server will be used.
# For example, to set the language to English, set locale to 'en'. It will then use the file 'messages_en.properties'.
# Don't forget to remove the # in front of the line.
# For more information, visit https://essentialsx.net/wiki/Locale.html
locale: ja
# You can set custom join and quit messages here. Set this to "none" to use the default Minecraft message,
# or set this to "" to hide the message entirely.
#
# Available placeholders:
# {PLAYER} - The player's display name.
# {USERNAME} - The player's username.
# {PREFIX} - The player's prefix.
# {SUFFIX} - The player's suffix.
# {ONLINE} - The number of players online.
# {UNIQUE} - The number of unique players to join the server.
# {UPTIME} - The amount of time the server has been online.
custom-join-message: "{PLAYER} joined the server"
custom-quit-message: "{PLAYER} left the server"
権限の設定
とりあえず今回は、/me
と/nick
を全員使えるようにしました(paperMCを起動したサーバーのコンソールで実行)
lp group {group name} permission set essentials.me true
lp group {group name} permission set essentials.nick true
他どういう権限が必要か正直わからないので、この辺は遊ぶ人に聞こうと思っています。
あと、本当はサーバーに入った人を自動的にmember groupに追加するようにできないかと思いましたが、調べるのが面倒なこともあり、defaultにmember権限を継承させました。いい方法あれば教えてください。
mcrconのインストール
Minecraftのサーバーアプリケーションに外からコマンドを送るためにMCRconをinstallします。これはシステムディレクトリにインストールするので一度exit
してsudo権限のあるユーザで行います。どうもパッケージレジストラにあるのは古いっぽいので、Github repoの説明に従ってLXC内でbuildします。
systemdで管理する
今回のサーバー自体はsystemdで管理しようと思います。色々と楽なので。
以下のようなsystemdのConfig fileを/etc/systemd/system
内にminecraft.service
として作成します。
[Unit]
Description=Minecraft Server (PaperMC)
After=network.target
[Service]
Type=simple
User=minecraft
Group=minecraft
WorkingDirectory=/home/minecraft
ExecStart=/usr/bin/java -Xms6656M -Xmx6656M -jar paper-1.21.8-31.jar --nogui
ExecStop=/bin/bash -c '/usr/bin/mcrcon -H 127.0.0.1 -P 25575 -p "mcrcon_password" stop || true'
TimeoutStopSec=60
Restart=always
RestartSec=10
StandardInput=null
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
サーバーを公開する
最初はcloudflare tunnelで行けるかと思いましたが、どうも無理っぽいとなり、
次に自宅のルーターでポートフォワーディングするかとなりましたが、ISPのルーター(PR-500KI)がロックされており出来ず(Cloudflare APIで自宅IPを動的にDNSに設定する所までやったのに!)
結局、playit.ggというサービスを使う事にしました。
このサービスは多くのマイクラサーバーで使われているようで、一旦これで行こうという事にしました。無料でTCP及びUDPのトンネリングができ、マインクラフト用の設定もあります。
まずアカウントを作り、ダウンロードページのダウンロードスクリプトを実行して、systemdで起動します。
sudo systemctl start playit
sudo systemctl enable playit
サーバー側でplayit setup
とすると、サーバーにtoken?付きのURLが出るので、それをwebで開くと接続が完了します。
あとはdashboardでtunnelを2つ設定すると、publicなURLが発行されます。
今後のタスク(やったら追記します)
- systemd timerでの自動再起動周りの設定
- discordに送るメッセージの修正(上記の自動再起動とかしだすと、チャンネルへの通知すごそうなので)
- バックアップの設定
感想
最初自宅のLAN内に建てた時は「簡単やーーん」となりましたが、アレもコレもとやっているうちにどんどん大変になり時間もかかりました。あれ、この感じ、なんか色んな所でやってるな....って思いました。実際の進捗率が飽和関数なのに、自分の体感の進捗率は一次関数的に伸びてくのが良くないですね。うーん..........。