完全無料でそこそののスペックのMinecraftサーバーを建てる

# 追記 (2022/8/4)
[OCIアカウントが突然勝手に停止された](https://zenn.dev/shinshin86/scraps/022e44712274fd)という記事が公開されています。
自分も2つあるアカウントのうち1つ(ほぼ非アクティブ)がやられていました。
**突然停止される可能性があるのでもしOracleCloudを使う際はリスクを承知の上で運用してください。**

# はじめに
完全無料(初期費用・月額費用無し)でそこそののスペックを持つMinecraftサーバーの建て方

# 結論
早速結論ですが、Oracle社が提供しているクラウドのOracle Cloud InfrastructureでVM.Standard.A1.Flexサーバーを使うことで実現可能

# サーバーの建て方

## OracleCloudアカウントを作成する
こちらの記事で詳しく解説されています

https://qiita.com/manaki/items/d8684f8e15ccf09bdc4e

クレジットカードの登録は本人確認用で自分はデビットカードでも通りました。
Googleのようにアカウントが半強制的にアップグレードされて勝手に課金されていたなんてことがありますが~~(自分も前やらかした)~~、OracleCloudはアップグレードしなくても永久無料枠を使い続けられるのでトラブルを防げます

## インスタンスを作る

管理画面からコンピュート→インスタンスにアクセスして「インスタンスを作成」ボタンをクリックします。
カスタムするのは「イメージとシェイプ」の項目で、
OSは今回はUbuntuを使います。
Change Shapeをクリックして、Ampere→VM.Standard.A1.Flexを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701723/011b5cf3-fc99-676a-72ee-10f1fd0d385b.png)
そうするとインスタンスにどれぐらいリソースを割り当てるか選択する項目が出てくると思います
今現在、armインスタンスのMAX無料枠は4コア、24GBARMなのでその分MAX割り当てます。
公開鍵の設定とかもしたほうが良いです(セキュリティ的に)

作成をクリックするとインスタンスが作成されて状態が「実行中」になればシェルに接続できるのでsshで接続してください

## OSの設定

おまじない

```shell
$ sudo apt update
$ sudo apt upgrade
```

JREのインストール

```shell
$ sudo apt search openjdk-\(\.\)\+-jre$
$ sudo apt-get install (さっきサーチで引っかかったopenjdk-jreの最新バージョン)
$ java -version
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 16.0.1+9-Ubuntu-120.04, mixed mode, sharing)
```

バックグラウンドで実行するために必要なscreen

```shell
$ sudo apt install screen
```

## Minecraftサーバーのインストール
今回はSpigotのフォークであるPaperMCを使います

https://papermc.io/downloads

ダウンロードから最新バージョンをwgetなりsftpで転送なりしてサーバー側に送り込みます

まず最初に一度だけ`java -jar paper-x.xx-xx.jar`を実行してeulaに同意するファイルを生成します。
サーバーが終了されたらディレクトリ内にある`eula.txt`を開いて`eula=false`を`eula=true`に変更します。

起動用シェルスクリプトを作成して内容を以下のように編集します。

```shell
screen -DmS minecraft java -Xms20G -Xmx20G -jar paper-x.xx-xx.jar nogui
```

```shell
chmod +x ./start.sh
./start.sh
screen -r minecraft
```
これで実行権限を付与し、サーバーをスタートさせてサーバーのscreenセッションに接続します。

セッションから抜けたいときはCtrl+A、Ctrl+Dを押すとスクリーンをデタッチできます。
終了させたいときはscreen内で`stop`と打てば止まります
ここら辺はバニラ鯖と同じです。

## ポート開放
今回の一番厄介なところです
OCIのファイアウォールは他VPSやクラウドと比べて面倒で、インスタンス自体にかかってるファイアウォールとOS自体に書けられているファイアウォールの2種類を開放してあげる必要があります。
OS側は`iptables`が使用されています。

**注意** __間違っても`ufw`を使ってはいけません。バグります__

まずOS側から

```shell
$ sudo iptables -I INPUT 5 -p tcp --dport 25565 -j ACCEPT
$ sudo /etc/init.d/netfilter-persistent save
$ sudo /etc/init.d/netfilter-persistent reload
```

次にCloudから
インスタンス名をクリックしてインスタンスの詳細を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701723/ff021645-1a89-6dac-fce1-5e1563865b4d.png)
プライマリVNICのサブネットをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701723/7c8fa952-9caf-bbc8-440f-32a3046338f4.png)
`Default Security List for～`があるのでクリックします

イングレス・ルールの追加をクリックするとこのようなモーダルが開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701723/c08ab613-d015-6bde-6c7c-3e2102564c69.png)
以下のように設定します

|項目|値|
|---|---|
|ステートレス|オフ|
|ソースタイプ|CIDR|
|ソースCIDR|0.0.0.0/0|
|IPプロトコル|TCP|
|ソース・ポート範囲|(空欄)|
|宛先ポート範囲|25565|

設定したらイングレス・ルールの追加をクリックして設定は完了です。

## 実際に接続してみよう
Minecraftを起動してマルチプレイヤーからダイレクト接続でサーバーのグローバルIPを入力してみましょう。
正しく設定されていると正常に参加することができます！
お友達にIPアドレスを教えるなりして良きマルチライフを！

# ARMとは
今回使ったサーバーはARMCPUという一般のサーバー用CPUとは少し違うCPUを搭載しています
一般向けや普通のPCは`x64`または`amd64`というアーキテクチャのCPUが搭載されているはずです。
ですが今回使ったサーバーは`aarch64`というARM系のアーキテクチャを採用しているインスタンスです。

ARMはよく組み込み機器やスマホ・タブレットにも採用されているアーキテクチャです。
そのため、このサーバーでは動かないソフトウェアや自力でビルドしないとこのアーキテクチャでは動かないソフトウェアが出てくる可能性があります。