はじめに
はじめまして!
普段はnoteで記事を書いているのですが、アドベントカレンダーたる面白いものを発見したので参加してみました!!
Qiitaで記事を書くのは、初めてですがMarkdownで記述できるのはいいですね~。
話がそれましたが、本記事はOracle Cloud Infrastructure Advent Calendar 2025 シリーズ3 22日目 と言うこと張り切っていきたいと思います!!
なにするの?
つい先日の話ですが、友人とゲームをしているときに「そういえばさぁ、いつでも入れるマイクラのサーバーないの? てか、建ててよ。」と言われまして。
そんな、無料でそこそこ性能のよいクラウドのサーバーなんて建てられるわけ...と思い色々と検索してみた結果、
見つけちゃったんですよね。
クラウドサービスといえば、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本線)から、インスタンスを選択します。
その後、 インスタンスを作成 と書かれた黒いボタンを押すとこのような画面になると思います。
では、順番に設定していきましょう!
補足:コンパートメントについて。
こちらの記事が非常にわかりやすいので、紹介させていただきます。
参考:https://solutions.system-exe.co.jp/oracle-cloud/blog/what-is-a-compartment
簡単にまとめると、リソースを分けるための部屋みたいなものです。
少し下にスクロールして、


補足:VNICについて、
自分も、あっさりとしか理解していないので説明はできないのですが、説明している記事を紹介させていただきます。(今度しっかり調べたいですね。)
https://wa3.i-3-i.info/word12850.html
https://wa3.i-3-i.info/word11973.html
暗号化技術ってこういうところで使用されているんだなあと感心しました。理論はよく学ぶのですが、実際に使うまでは実感が湧かないですね~。
そういえば、公開鍵、秘密鍵の仕組みを復習すると同時に興味深い記事を見つけたので紹介しておきます。
自分は、今まで間違った認識をしていたようです...
https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432
https://qiita.com/angel_p_57/items/19eda15576b3dceb7608
設定できたら次へを押しストレージに移ります。
ここまで設定できたら最後に間違いがないか確認して、右下の黒い作成ボタンを押してください。
ここで作成できた方はおめでとうございます👏
手順3にお進みください。
エラーが出てしまった方は、下の文章をお読みください。
なんでエラーになるの?
しっかりインスタンスの設定をしたのに、なんでエラーが出たの?と思っている方もいるかと思うので少し解説します。
今回使用する「Ampere」は非常に高性能なシェイプでありながら、無料で利用できるため大変人気があります。
しかし、無料プラン(Always Free)で提供されるAmpereのリソース量には、リージョンごとに限りがあります。 図のように、無料枠用のスペース(青い枠)は決まっており、ここが他の無料ユーザーさんで満員になってしまうと、空きができるまでインスタンスを作成できなくなります。(手書きですみません。)

じゃあ、無料では作れないの?と思う方もいらっしゃるかと思いますが、実はまだ方法があります。
対処法
2つ存在します。
1つは空きが出るまで粘ることです。自動化スクリプトを組んで常に空きが出ないか監視しておくことも可能なため絶対に無料プランがいい!って方は待つのも手ですね。
もう1つの方法が、有料プランにアップグレードし、無料枠内で使用する方法です。
どういうことか説明しますと、

こちら、先程示した写真になるのですが、赤丸で示した部分を見ていただくと、
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のメモリでシミュレーションを行ってみると、

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

有料プランへの変更方法については、こちらの記事をご参考ください。
変更にかなり時間がかかるみたいなので気長に待ちましょう。(自分は変更完了のメールが届くまで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を選び、以下のように選択します。
OKを選択すると、セキュリティ警告が出るので続行を選択します。
するとこのような画面になると思います。

Tera Termで鍵を認証する際に、フォルダ選択の画面で右下のファイルの種類をすべての種類に変更しないとダウンロードしたファイルが現れません。
Win SCPを利用することで、.ppkファイルに変換することが可能ですのでそちらを利用するほうが後々楽かもしれませんね。
その後、接続を押すと以下のような文章がコンソールに表れ無事接続できました。
*** System restart required ***
ubuntu@minecraft-v2-0:~$
・Win SCP
起動後、以下のように選択します。

ホスト名、ユーザー名についてはTera Termの時と同様ですので割愛します。
次に、設定をクリックしSSH技術を接続、認証を選択します。メニュー右側の秘密鍵より、ファイルを選択します。

保存後、ログインをクリックすると接続できます。
自分は、2つに分けて動かすのが面倒なのでVScodeの拡張機能RemoteSSHを利用します。
参考:https://soroban.highreso.jp/article/article-004
VScodeを使用する方は、こちらも読んでおくことをおすすめします。
参考:https://qiita.com/coatly/items/a392925346f091b49279
ポート解放をする
マイクラサーバーはデフォルトで25565のポートを利用してマルチプレイを行なっているので、該当するポートを解放してあげましょう。
まず、OCIのコンソール画面から、左上の3本線を押し、コンピュート内のインスタンス を選択します。
その後、作成したインスタンスを選択します。(表示されない場合はコンパートメントが正しいか確認してください。)
上のメニューでネットワーキングに変更しサブネットをクリック、上のメニューをセキュリティに変更します。

その中に保存されている青文字で書かれたサブネットをクリックします。
上のメニューでセキュリティー・ルールに変更し、イングレス・ルールの追加を選択します。
選択後、下の画像のように入力します。

これにて、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を打ち込むと参加できます。

接続できましたね!これにて完成です!!
3.まとめ
ところどころ専門的で難しい部分はありましたが、無事サーバーを立てることができ良かったです。いつかクラウドサービスを触りたいなあって思っていたところなので個人的にはかなり満足です。「クラウドを使ってみたいけど、何も内容がない!!」って方はぜひ挑戦してみてくださいね~!
自分が知らない間に街が発展していく感じが見ていて面白いですね。
いつの間に、こんな大規模なもの作ってんだ...
こんなふうに、色々開拓が進んでいますがスペック不足を感じる場面は今のところないですね。
おまけ
せっかくpaperとdockerを使ったんだからもうちょっと豪華なサーバーを建てたい!!
ってことでここからは、完全に遊びです。
使用するプラグインとバージョンは以下を利用しています。
BungeeCord-lastStableBuild
ViaVersion-5.6.0
voicechat-bukkit-2.6.6
どんなサーバーを立てるの?
dockerを利用することによって、環境を簡単に分けることができるのでその特性を活かしたいと思います。
具体的には、Bungeecordを利用しプロキシサーバーを建て、ViaVersionによって異なるバージョンのログインを可能にし、両者をつなぎたいと思います。言葉では非常に分かりづらいので図にするとこのような感じですね。(すべてOCI上で構築します。)
Ex1.ファイルを書き換えよう
はじめにファイルを作成しましょう。(以後、先程使用していたminecraft-serverフォルダをmain-dataに名前を変更しています。)
mkdir proxy-data
mkdir battle-data
ではまず、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フォルダ内の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
このように、もう1つの鯖であるbattleワールドに移動することができました!!
Ex3.おわりに
いかがでしたでしょうか。dockerを使用すると複雑なサーバー構成でも簡単に管理できることがわかったと思います。(途中いろんなエラーが出てめちゃめちゃ苦戦しましたが。)
すべてOCI上の無料枠だけで利用できているためそこもポイントが高いですね~。
長くなりましたが、そろそろ締めたいと思います。
ここまで読んでくださりありがとうございました!!










