3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【無料】常時稼働するマイクラサーバーを建てよう!!

Last updated at Posted at 2025-12-21

はじめに

はじめまして!
普段はnoteで記事を書いているのですが、アドベントカレンダーたる面白いものを発見したので参加してみました!!
Qiitaで記事を書くのは、初めてですがMarkdownで記述できるのはいいですね~。

話がそれましたが、本記事はOracle Cloud Infrastructure Advent Calendar 2025 シリーズ3 22日目 と言うこと張り切っていきたいと思います!!

なにするの?

つい先日の話ですが、友人とゲームをしているときに「そういえばさぁ、いつでも入れるマイクラのサーバーないの? てか、建ててよ。」と言われまして。

そんな、無料でそこそこ性能のよいクラウドのサーバーなんて建てられるわけ...と思い色々と検索してみた結果、

image.png

見つけちゃったんですよね。

クラウドサービスといえば、AWSだったり、GCPだったり、Azureなどが、挙げられると思いますが、無料枠を見てみるとvCPUが1個だったり、メモリが1GB程度しかなく非常に窮屈な性能なんですよね。(遊ぶ人数によっては工夫次第で遊べるとは思いますが...)

それに比較し、OCIの無料枠では、Ampere A1コンピュート・インスタンスを選択することで 最大4 OCPUと24GBのメモリ を使用することができ、他社のサービスと比較して高性能なサーバーを無料で構築することが可能なんですよ!

ということで本記事ではOCIで常時稼働するMinecraftサーバーを無料で建ててみたいと思います。
また、クラウドサービス自体初めて触ってみたので勉強の際、参考にさせていただいたサイトを補足に乗せています。間違っている点などがあるかもしれません。ご了承お願い致します。

追記:
サーバー:paperMC
バージョン:1.21.10 で構築します。

1.準備

では、始めていきましょう!!
アカウント登録済みで、インスタンス作成について知っている方は、2.いよいよサーバーを建てよう!! まで読み飛ばしてください。

1-1アカウント登録

アカウント登録の方法については、他の方が丁寧にまとめてくださっているため、割愛させていただきます。
今回ご紹介する方法は、無料プランの方でも作成できるのですが、1つだけ問題があります。
詳しくは、1-2のインスタンス作成でお話します。

こちらの記事がわかりやすかったため紹介させていただきます。
参考:https://qiita.com/fufukuku/items/af58e01ec0ee93f063b0

1-2 インスタンス作成

次に、今回使用するインスタンスを作成していきましょう!
こちらから、ログインしてください。

OCIのホーム画面へ移動し、ナビゲーションメニュー(左上の3本線)から、インスタンスを選択します。

image.png

その後、 インスタンスを作成 と書かれた黒いボタンを押すとこのような画面になると思います。

image.png

では、順番に設定していきましょう!

名前:
ご自由に。今回は、Minecraft-serverとしておきます。
コンパートメント:
デフォルトのルートでも問題はないのですが、分けたいのでMinecraft-serverというコンパートメントを作成しました。

補足:コンパートメントについて。
こちらの記事が非常にわかりやすいので、紹介させていただきます。
参考:https://solutions.system-exe.co.jp/oracle-cloud/blog/what-is-a-compartment
簡単にまとめると、リソースを分けるための部屋みたいなものです。

少し下にスクロールして、

拡張オプション:
デフォルトのままで構いません。
イメージとシェイプ:
イメージについて、指定はありませんが普段からWSLでUbuntuを使用しているので Canonical Ubuntu 24.04 を選択しました。
次に、シェイプについてですがデフォルトで選択されているAMDのものはパワーが弱いので変更します。シェイプの変更から、Ampereを選択し、▼ボタンから、コア数とメモリを変更します。
ここまで、設定できたら右下の次へを押して、セキュリティに移ります。
セキュリティ:
デフォルトのままで構いません。保護インスタンスはオフで。
プライマリVNIC:
既存のものがある場合は、それを使用していただいて構いません。その場合、パブリックIPv4アドレス割当てをオンにしておいてください。新規作成する場合は、自動的にオンになるので変更する必要はありません。

補足:VNICについて、
自分も、あっさりとしか理解していないので説明はできないのですが、説明している記事を紹介させていただきます。(今度しっかり調べたいですね。)
https://wa3.i-3-i.info/word12850.html
https://wa3.i-3-i.info/word11973.html

SSHキーの追加:
すでにSSHキーを持っている方は、アップロードを選択して公開鍵をアップロードしてください。持っていない方は、キー・ペアを自動で生成を選択して、秘密鍵と公開鍵のどちらもダウンロードしてください。

暗号化技術ってこういうところで使用されているんだなあと感心しました。理論はよく学ぶのですが、実際に使うまでは実感が湧かないですね~。
そういえば、公開鍵、秘密鍵の仕組みを復習すると同時に興味深い記事を見つけたので紹介しておきます。
自分は、今まで間違った認識をしていたようです...
https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432
https://qiita.com/angel_p_57/items/19eda15576b3dceb7608

設定できたら次へを押しストレージに移ります。

ブート・ボリューム,ブロック・ボリューム:
基本的には、デフォルトのままで構いません。

ここまで設定できたら最後に間違いがないか確認して、右下の黒い作成ボタンを押してください。

ここで作成できた方はおめでとうございます👏
手順3にお進みください。

エラーが出てしまった方は、下の文章をお読みください。

なんでエラーになるの?

しっかりインスタンスの設定をしたのに、なんでエラーが出たの?と思っている方もいるかと思うので少し解説します。

今回使用する「Ampere」は非常に高性能なシェイプでありながら、無料で利用できるため大変人気があります。

しかし、無料プラン(Always Free)で提供されるAmpereのリソース量には、リージョンごとに限りがあります。 図のように、無料枠用のスペース(青い枠)は決まっており、ここが他の無料ユーザーさんで満員になってしまうと、空きができるまでインスタンスを作成できなくなります。(手書きですみません。)
image.png

じゃあ、無料では作れないの?と思う方もいらっしゃるかと思いますが、実はまだ方法があります。

対処法

2つ存在します。
1つは空きが出るまで粘ることです。自動化スクリプトを組んで常に空きが出ないか監視しておくことも可能なため絶対に無料プランがいい!って方は待つのも手ですね。

もう1つの方法が、有料プランにアップグレードし、無料枠内で使用する方法です。
どういうことか説明しますと、
image.png

こちら、先程示した写真になるのですが、赤丸で示した部分を見ていただくと、

Always Free
3,000 OCPU hours and 18,000 GB hours per month
引用元:https://www.oracle.com/jp/cloud/free/

というふうに書かれています。
つまり、1時間辺り3,000 OCPU、1ヶ月18,000GBのメモリまでは無料で使用できるということですね。実際に、4 OCPU、24GBのメモリでシミュレーションを行ってみると、
image.png
Estimated monthly costが0円 になっていることがわかります。[1]

補足:
ストレージについて、

すべてのOracle Cloud Infrastructureアカウント(無料か有料かに関係なく)には、アカウントの有効期間中、テナンシのホーム・リージョンに無料で使用できるリソースのセットがあります。すべてのテナンシは、合計200 GBのブロック・ボリューム・ストレージと、Always Freeリソースに含まれる5つのボリューム・バックアップを受け取ります。[2]

との記載があります。つまり、200GBまでは無料で使用可能ということですね。
実際に、先程の写真のストレージに関する部分で

"□Apply 200GB Free Tier Discount Block Volume service Free tier allowance is for entire tenancy, 200GB total/tenancy. If there are multiple quotes for the same tenancy, only total 200GB can be applied" [1]

と記載されています。
参考[1]:https://www.oracle.com/jp/cloud/costestimator.html
参考[2]:https://docs.oracle.com/ja-jp/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.html

また、OCPU、メモリ、ストレージについて分けて使用することが可能です。
例えば、2 OCPU、メモリ16GB、ストレージ100GBのインスタンスと、2 OCPU、メモリ8GB、ストレージ100GBのインスタンスの2つを作成しても無料で使用できるということですね。

上記のようにリソースを分けて使用することができますが、上限は無料枠である4 OCPU,メモリ24GB、ストレージ200GBになります。また、アカウント作成時に選んだ ホームリージョン のみ有効である点に注意してください。

以上より、有料プランに変更してもAlways Freeは適用され、使用できるインスタンスの数が増えるため、エラーで弾かれることがなくなると思います。しかし、上限がなくなるため、意図せずコストが掛かってしまうなどのトラブルが生じるかもしれませんので自己責任で選択して頂く必要があります。(もちろん、予算アラートを設定することも可能です。)
自分の場合ですと、無料プランで作成したときにリソースが枯渇していたため有料プランに変更しました。実際に、下の写真を見ていただくと分かる通り、無料で利用できています。
image.png

有料プランへの変更方法については、こちらの記事をご参考ください。
変更にかなり時間がかかるみたいなので気長に待ちましょう。(自分は変更完了のメールが届くまで4時間ぐらいかかりました。)
参考:https://qiita.com/tyskJ/items/eabf4ddde42b36a9f535

2.いよいよサーバーを建てよう!!

なんやかんやで、準備にかなり時間かかりましたね...
気を取り直して、本格的にサーバーを建てていきましょう!

2-1準備

以下2つを用意してください。
・Tera Termなど、SSH接続ができるターミナルエミュレータ

SSHってなに?
SSH:Secure Shellの略。通信を暗号化して安全に接続するための方法。
参考:https://www.kagoya.jp/howto/it-glossary/server/ssh/
参考:https://wa3.i-3-i.info/word11722.html

・Win SCPなどSFTP(FTP)ソフト

SFTP(FTP)ってなに?
FTP:File Transfer Protocolの略。ファイルをやり取りすることができる仕組み。
SFTPは、通信時にSSH技術を用いて通信を暗号化することができる仕組み。
参考:https://wa3.i-3-i.info/word17531.html
参考:https://dev.classmethod.jp/articles/what-sftp/

使い方について

・Tera Term
起動すると、このような画面になると思います。
TCP/IPを選び、以下のように選択します。

image.png

・ホスト
OCIのコンソール画面の左上にある3本線から、インスタンスを選択します。すると、パブリックIP(xxx.xx.xx.xxxみたいな番号)と書かれた物が出てくると思うのでその番号をそのままホストに入力します。
・サービス
SSHを選択します。
・TCPポート
デフォルトで22番ポートが開いているので22を入力します。

OKを選択すると、セキュリティ警告が出るので続行を選択します。
するとこのような画面になると思います。
image.png

・ユーザー名
インスタンス作成時にOracle Linuxを選択した方は、opcまたは、oracleを入力してください。Ubuntuを選択した方は、ubuntuと入力します。
・認証方式
RSA/DSA/ECDSA/ED25519鍵を使うを選択し、先程保存した秘密鍵を選択します。

Tera Termで鍵を認証する際に、フォルダ選択の画面で右下のファイルの種類をすべての種類に変更しないとダウンロードしたファイルが現れません。image.png
Win SCPを利用することで、.ppkファイルに変換することが可能ですのでそちらを利用するほうが後々楽かもしれませんね。

その後、接続を押すと以下のような文章がコンソールに表れ無事接続できました。

*** System restart required ***
ubuntu@minecraft-v2-0:~$

・Win SCP
起動後、以下のように選択します。
image.png
ホスト名、ユーザー名についてはTera Termの時と同様ですので割愛します。

・転送プロトコル
SFTPを選択してください。

次に、設定をクリックしSSH技術を接続、認証を選択します。メニュー右側の秘密鍵より、ファイルを選択します。
image.png
保存後、ログインをクリックすると接続できます。

自分は、2つに分けて動かすのが面倒なのでVScodeの拡張機能RemoteSSHを利用します。image.png

参考:https://soroban.highreso.jp/article/article-004
VScodeを使用する方は、こちらも読んでおくことをおすすめします。
参考:https://qiita.com/coatly/items/a392925346f091b49279

ポート解放をする

マイクラサーバーはデフォルトで25565のポートを利用してマルチプレイを行なっているので、該当するポートを解放してあげましょう。

まず、OCIのコンソール画面から、左上の3本線を押し、コンピュート内のインスタンス を選択します。
その後、作成したインスタンスを選択します。(表示されない場合はコンパートメントが正しいか確認してください。)
上のメニューでネットワーキングに変更しサブネットをクリック、上のメニューをセキュリティに変更します。
image.png
その中に保存されている青文字で書かれたサブネットをクリックします。
上のメニューでセキュリティー・ルールに変更し、イングレス・ルールの追加を選択します。

選択後、下の画像のように入力します。
image.png
これにて、OCIの設定は完了です。次に、Ubuntuの方を設定しましょう。
Tera Termもしくは、VScodeにてSSHでターミナルに接続します。
以下のコマンドを実行してください。

# ポート25565へのアクセスを許可
sudo iptables -I INPUT -p tcp --dport 25565 -j ACCEPT

# 設定を永続化
sudo apt install iptables-persistent -y
sudo netfilter-persistent save

2-2.サーバーを作ってみる

今回のサーバーはdockerで構築したいと思います。dockerを使用する意図としては、シンプルに管理がしやすくなるからですね。あとは、dockerを使用するとサーバーの拡張が簡易的にできるようになるのでロマンのあるサーバーが実現できちゃうんですよね!!(実際におまけでやってみます)

Tera Termもしくは、VScodeで作成したインスタンスにSSH接続します。
まず、インスタンスに dockerを導入したいと思います。
以下のコマンドを実行してください。

# 1. パッケージリストの更新とツールのインストール
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# 2. GPGキーを追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 3. リポジトリのセットアップ
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. Dockerのインストール
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

これでdockerのインストールが完了しました。

続いて、サーバーデータをまとめるフォルダを作成します。名前はminecraft-serverにしました。

mkdir minecraft-server
cd minecraft-server

以降の手順は、minecraft-server内で行うので最後にcdコマンドを実行しました。
では、compose.ymlを設定していきます。
minecraft-serverフォルダ内でdocker-compose.ymlを作成し、以下のように記述します。

services:
  mc:
    image: itzg/minecraft-server
    container_name: mc-paper
    restart: always
    ports:
      - "25565:25565"
    environment:
      EULA: "TRUE"
      TYPE: "PAPER"
      VERSION: "1.21.10"
      MEMORY: "20G"
      TZ: "Asia/Tokyo"
      MAX_PLAYERS: 20
    volumes:
      - ./data:/data

それでは、実際にサーバーを建ててみましょう。
カレントディレクトリをdocker-compose.ymlが存在するminecraft-serverになっているか確認し、以下のコマンドを実行します。

docker compose up -d

これだけでマイクラサーバーを構築できました。dockerを使用するとjavaのインストールなどを手動で行う必要がないので非常に楽でいいですね。

補足:dockerコマンドについて

#起動 
docker compose up -d

#再起動
docker compose restart

#停止 (コンテナ削除)
docker compose down

#コンソールに入る(op権限などの付与を行いときなど)
docker compose exec mc rcon-cli

サーバーへ参加するには、Minecraftのマルチプレイから、サーバーアドレスにOCIのパブリックIPを打ち込むと参加できます。
image.png
接続できましたね!これにて完成です!!

3.まとめ

ところどころ専門的で難しい部分はありましたが、無事サーバーを立てることができ良かったです。いつかクラウドサービスを触りたいなあって思っていたところなので個人的にはかなり満足です。「クラウドを使ってみたいけど、何も内容がない!!」って方はぜひ挑戦してみてくださいね~!

自分が知らない間に街が発展していく感じが見ていて面白いですね。
image.png
image.png
いつの間に、こんな大規模なもの作ってんだ...
こんなふうに、色々開拓が進んでいますがスペック不足を感じる場面は今のところないですね。

おまけ

せっかくpaperとdockerを使ったんだからもうちょっと豪華なサーバーを建てたい!!
ってことでここからは、完全に遊びです。

使用するプラグインとバージョンは以下を利用しています。
BungeeCord-lastStableBuild
ViaVersion-5.6.0
voicechat-bukkit-2.6.6

どんなサーバーを立てるの?

dockerを利用することによって、環境を簡単に分けることができるのでその特性を活かしたいと思います。
具体的には、Bungeecordを利用しプロキシサーバーを建て、ViaVersionによって異なるバージョンのログインを可能にし、両者をつなぎたいと思います。言葉では非常に分かりづらいので図にするとこのような感じですね。(すべてOCI上で構築します。)image.png

Ex1.ファイルを書き換えよう

はじめにファイルを作成しましょう。(以後、先程使用していたminecraft-serverフォルダをmain-dataに名前を変更しています。)

mkdir proxy-data
mkdir battle-data

このようなフォルダ構成になっています。
image.png

ではまず、docker-compose.ymlの中身を書き換えます。
2つ目のサーバー(battle)は1.20.1でイベント用サーバーにしたいのでスーパーフラットでかつmobの湧きをなしにしています。また、simple voice chatを利用しているため、mainサーバーでは24454(UDP)、battleサーバーでは24455(UDP)のポート開放しています。

同じポートだと喧嘩してしまうのでずらしています。
ずらした先のポートにつながるようにvoicechat-server.properties内でport=24455に書き換えています。
また、simple voice chatを利用する場合は、OCIでのポート開放、ubuntuでのポート開放も合わせて必要になります。

services:
  # --- 1. プロキシサーバー  ---
  proxy:
    image: itzg/bungeecord
    container_name: mc-proxy
    # 手動起動のため restart は一旦外しています
    ports:
      - "25565:25577" # 外(25565) -> 中(25577)
    environment:
      TYPE: "BUNGEECORD" # BUNGEECORDに変更
      MEMORY: "512M"
      UID: "1001"
      GID: "1001"
      TZ: "Asia/Tokyo"
    volumes:
      - ./proxy-data:/server

  # --- 2. メインサーバー (Paper 1.21.1 / 16GB) ---
  main:
    image: itzg/minecraft-server
    container_name: mc-main
    ports:
      - "24454:24454/udp" # VC用
    environment:
      EULA: "TRUE"
      TYPE: "PAPER"
      VERSION: "1.21.10"
      MEMORY: "16G"
      ONLINE_MODE: "FALSE"
      UseModernPaperChatEvent: "true"
      UID: "1001"
      GID: "1001"
      TZ: "Asia/Tokyo"
      USE_AIKAR_FLAGS: "true"
      
    # これを入れると spigot.yml の bungeecord: true が自動設定されます
      CFG_SPIGOT_SETTINGS_BUNGEECORD: "true"
    
    volumes:
      - ./main-data:/data

  # --- 3. バトルサーバー (Paper 1.20.1 / 4GB) ---
  battle:
    image: itzg/minecraft-server:java17
    container_name: mc-battle
    # 手動起動なら restart: always は無しでOK
    ports:
      - "24455:24455/udp" # VC用
    environment:
      EULA: "TRUE"
      TYPE: "PAPER"
      VERSION: "1.20.1"
      MEMORY: "4G"
      ONLINE_MODE: "FALSE"
      UID: "1001"
      GID: "1001"
      TZ: "Asia/Tokyo"
    
      
      #スーパーフラット
      LEVEL_TYPE: "FLAT"
      
      #構造物なし
      GENERATE_STRUCTURES: "false"
      
      #Mob湧きなし
      SPAWN_MONSTERS: "false"
      SPAWN_ANIMALS: "false"
      SPAWN_NPCS: "false"
      
      #ネザーを無効化 (server.properties)
      ALLOW_NETHER: "false"
      
      #エンドを無効化 (bukkit.yml)
      # ※ itzgイメージの機能で "settings.allow-end" を書き換えます
      BUKKIT_SETTINGS_ALLOW__END: "false"

      #BungeeCord設定
      CFG_SPIGOT_SETTINGS_BUNGEECORD: "true"
      
    volumes:
      - ./battle-data:/data

少し解説します。
mainサーバーでは、

image: itzg/minecraft-server

battleサーバーでは、

image: itzg/minecraft-server:java17

このように記述することでmainサーバーとbattleサーバーで使用するjavaのバージョンを変更することができます。便利でいいですね~!
その後、ファイルを生成するために一度コンテナを起動します。

#各種コンテナ起動
docker compose up -d proxy
docker compose up -d main
docker compose up -d battle

もしかしたら、docker compose up -dで一斉に起動すると、処理が重すぎてサーバーが落ちてしまうかもしれません。(自分はOSがクラッシュしました...)なので、個別で起動してあげるほうが良いかもしれません。

起動を確認したら、コンテナを停止します。

#停止
docker compose down

その後、以下を参考に各フォルダ内のpluginsフォルダにプラグインを導入します。

・proxy-data
ViaVersion
・main-data
ViaVersion
voicechat
・battle-data
ViaVersion
voicechat

その後もう一度、コンテナを再起動、停止します。
では、生成されたファイルを変更していきましょう。

まず、proxy-dataフォルダ内のconfig.ymlを編集します。
変更箇所を抜粋します。

ip_forward: true

servers:
  main:
    motd: 'サバイバル鯖'
    address: mc-main:25565
    restricted: false
  battle:
    motd: '&1バトル鯖'
    address: mc-battle:25565
    restricted: false

次にmain-dataです。
spigot.ymlの内容を編集します。

settings:
  debug: false
  # ▼ ここを true に変更 ▼
  bungeecord: true
  sample-count: 12
  player-shuffle: 0
  user-cache-size: 1000

次に、server.propertiesです。

online-mode=false

最後に、battle-dataです。main-dataと同様に、spigot.ymlとserver.propertiesの内容を変更します。

・spigot.yml

settings:
  debug: false
  # ▼ ここを true に変更 ▼
  bungeecord: true
  sample-count: 12
  player-shuffle: 0
  user-cache-size: 1000

・server.properties

online-mode=false
#ここをfalseにしないと繋がりませんでした
enforce-secure-profile=false

simple voice chatを利用する場合のみ追加で、plugins/voicechat内の
・voicechat-server.properties

#docker-composeで指定したので
port=24455

に変更しておきます。

docker-compose.ymlで、

CFG_SPIGOT_SETTINGS_BUNGEECORD: "true"

としたので上記の設定はすべて自動でされていると思いますが、一応念の為。

Ex2.起動してみよう!!

それでは、コンテナを順番に起動していきます。

docker compose up -d proxy
docker compose up -d main
docker compose up -d battle

参加方法は、以前と全く同じでサーバーアドレスにOCIのパブリックIPを入力してください。まず、バージョン1.21.10で参加してみます。
参加するとまず初めは、mainワールド(サバイバル鯖)に飛ばされます。
その状態で

/server battle

と入力します。
image.png

すると、ロード画面が流れ、
image.png

このように、もう1つの鯖であるbattleワールドに移動することができました!!

実際にバージョンも1.20.1であることがわかります。
image.png

Ex3.おわりに

いかがでしたでしょうか。dockerを使用すると複雑なサーバー構成でも簡単に管理できることがわかったと思います。(途中いろんなエラーが出てめちゃめちゃ苦戦しましたが。)
すべてOCI上の無料枠だけで利用できているためそこもポイントが高いですね~。

長くなりましたが、そろそろ締めたいと思います。

ここまで読んでくださりありがとうございました!!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?