SSD Nodes Learn Hosting plans →
ガイド Matt Connor著者 Matt Connor

Ubuntu VPSでMinecraftサーバーを構築する方法

Ubuntu 24.04のVPSでPaperサーバーを構築します。RAMの目安、Java 25、systemd、25565のファイアウォール、ワールドの安全なバックアップ、実際のエラーを解説します。

構築するもの

安定して稼働する Minecraft Java Edition サーバーを構築します。Ubuntu 24.04 上で Paper を実行し、専用の minecraft ユーザーとして systemd で管理します。Restart=on-failure を設定し、ホワイトリストを有効にします。ufw と、有効になっている場合はプロバイダーのネットワークファイアウォールで、ポート 25565 を開放します。バックアップは、保護対象のワールドを破損させない方法で取得します。サーバー本体は 1 つの jar と 1 つの java コマンドで構成されます。友人が 1 年間遊べるサーバーと、最初の週末に停止するサーバーを分ける要素は、すべてこのコマンドの周辺にあります。このガイドでは、その構成を説明します。

費用をかける前に、2 つの注意点を確認してください。1 つ目は、Minecraft は大量のメモリを使用し、主にシングルスレッドで動作することです。1 GB の VPS では、快適に遊べるサーバーを運用できません。低速な 4 コアよりも、高速な 1 コアのほうが適しています。2 つ目は、対象が Java Edition であることです。Bedrock のプレイヤー、コンソール、スマートフォン、Windows Bedrock アプリからは、Java サーバーに接続できません。Bedrock には、UDP 19132 を使用する別のサーバーソフトウェアか、Geyser プラグインが必要です。ここでは扱いません。

root または sudo を使用できる、新規の Ubuntu 24.04 KVM VPS が必要です。作業時間は約 30 分です。

必要なサーバーリソースの見積もり

重要なのは RAM です。実際に必要な容量は、modpack のフォーラムで言われている数値より少なくなります。

  • 2 GB は、控えめな描画距離で 2–5 人がプレイする Vanilla 環境を動かせます。プレイ可能ですが、余裕はありません。
  • 4 GB は、友人向けサーバーとして快適な容量です。Paper でプラグインを少数使用する場合、同時接続 10 人程度に対応でき、OS 用の容量も残ります。
  • 8 GB 以上 は、modpack や 20 人以上のプレイヤー向けです。この規模では、シングルコアの CPU 速度も重視してください。ゲームのメインループは 1 スレッドで実行されるためです。

プレイヤーが探索するとワールドはディスク上でも大きくなります。よく移動するサバイバルワールドは数 GB に達するため、ワールド本体とバックアップのための容量を確保してください。

Vanilla と Paper のどちらを使うべきですか? Paper は公式 jar の置き換えとして使用できます。ワールドとクライアントはそのまま利用でき、クライアント側の mod も必要ありません。Paper は、チャンクの読み込み、エンティティの処理、ホッパーなど、サーバーで特に遅い処理を効率化し、プラグイン API も追加します。Vanilla を実行する理由があるとすれば、Paper の最適化によって変更される可能性がある技術系レッドストーン装置について、Vanilla と完全に同一の動作が必要な場合だけです。それ以外では、Paper のほうが 1 GB あたりでより多くのプレイヤーに対応できます。以下の手順はどちらでも使用できます。

手順 1: Java 25 をインストールする

Minecraft 26.1 とそれ以降のすべてのリリースには Java 25 が必要です。Java 21 で対応できるのは、古い 1.20 から 1.21.11 までの系列だけです。Ubuntu 24.04 では、updates リポジトリと security リポジトリから Java 25 をインストールできます。-headless ビルドではなく、完全な JRE をインストールしてください。Paper の Java インストールガイドでは、Paper に必要な依存関係が不足するため、headless 版を使用しないよう警告しています。

sudo apt update && sudo apt install -y openjdk-25-jre
java -version

正しい結果では、1 行目が openjdk version "25.0.x" になります。21、17、または 11 と表示される場合は、別の JRE がインストールされ、そちらが優先されています。sudo update-alternatives --config java で修正し、java-25 を含む項目を選択してください。

この確認を省略すると、後で Minecraft サーバーに関する検索数が最も多いエラーに遭遇します。Java 21 を使用すると、サーバー jar は直ちに終了し、次のエラーが表示されます。

Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
	java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been
	compiled by a more recent version of the Java Runtime (class file version 69.0),
	this version of the Java Runtime only recognizes class file versions up to 65.0

数値から不一致の内容を判別できます。class file version 69.0 は Java 25、65.0 は Java 21、61.0 は Java 17 を示します。どの組み合わせが表示されても、対処方法は同じです。新しい JRE をインストールし、update-alternatives を再実行してください。

手順 2: 専用ユーザーを使用し、root は使わない

サーバーはプラグインコードを実行し、ポートに到達できるすべてのユーザーからのネットワーク入力を解析します。処理に問題が発生した場合、root 権限で動作する侵害プロセスは VPS 全体を制御できます。一方、minecraft で動作するプロセスが制御できるのはゲームワールドだけです。

sudo adduser --system --group --home /opt/minecraft minecraft

--system は、SSH でログインできないパスワードなしのアカウントを作成します。ホームディレクトリと作業ディレクトリには /opt/minecraft を設定します。以降、サーバーに対して実行するすべてのコマンドは、このユーザーで実行します。

手順 3: 公式ソースから server jar をダウンロードする

server jar を入手してよい場所は、vanilla では minecraft.net の公式 server ダウンロードページ、Paper では papermc.io のダウンロードページの 2 か所だけです。server jar を再パッケージして配布する第三者の「ダウンロードハブ」は、長年にわたってマルウェアの配布経路になっています。server jar は、インターネットに公開されたサーバー上で 24/7 実行する任意のコードです。

公式ページで現在の build のダウンロードリンクをコピーしてから、次を実行します。URL はバージョンと build ごとに変わるため、ここに 1 つをハードコードするとすぐに使えなくなります。

cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'

正しい結果: 約 60 MB の server.jar が minecraft に所有され、ls -lh /opt/minecraft/server.jar で確認できます。

ステップ 4: 初回起動、EULA、そして自分を管理者にする

systemd を設定する前に、サーバーを一度対話的に起動します。初回起動には、ライブコンソールでのみ確実に実行できる作業が2つあります。

cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar nogui

数秒で終了します。Paper は先にパッチを適用するため、さらに少し時間がかかります。ログの最後には、誰もが目にする次の行が表示されます。

[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

これはエラーではなく、ライセンス確認です。実行によって jar の横に eula.txt が作成されます。まだ確認していない場合は、リンク先の EULA を読み、その後フラグを切り替えます。

sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txt

同じ java コマンドをもう一度実行します。今度はワールドが生成されます。初回起動では1〜2分かかることがあります。最終的に次の状態になります。

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

これでライブコンソールを使用できます。2つ目の作業として、op YourMinecraftName(ゲーム内で使用している正確なユーザー名)と入力します。サーバーによってあなたが ops.json に登録されます。そのため、後でコンソールが接続されていない場合でも、ゲーム内からすべての管理コマンドを実行できます。最後に stop と入力して、変更を保存したうえで正常に終了します。

Step 5: server.properties と online-mode を true のままにする理由

初回起動時に server.properties も書き込まれます。ほとんどのデフォルト値はそのままで問題ありません。次の項目は、意図的に決める価値があります。

online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually know

online-mode=true を有効にすると、サーバーは参加するすべてのユーザー名を Mojang のセッションサーバーで検証し、プレイヤーがそのアカウントを所有していることを確認します。これを false に設定すると、いわゆる「cracked server」用の切り替えになります。この場合、サーバーはクライアントが名乗る名前をそのまま信用します。誰でも任意の名前で参加でき、あなたの名前も使用できます。ops とホワイトリストは名前を基準に管理されるため、なりすましたユーザーがあなたの operator 権限を持って参加できます。これを false にする正当な理由は、Velocity のようにプレイヤー認証を自身で行う認証プロキシの背後で運用する場合だけです。通常のサーバーでは、必ず true のままにします。

view-distance は、このファイルで最も大きなパフォーマンス調整項目です。CPU と RAM のコストは、おおむねこの値の二乗に比例して増加します。VPS では 8 が妥当なデフォルトです。10 は vanilla のデフォルト値で、負荷が明らかに高くなります。

white-list=true と enforce-whitelist=true を組み合わせると、知らないユーザーがサーバーに参加できなくなります。下記のセキュリティセクションで説明するとおり、これは必須の設定です。ゲーム内で op 権限を持つユーザーが /whitelist add TheirName を実行してプレイヤーを追加します。

手順 6: メモリフラグと、-Xms と -Xmx を一致させる理由

JVM はヒープを -Xms(初期サイズ)から -Xmx(上限)までの範囲で割り当てます。専用ゲームサーバーでは、両方を同じ値に設定します。いずれヒープは上限まで到達するため、実行中に段階的に拡張するとガベージコレクターの処理だけが増加します。4 GB の VPS では、次の組み合わせが適切です。

/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui

-Xmx はプロセスが使用するメモリの総量ではありません。JVM は、オフヒープ領域、スレッドスタック、JIT キャッシュ、ダイレクトバッファーなどに、約 0.5 GB 以上を追加で使用します。Ubuntu 自体にもメモリが必要です。目安として、-Xmx は VPS の RAM から 1 GB を引いた値以下にします。設定値が大きすぎると、次のいずれかの障害が発生します。最初の割り当てに失敗すると、サーバーは次のメッセージを表示して起動を拒否します。

Error: Could not reserve enough space for object heap

これは明確ですぐに発生するエラーです。より厄介なのは、最初は正常に起動し、数時間後に停止するケースです。負荷によってヒープが満杯になると、カーネルの OOM killer がホスト上で最大のプロセスである JVM を終了することがあります。サーバーログには何も残りません。証拠は sudo dmesg | grep -i oom にあり、例えば Out of memory: Killed process 1234 (java) のような行が記録されます。サービスが「ランダムに」再起動する場合は、まずここを確認し、-Xmx を小さくしてください。

Paper では、G1GC の停止時間を抑えるために調整された設定である Aikar's flags(-XX:+UseG1GC -XX:MaxGCPauseMillis=200 とその他 12 個のフラグ)をプロジェクトのドキュメントで説明しています。完全な行は Paper のドキュメントから生成してください。2–4 GB のヒープでは効果は限定的ですが、これらのフラグによって問題が発生することはありません。

ステップ 7: Restart=on-failure を指定した systemd unit

手動で起動したサーバーは SSH セッションの終了とともに停止し、再起動後も停止したままになります。/etc/systemd/system/minecraft.service を作成します。

[Unit]
Description=Minecraft server (Paper)
After=network-online.target
Wants=network-online.target

[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui
Restart=on-failure
RestartSec=10
TimeoutStopSec=120

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -f

正しい結果では、status に active (running) が表示されます。サーバーのコンソール出力を記録するようになった journal は、再び Done 行で終了します。

この unit には、意図的な選択が 2 つあります。Restart=on-failure はクラッシュ後にサーバーを再起動しますが、正常な stop の後には再起動しません。そのため、メンテナンスを実施できます。もう 1 つの TimeoutStopSec=120 は、見た目以上に重要です。systemctl stop は SIGTERM を送信します。Minecraft server はこれを受け取ると、終了前にすべてのワールドを保存します。大規模なワールドでは、この保存に時間がかかります。systemd のデフォルトのタイムアウトでは、保存中の JVM に SIGKILL が送信される可能性があります。これが region files の破損につながります。タイムアウトは 2 分に設定してください。

サービスが頻繁に再起動し、journal に次の内容が表示される場合:

[Server thread/WARN]: **** FAILED TO BIND TO PORT!
[Server thread/WARN]: The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
[Server thread/WARN]: Perhaps a server is already running on that port?

25565 番ポートは、すでに別のプロセスが使用しています。ほとんどの場合、以前にフォアグラウンドで起動したプロセスが別の SSH セッションで動作したままになっています。sudo ss -tlnp | grep 25565 でプロセスを見つけ、そのプロセスを停止してください。1 つのポートで 2 つのサーバーを実行してはいけません。

手順 8: 2 つのファイアウォールで 25565 を開く

Minecraft Java が使用するのは TCP 25565 だけです(UDP はオプションの query protocol 用で、デフォルトでは無効です)。VPS で次を実行します。

sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable

これが 1 つ目のファイアウォールです。多くの VPS プロバイダーは、コントロールパネルにネットワークレベルの 2 つ目のファイアウォールも用意しています。有効になっている場合、これを忘れるケースが多くあります。SSD Nodes では Advanced Firewall Groups add-on がこれに該当します。これは有料の追加機能で、購入時またはダッシュボードから割り当てます。サーバーにこれが設定されている場合は、そこでも TCP 25565 を開きます。どちらか一方にルールがない場合の症状は、原因を特定しにくいものです。クライアントは「サーバーに接続中...」で停止し、Connection timed out: no further information で失敗します。接続拒否もサーバーエラーも表示されず、journal にも何も記録されません。パケットがサーバーに到達していないためです。VPS の外部にあるマシンから nc -vz your.server.ip 25565 で確認します。succeeded なら、経路上のすべてのファイアウォールで接続が許可されています。接続が停止する場合は、通常、どこかでパケットがまだ破棄されています。ただし、ホストが混雑して接続を受け付けられずタイムアウトする場合もあります。そのため、サーバー上で ss を実行し、待ち受け状態も確認します。

ufw を操作している間に、同じサーバーで SSH もパブリック IP 上で稼働していることを確認してください。数時間以内にブルートフォース攻撃のログが大量に記録され始めるため、忘れる前に Ubuntu 24.04 で SSH 用の Fail2ban を設定する を実施します。

これで接続します。Multiplayer、Direct Connection の順に選択し、サーバー IP を入力します。手順 4 で自分を op にしたため、ゲーム内コマンドはすぐに使用できます。各プレイヤーには /whitelist add FriendName を実行し、予定している場合は /gamemode creative を実行します。

Step 9: ポート 25565 はインターネットから検出されるため、ホワイトリストを設定します

Minecraft サーバーをインターネットに公開したままにすることは、理論上のリスクではありません。大規模なスキャナーは IPv4 全体を継続的に走査し、ポート 25565 を探します。趣味で荒らし行為を行うプロジェクトによって、こうして数十万台の公開サーバーが記録されています。ホワイトリストを設定していないサーバーには、数日以内、場合によっては数時間以内に招待していない訪問者が現れます。step 5 のホワイトリストがこの問題を解決します。online-mode=true が本人確認を行い、ホワイトリストが選択した ID だけにアクセスを制限します。この組み合わせがセキュリティモデルのすべてであり、友人向けのサーバーには十分です。

ゲームを使わないコンソールアクセス、スクリプトによるバックアップ、cron ジョブのために、server.properties で RCON を有効にします(enable-rcon=true、強力な rcon.password、ポート 25575)。そのうえで、VPS 自体で GitHub のソースから小さな mcrcon クライアントをビルドします。このクライアントは Ubuntu のリポジトリにはありません。ファイアウォールで 25575 を開放してはいけません。RCON はパスワードを平文で送信するため、loopback だけで待ち受けるようにします。

世界を壊さないバックアップ

唯一の原則は、サーバーが書き込み中のワールドディレクトリを絶対にコピーしないことです。プレイ中はリージョンファイルが継続的に書き換えられます。書き込みと競合する tar は、チャンクの一部しか書き込まれていないアーカイブを作成します。その状態から復元すると、バックアップが必要になる場面でチャンク読み込みエラーがログに大量に記録され、地形に欠損が生じます。これを避ける方法は2つあります。

停止・コピー・起動は、1分程度の停止時間が発生する代わりに、最も簡単な方法です。

sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
  -C /opt/minecraft world
sudo systemctl start minecraft

(26.1以降、Paperはvanillaと同様に、3つのディメンションをすべて world/dimensions/ 内に保持します。そのため、world がワールド全体です。1.21.11以前のPaperサーバーでは、ディメンションが world、world_nether、world_the_end に分かれています。その場合は、この2つもtarに追加します。)

Save-offでは、サーバーを稼働させたままバックアップします。RCON経由で save-off(自動保存を停止)を実行し、続けて save-all flush(すべてをディスクに書き込み、完了を待機)を実行します。その後tarを作成し、最後に save-on を実行します。毎日5 a.m.のcronに登録する場合は、この方法を使用します。

どちらの方法でも、サーバーと同じVPS上に保存したバックアップはバックアップとはいえません。scp または rclone でアーカイブをサーバー外へ転送し、複数世代を保持してください。また、障害発生時にコンソールを常時確認することはできないため、ポートに対する外部監視も設定します。別のサーバー上のUptime Kuma から25565にTCPチェックを実行すれば、プレイヤーより先にサーバーの停止を検知できます。

プラグインとアップグレード

Paper では、プラグインの jar を /opt/minecraft/plugins/ に配置して再起動すれば、インストールは完了です。プラグインは公式プロジェクトページ(Hangar、Modrinth、SpigotMC)からのみ取得してください。サーバー jar と同じく、プラグインも minecraft ユーザーとして実行される任意のコードだからです。

サーバーのアップグレード手順は、停止、バックアップ、server.jar を新しい Minecraft バージョン用のビルドに置き換え、起動するというものです。注意点が 2 つあります。ワールドのアップグレードは一方向です。新しいバージョンで開いたワールドは、古いバージョンでは開けません。そのためにもバックアップが必要です。また、プラグインは新しい Minecraft リリースへの対応に数日から数週間かかることがあります。そのため、リリース初日に更新する前に互換性を確認してください。1.21.11 から 26.1 以降へ移行する場合は、Java 25(手順 1)も必要です。また、Paper の Nether と End のフォルダーが world/dimensions/ に移動します。

これらすべてをコンテナとして管理する場合は、バージョン固定、EULA の同意、メモリフラグを環境変数で指定できます。広く使用されている itzg/minecraft-server イメージを使えば、同じ Paper サーバーを VPS 上の Docker Compose で実行できます。ファイアウォールとバックアップの運用も同じ方針で管理します。

FAQ

Minecraft サーバーにはどの程度の RAM が必要ですか?

2 GB でバニラ環境を 2–5 人で運用できます。4 GB なら、Paper 上でプラグインをいくつか使う約 10 人のフレンド向けサーバーを余裕を持って運用できます。Modpack や 20 人以上のプレイヤーでは、8 GB 以上が必要です。VPS のサイズにかかわらず、-Xmx は総 RAM から 1 GB を引いた値以下に設定してください。JVM はヒープ以外のメモリも使用するため、設定値が大きすぎると Error: Could not reserve enough space for object heap や、気付かないままの OOM kill が発生します。

フレンドが Minecraft サーバーに接続できないのはなぜですか?

クライアントがハングして Connection timed out: no further information で終了する場合、通常はファイアウォールが原因です。VPS 上の ufw と、コントロールパネルで有効にしている場合はプロバイダーのネットワークファイアウォールを確認してください。経路上にあるすべてのファイアウォールで TCP 25565 を許可する必要があります。サーバーが実際に待ち受けていることを、サーバー上で sudo ss -tlnp | grep 25565 を使って確認します。その後、外部から nc -vz your.server.ip 25565 でテストします。

server.properties で online-mode=false を設定すべきですか?

いいえ。online-mode=false を設定すると、サーバーは Mojang の認証を完全に省略します。そのため、誰でも任意のユーザー名で参加できます。op の名前を使って権限を引き継ぐことも可能です。また、スキンや安定した UUID も機能しなくなります。正当な用途は、Velocity のような認証プロキシの背後で、プロキシ自身がプレイヤーを検証する場合だけです。通常のサーバーでは true のままにします。

Paper はバニラの Minecraft サーバーより優れていますか?

ほとんどの場合は優れています。Paper はそのまま導入できる jar で、バニラのワールドを読み込み、変更していないクライアントを受け入れます。エンティティの tick 処理とチャンクの読み込みも大幅に効率化され、プラグインのエコシステムも利用できます。例外は、ビット単位で正確なバニラの挙動を必要とする技術系 redstone コミュニティです。一部の Paper の最適化によって、その挙動が変更されることがあります。小規模な VPS では、Paper の効率化によって RAM が実質的に増えたのと同じ効果が得られます。

Minecraft のワールドを破損させずにバックアップするにはどうすればよいですか?

サーバーがワールドディレクトリに書き込んでいる間は、決してそのディレクトリをアーカイブしないでください。region file の書き込みと同時にコピーすると、破損したチャンクが生成され、復元時まで問題に気付けないことがあります。サーバーを停止してワールドディレクトリを tar でアーカイブし、その後サーバーを再起動してください。または、save-off、save-all flush、tar、save-on を RCON 経由で使用して、稼働中のままバックアップします。その後、アーカイブを VPS の外部へ移動します。