マイクラサーバーを立ててみた
この記事は金沢IT部活 Advent Calendar 2025の4日目の記事になります(実際の投稿日が4日じゃないのはスンマセン…)。3日の記事はりくとさんのオペレーティングシステムの勉強2-Linuxについてでした。
唐突に生えたIT部活のアドカレを期に、溜まっていたネタを順々に放出できたらなと思います。
今回は身内向けにマイクラサーバーを構築した話から、構成やこだわりポイントなどを紹介します。マイクラサーバーの運営や監視周りは初めてで、AIと話しながら調べながらでやっていますので、生暖かい目で見ていってください。
サーバーの構成
- Cloudflare Tunnel
- Proxmox(仮想化基盤)
- Docker
- マイクラサーバー(PaperMC)
- DiscordSRV(Discord連携プラグイン)
- ViaVersion(新しいクライアントで古いサーバーに接続できるようにするプラグイン)
- ViaBackwards(古いクライアントで新しいサーバーに接続できるようにするプラグイン)
- minecraft-prometheus-exporter(Prometheusにメトリクスを送信するプラグイン)
- Bluemap(マイクラワールドマップツール)
- Prometheus(監視基盤用時系列データベース)
- Grafana(監視基盤ダッシュボード)
- マイクラサーバー(PaperMC)
自宅の回線の都合で、ポートを開放して外部からアクセスすることができないのでCloudflare Tunnelを使っています。
DockerはProxmoxのKVMのマシン上で動作しています。Cloudflare Tunnelにトンネルを作るcloudflaredはProxmox上のLXCで動作しています。cloudflaredはDockerでも動きますが、DockerのKVMが倒れるとcloudflaredも巻き添えを食らってめんどくさいことになりそうだったので、分離してみています(この判断が良いのか悪いのかはわからないけど…)。
Bluemapはマイクラサーバーのプラグインとしても動作しますがマイクラサーバーの動作に影響がありそうだったのと、マイクラサーバーが止まるとBluemapも止まってしまうので、マイクラサーバーとは分離してDockerコンテナーで動かしています。
効果的なリソース配分や運用を楽しくするために、マイクラサーバーのメトリクス監視を手探りでやっています。minecraft-prometheus-exporterでマイクラサーバーのメトリクスを配信して、Prometheusからメトリクスを取得/保存して、Grafanaで可視化しています。やっぱりああいうダッシュボードってカッコいいよね。
architecture-beta
group proxmox(cloud)[Proxmox]
group kvm(server)[KVM] in proxmox
group vm(server)[VM] in kvm
group Docker(server)[Docker] in vm
group lxc(server)[LXC] in proxmox
group ct(server)[CT] in lxc
service cloudflare(internet)[Cloudflare]
service cloudflared(server)[Cloudflared] in ct
service prometheus(server)[Prometheus] in Docker
service grafana(server)[Grafana] in Docker
service minecraft(server)[Minecraft] in Docker
service bluemap(server)[Bluemap] in Docker
cloudflare:B -- T:cloudflared
cloudflared:B -- T:minecraft
cloudflared:B -- T:bluemap
minecraft:B -- T:bluemap
minecraft:R -- L:prometheus
prometheus:B -- T:grafana
マイクラサーバーをDockerで立てるには
今回Dockerを使ってマイクラサーバーを構築したのですけど、思っていた以上に体験が良かったです。
僕の周りだと、やれビルドが面倒だの、やれJavaのバージョンが合わないだの、やれプラグインのバージョンが合わないだの、めんどくさいという文句をよく聞きました。しかしDockerイメージがよくできていたのでそのへんの不便さが払拭されていました。
今回使ったイメージはitzg/minecraft-serverというイメージです。公式ドキュメントにて丁寧に使い方が解説されています。
感動した機能
ここからはitzg/minecraft-serverを使っていて感動した機能について紹介します。
プラグインの宣言的な管理
itzg/minecraft-serverには、docker-compose.ymlで環境変数の設定で任意のURLやModrinthやForgeからMODやプラグインをダウンロードして導入する機能があります。ちまちまとターミナルに貼り付けてダウンロードしてディレクトリに配置する手間が無くなって非常に便利でした。
バージョンの自動解決
itzg/minecraft-serverには、プラグインの対応しているマインクラフトサーバーのバージョンの共通しているものの中から最新のマインクラフトサーバーのバージョンを自動で選択する機能があります(Modrinthからダウンロードしたプラグインのみ)。バージョンが合わなくてプラグインが正常に動かないという状況が発生しにくくて良いです。
参考リンク:Auto-download from Modrinth
監視基盤
今回のサーバー構築で特に力を入れたのが、監視基盤です。使っているマシンがちょっと貧弱なので、前述した通り、定量的な指標から軽量化施策やリソース配分をできたら良いなと思って構築しました。サーバーがDockerで構築されているのでDocker周りの監視基盤も構築しましたがそれはまた別の記事にしようと思います。
ナ組Minecraftサーバーの監視について —マイクラサーバー監視2020—を参考にminecraft-prometheus-exporter(以下exporter)を採用し、exporterのreadmeにそってPrometheusとGrafanaを設定しました。僕の環境だとPrometheusもDockerで動いているので、コンテナーを同じネットワークに入れて<コンテナー名>:9940でアクセスするか、host.docker.internal:9940や<DockerホストのIP>:9940を使うことになります。同じネットワークに入れるのは面倒でややこしくなる上に、コンテナー名の衝突を避けるためにコンテナー名はDockerに自動でつけてもらうことにしているため、そもそもコンテナー名が変わってしまう可能性があります。そのため今回はhost.docker.internal:9940でやりました。このためにわざわざポートを開けるのも微妙といえばそうなんですけどね。
今回minecraft-prometheus-exporterの導入で躓いたところは、exporterの設定ファイルで
| |
と設定していたらPrometheusからexporterにアクセスできなかったことです。exporterはlocalhostで待っているのでhost.docker.internal:9940や<DockerホストのIP>:9940のアクセスは受け付けていません。なので
| |
と設定する必要がありました。これで無事にPrometheusからexporterにアクセスすることが出来ました。0.0.0.0と設定することで任意のアクセスを受け付けます。
まとめ
Dockerを使ってマイクラサーバーを構築したという話でした。itzg/minecraft-serverでの構築体験が良かったこと、PrometheusとGrafanaでマイクラサーバーを監視したことについて説明しました。