Minecraftサーバーの立て方備忘録@Linux/Debian篇

## はじめに

この記事は、Minecraft サーバーを Spigot を用いて構築する方法を纏めたものです。
インターネット上を調べても、Linux/Debian 上で Minecraft サーバーを構築する手段を一意に纏めた記事がなかなか見つからなかったので、この記事の内容としては、あくまで個人的な備忘録として作成しました。その為、ネットワークの知識やスクリプトについての知識についてはあまり深掘りしていません。読者の方のお役に立ちましたら幸いです。

## 目次

- [サーバー構築の大まかな流れ](#サーバー構築の大まかな流れ)
- [サーバー構築 Linux/Debian篇](#サーバー構築-linuxdebian篇)
  - [Java のダウンロード](#java-のダウンロード)
  - [サーバーラッパーのビルド](#サーバーラッパーのビルド)
    - [Spigot Builder のダウンロード](#spigot-builder-のダウンロード)
    - [Spigot のビルド](#spigot-のビルド)
  - [Spigot サーバーのプレビルド](#spigot-サーバーのプレビルド)
    - [start.sh ファイルの作成](#startsh-ファイルの作成)
    - [start.sh の実行](#startsh-の実行)
  - [Spigot の性能要件を設定](#spigot-の性能要件を設定)
    - [eula.txt の設定](#eulatxt-の設定)
    - [server.properties の設定](#serverporperties-の設定)
  - [Port の開放](#port-の開放)
    - [ソフトウェアのダウンロード](#ソフトウェアのダウンロード)
    - [開放ポートの設定](#開放ポートの設定)
  - [サーバーのビルド](#サーバーのビルド)
  - [注意](#注意)

## サーバー構築の大まかな流れ

実際のサーバー構築では、マシンの OS や其々の環境によって方法が異なりますが、この章では先に全てのマシンでの構築における大まかな流れを纏めておきます。

1. Java のダウンロード
2. サーバーラッパーをビルドする
3. サーバーのプレビルド
4. サーバーの性能要件を設定
5. Port の開放
6. サーバーのビルド

## サーバー構築 Linux/Debian篇

ここで紹介しているサーバーの構築方法は、**Linux 上での実行**を想定しています。
また、Linux カーネル上でOS は**Debian** を使用しています。

### Java のダウンロード

Minecraft サーバーを起動する為には、Java の導入が必須です。
また、Minecraft サーバーのバージョンごとに、必要とされる Java のバージョンも異なります。希望するバージョンに適当な Java をダウンロードしましょう。

| Minecraft Version | Java Version |
| :--- | :--- |
| - 1.7 | Java 7 |
| 1.7.10 - 1.16.5 | Java 8 |
| 1.17 - 1.17.1 | Java 16 |
| 1.18 - 1.20.4 | Java 17 |
| 1.20.5 - | Java 21 |

### サーバーラッパーのビルド

Minecraft サーバーを構築するにあたって、先ずはサーバーラッパーをビルドする必要があります。
Minecraft のサーバーラッパーには様々な種類があり（2025/04/01 現在）、其々細かい機能や用途、性能などが異なる為、各々の目的にあったものを選びます。
今回は一般的に使用されている Spigot を利用します（尚、近年では Spigot をチューンして軽量化した Paper の使用が盛ん）。

#### Spigot Builder のダウンロード

Spigot は、自分の立てたいサーバーのバージョンに合わせて必要なファイルが異なります。
その為、先ずは Spigot のファイルをビルドするツールを入手します。

##### GUI 操作の場合

ビルドツールは[こちら](https://hub.spigotmc.org/jenkins/job/BuildTools/)からダウンロードできます。
上記のサイトへ飛んで、`最新成功ビルドの成果物 / BuildTools.jar`をダウンロードします。
ダウンロードが成功したら、Spigot をビルドする用のディレクトリへ`BuildTools.jar`を移動します。

##### CUI 操作の場合

ビルドツールをダウンロードしたいディレクトリへ移動します。
カレントディレクトリで、`wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar`を実行して、ビルドツールをダウンロードできます。

#### Spigot のビルド

カレントディレクトリで、`java -jar BuildTools.jar --rev ${VERSION}`を実行します。`${VERSION}`には、自分の立てたいサーバーのバージョンを入力してください。
実行するとビルド処理が始まり、Spigot ファイルが生成されます。処理の完了には時間がかかるので、コーヒーでも飲みつつ気長に待ちましょう。

### Spigot サーバーのプレビルド

前節の処理が正常に完了すると、`BuildTools.jar`と同様のディレクトリ下に、`spigot-${VERSION}.jar`というファイルが生成されます。
このファイルが、今後使用するサーバーラッパーとなります。
生成された`spigot-${VERSION}.jar`を、サーバー構築用のディレクトリへ移動します。

#### start.sh ファイルの作成

次に、サーバーを構築する為に実行するコマンドファイルを作成します。
`spigot-${VERSION}.jar`を移動させたディレクトリ下に、`start.sh`を作成します。`start.sh`ファイルの中身は以下の通りに記述します。

```bash
#!/bin/bash

java -server -Xms${MIN_MEMORY}G -Xmx${MAX_MEMORY}G -jar spigot-${VERSION}.jar nogui
```

このコマンドでは、以下のことをしています。

- `#!/bin/bash`で、コンソールにbashで実行することを明示
- `java -server -Xms${MIN_MEMORY}G -Xmx${MAX_MEMORY}G -jar spigot-${VERSION}.jar nogui`で、指定した条件に倣いサーバーを起動
  - `-Xms${MIN_MEMORY}G -Xmx${MAX_MEMORY}G`で、サーバーの実行に使用する最小メモリと最大メモリを指定
  - `-jar spigot-${VERSION}.jar`で、起動する jar ファイルを指定
  - `nogui`で、起動時に GUI の表示をしないように設定

:::note info
実行するJava のバージョンを変更したい場合は、`sudo update-alternatives --config java`を実行して選択することができます。
:::

#### start.sh の実行

`start.sh`の作成が終わったら、端末で`sh start.sh`を実行するか、`start.sh`ファイルをダブルクリックして実行してみましょう。
正常に動作すれば、サーバーのプレビルドが始まります。

### Spigot の性能要件を設定

前節での`start.sh`の実行が正常に完了すると、サーバー構築用ディレクトリ下に、`eula.txt`、`logs/`、`server.properties`の3つが生成されます。
サーバーを構築し、動作させる為には、これらのファイルを正しく設定する必要があります。

#### eula.txt の設定

先ず、`eula.txt`を設定します。
EULA とは、ソフトウェア開発側とユーザー側との間に交わされる契約で、ユーザーがソフトウェアを利用する上での免責事項等が記載されています。
Spigot を利用する為には、この[EULA](https://www.minecraft.net/eula)を理解し、承諾する必要があります。
[EULA](https://www.minecraft.net/eula)を読んだ上で、それに同意する場合は`eula.txt`ファイル内の`eula=false`という記述を、`eula=true`に変更してください。

:::note warn
EULA に同意しないと、サーバーを起動することはできません。
:::

#### server.porperties の設定

次に、`server.properties`を設定します。
このファイルでは、サーバー自体の設定や、サーバーが実行する Minecraft ワールドに対する設定などが行えます。
必ずしも設定を変更する必要はありませんが、サーバー運営を快適に行う上で知っておくべき内容なので、各項目を纏めておきます。

| Key | Type | Default | Detail |
| :--- | :--- | :--- | :--- |
| allow-flight | Boolean | false | サバイバルモードで飛行を可能にするか |
| allow-nether | Boolean | true | ネザーへの移動を可能にするか |
| broadcast-console-to-ops | Boolean | true | コンソールでのコマンドの実行をゲーム内のオンラインの管理者に表示するか |
| broadcast-rcon-to-ops | Boolean | true | rcon でのコマンドの実行をゲーム内のオンラインの管理者に表示するか |
| difficulty | String | easy | ゲーム内の難易度 |
| enable-command-block | Boolean | true | コマンドブロックを有効にするか |
| enable-jmx-monitoring | Boolean | false | JMXによるモニターを有効化するか |
| enable-query | Boolean | false | サーバー情報を取得できるプロトコルサーバーリスナーを有効にするか |
| enable-rcon | Boolean | false | rcon を用いたコンソールへのリモートアクセスを許可するか |
| enable-status | Boolean | true | サーバーリスト上でオンラインと表示するか |
| enforce-secure-profile | Boolean | false | Mojang の公開鍵を持つユーザー以外のログインを拒否するか |
| enforce-whitelist | Boolean | false | ホワイトリスト有効時に、登録されていないプレイヤーをキックするか |
| entity-broadcast-range-percentage | Int | 100 | エンティティ情報を送信する距離 |
| force-gamemode | Boolean | false | サーバーログイン時に、プレイヤーをサーバーのデフォルトゲームモードに変更するか |
| function-permission-level | Int | 2 | ゲーム内での function の実行権限 |
| gamemode | String | survival | サーバーのデフォルトゲームモード |
| generator-settings | String | なし | ワールド生成時の設定 |
| generate-structures | Boolean | true | ワールド生成時の構造物を生成するか |
| hardcore | Boolean | false | 一度死亡するとスペクテイターモードにするハードコアモードを有効にするか |
| hide-online-players | Boolean | false | サーバーリスト上でオンラインのプレイヤーを表示するか |
| initial-disabled-packs | String | なし | ワールド生成時の有効化しないデータパック |
| initial-enabled-packs | String | なし | ワールド生成時の有効化しないリソースパック |
| level-name | String | world | ワールド生成時のワールドデータの名前 |
| level-seed | String | なし | ワールド生成時のシード値 |
| level-type | String | default | ワールド生成時のワールドタイプ |
| max-players | Int | 20 | サーバーに一度にログインできる最大人数 |
| max-tick-time | Int | 60000 | サーバーの応答が無いときの、サーバーを強制終了させるまでの時間 |
| max-world-size | Int | 29999984 | ワールド生成時のワールドのサイズ |
| motd | String | A Minecraft Server | サーバーリストに表示されるメッセージ |
| network-compression-threshold | Int | 256 | 圧縮する最低バイト数 |
| online-mode | Boolean | true | 接続ユーザーを Minecraft Account Database に確認するか |
| op-permission-level | Int | 4 | 管理者の実行権限 |
| player-idle-timeout | Int | 0 | 操作の無いプレイヤーをキックするまでの時間 |
| prevent-proxy-connections | Boolean | false | ユーザーのVPNやプロキシの利用を許可しないか |
| pvp | Boolean | true | PvP を有効にするか |
| rate-limit | Int | 0 | プレイヤーがキックされるまでに送信できるパケット数 |
| rcon.password | String | なし | rcon 接続時のパスワード |
| rcon.port | Int | 25575 | rcon 接続時のポート番号 |
| require-resource-pack | Boolean | false | サーバー接続時に、サーバーリソースパックの導入を強制するか |
| resource-pack | String | なし | サーバーリソースパックのURI |
| resource-pack-prompt | String | なし | サーバーリソースパック導入時にプレイヤーに表示されるメッセージ |
| resource-pack-sha1 | String | なし | リソースパックのハッシュ値 |
| server-ip | String | なし | サーバー接続に用いる独自ドメイン |
| server-port | Int | 25565 | サーバー接続時に用いるポート番号 |
| simulation-distance‌ | Int | 10 | エンティティを処理する距離 |
| snooper-enabled | Boolean | true | snoop データを送信するか |
| spawn-animals | Boolean | true | ワールド生成時の動物を召喚するか |
| spawn-monsters | Boolean | true | ワールド生成時のモンスターを召喚するか |
| spawn-npcs | Boolean | true | ワールド生成時の村人を召喚するか |
| spawn-protection | Int | 16 | 初期リスポーン地点の保護半径 |
| sync-chunk-writes | Boolean | true | チャンク書き込みの同期を有効にするか |
| query.port | Int | 25565 | サーバー情報を取得できるプロトコルサーバーリスナーへの接続時に用いるポート番号 |
| text-filtering-config | String | なし | ゲーム内チャットのテキストのフィルタ |
| use-native-transport | Boolean | true | Linux でのパケット送受信の最適化を有効にするか |
| view-distance | Int | 10 | プレイヤーへ送信するワールドデータのチャンク半径 |
| white-list | Boolean | false | ホワイトリストを有効にするか |

### Port の開放

最後に、サーバーを公開する為にポート開放をします。
ポート開放は、サーバーを立てている自分の LAN において、ポートと呼ばれる特定一部分に対する外部からの接続を許可し、LAN 内外での接続を可能にするものです。
Minecraft サーバーに自分以外の他のプレイヤーが接続する為には、ポート開放を行い、サーバーへの外部からの接続を許可する必要があります。

今回は Linux/Debian 上でサーバーを立てる為、Port 開放には専用のファイアウォールソフトウェアを使用します（既存のコマンドから設定することもできるが、`iptables` を使用するとやや複雑なため）。

#### ソフトウェアのダウンロード

個人的に扱いやすいと思ったソフトウェアは、**Uncomplicated Firewall** です。今回はこちらを使用します。

まず、`sudo apt -y install ufw`を実行して、ソフトウェアをダウンロードします。
`sudo ufw status`を実行すると、ファイアウォールの状態が表示されます。

#### 開放ポートの設定

ファイアウォールにルールを追加していきます。
まず、ルールに追加したポート以外の通信を遮断するために、`sudo ufw default DENY`を実行します。
その後、`sudo ufw enable`を実行して、ファイアウォールを有効化します。

次に、`sudo ufw allow ${PORT}`を実行して、サーバーの通信に必要なポートを開放します。
`${PORT}`には、[Spigot の性能要件を設定](#spigot-の性能要件を設定)の節で設定した`server-port`の値と同じ値を入力してください。

最後に、`sudo ufw reload`を実行してファイアウォールの設定は完了です。

:::note info
`sudo ufw status`を実行することで、ファイアウォールの有効・無効、開放・閉鎖しているポート番号などが閲覧できます。
:::

:::note warn
ファイアウォールの設定を変更した後は、`sudo ufw reload`を実行してください。実行しないと、変更した設定が反映されない可能性があります。
:::

### サーバーのビルド

以上の作業が終了したら、サーバーを起動しましょう。
サーバーは[Spigot サーバーのプレビルド](#spigot-サーバーのプレビルド)と同様に、端末で`start.sh`を実行するか、`start.sh`ファイルをダブルクリックして起動することができます。
コンソール上に`Done!`と表示されればサーバーの構築は完了です。マルチプレイを楽しみましょう。

### 注意

- 何回もサーバーを構築していると、毎回[サーバーラッパーのビルド](#サーバーラッパーのビルド)を行うことが億劫になってきます。しかし、サーバーラッパーファイルの直接のダウンロードは、[DMCA](https://www.congress.gov/bill/105th-congress/house-bill/2281)という法律に抵触する為禁止されています。毎回必ず自分でビルドを行いましょう。

- サーバーを終了する際は、Minecraft サーバーのコンソール上で `stop` を実行して終了させましょう。<kbd>Ctrl+C</kbd> や終了ボタンを押しての終了は、サーバーデータが正常に保存されない可能性があります。

- サーバーを起動していない際は、開放した Port は閉じておきましょう。常時の開放は、セキュリティ上の危険が伴います。

- Minecraft サーバーの運営に当たっては、日々 Minecraft 公式や Spigot 等の更新情報を確認しておきましょう。稀に、セキュリティ上の脆弱性が報告されていることがあります（大規模なものだと、[Log4j2](https://www.spigotmc.org/threads/spigot-security-releases-%E2%80%94-1-8-8%E2%80%931-18.537204/) などがありました）。

## 終わりに

個人用として書いたものだったので、説明に至らない点があったかもしれませんがご了承ください。この文章を書き始めた当初は、私が Minecraft サーバーを構築した経験を、Linux (Debian)、Mac、Windows の全ての OS について一つの文章に記していたのですが、逆に読みにくくなってしまったので、OS ごとに別記事にすることにしました。今回は Linux/Debian 篇でしたが、また暫くしたら別 OS 篇もあげようと思います。