1時間でマイクラ鯖建ててみた！

# 事始め
発端は友人複数人とMinecraftをやっているときでした．
**友人「Java版でもマルチやりたいよね～」**
鳩「いやいやアパート住みだからポート開放でき…」
その時鳩に電流走る――――――――――！
サーバ化したノートPCに外からSSH接続する時**ngrok**とかいうのを使って擬似的にポート開放していた…それを応用してDockerでなんやかんややれば何かこういい感じに何かできるのでは！！？
というわけで1時間くらいウンウン言ってマイクラ鯖建てることが出来たので個人的備忘録&参考にと記事を書いてみました．中高生とかで回線を引けない人だったり，出先で急にマイクラ鯖を建てたくなった人に役に立てば良いなと思い書いております．
あんまりサーバーとかわかんない人でも建てれるように書くつもりですがあんまりサーバーとかわかんない人はこの記事を読まない気がします．サーバーとかよく分かる人はこの記事ちょっとくどいかもしれませんのでななめ読み推奨です．

# 材料 (6人分)
- Ubuntuの入ったPC　　　　 　 …1台
- Docker　　　　　　　　　　　…1匹
- ngrok　　　　　　　 　　 　…1摘み
- nohup　　　　　　　　　…お好みで

# 作り方
### サーバー
まずは**サーバー**です．Dockerを使用するので**Ubuntu**(LinuxOS)が入ったサーバー(PC)が望ましいですが，Win10入りデスクトップをWSL2を使いながら電源入れっぱなしでやるって猛者がいても良いんじゃないかなと思います．(超個人的意見としてはDocker for Windowsはうまく動作しない印象あるので素のUbuntuを推します．)
### Docker
サーバーが用意できたら次は**Docker**を導入しましょう．
そもそもDockerって何って人もいるかも知れませんね．ざっくりいうと開発環境とかデータベースとかのめんどうな環境構築をポチポチするだけで整えられる便利なツールです．知らなかった人はこれからドンドン使ってみましょう．(Dockerの記事も書きたいなぁ)
[これ](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja)読んだら大体できますが記事書いてるわけですし軽く説明挟みつつ紹介します．

まずはパッケージをインストールするための既存のパッケージリストの更新！

```bash
$ sudo apt update
```
Dockerダウンロードに必要なパッケージのインストール！

```bash
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
```
Dockerが入っているリポジトリのgpgキーを取ってきて保存！

```bash
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
aptでDockerをインストールできるようにする！

```bash
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
```
パッケージリストを更新！

```bash
$ sudo apt update
```
インストール先のリポジトリが変わっているのを確認して…

```bash
$ apt-cache policy docker-ce
```
Dockerをインストール！

```bash
$ sudo apt install docker-ce
```
これでUbuntuのターミナル上で

```bash
$ sudo docker --version
```
とか叩くとdockerが動いてることが確認できると思います．`sudo`なしでDockerを使えるようにしたい場合は先述の記事を参考にしてやってみてください．
### minecraftサーバのイメージ
無事Dockerを導入できたら次はマイクラ鯖を建ててみましょう！Dockerはちょちょいと触るだけで環境構築を済ませてしまうすごいやつなのでマイクラ鯖も既存のテンプレートを建てるだけで済んじゃいます．
[itzg/minecraft-server](https://hub.docker.com/r/itzg/minecraft-server)
ここにあるDockerのイメージ(環境構築が完了した，複製元のデータみたいなの)をDockerでインストールして建てちゃいましょう．

```bash
$ sudo docker pull itzg/minecraft-server
$ sudo docker run -d -p 25565:25565 --name mc itzg/minecraft-server
```
待てば出来上がり．

[追記]
…ではございません．
以下のログ確認を実行するとEULAがどーのこーの言われると思われます．

```bash
$ sudo docker logs mc
```
そのURLに貼ってある使用許諾契約を確認してください．
では次に行く前に，runに失敗してコンテナが止まってるので一旦消しておきましょう．

```bash
$ sudo docker rm `docker ps -alq`
```
では先程の規約を確認した上で同意する場合

```bash
$ sudo docker run -e EULA=TRUE -d -p 25565:25565 --name mc itzg/minecraft-server
```
を実行してください．こんどこそ待てば出来上がり．追記終わり．

では待ってる今のうちに軽く`-p 25565:25565 `の部分について説明を．
例えばGoogleChromeでhttp://www.google.com にアクセスするとGoogleのサイトを運営しているサーバーの住所(IPアドレス)を調べてそのPCに向かいます．IPアドレスとは`172.217.174.100`みたいな数字の羅列です．(ちなみにこの数字の羅列をURL打ち込む所に書くと[Google](172.217.174.100)に飛べます．)このサーバで行っているサービスは一つと限らないのでどのサービスを受けるのかを判別する必要があります．それを決めるのがポート番号です．
イメージとしては複数の企業が入ってるオフィスビルがサーバでそれぞれの階層にそれぞれ企業がいたり空き階だったりのその階層がポートみたいなものです．多分．
そしてこの記事ではオフィスビルはUbuntuの入ってるPCに，企業が入ってる階層は`-p 25565:25565 `の左の25565にあたります．サーバの25565階にたどり着くと今度はDockerの25565階に繋がるトンネルがあります．そのトンネルを通りDockerの25565階にたどり着くと，そこでマイクラのサーバ運営が行われているイメージです．
例えと実物をごっちゃに説明しちゃってますが気合で読んでください()．

さてマイクラサーバは立ちましたでしょうか．
現状どうなっているか，以下のコマンドで確認できます．

```bash
$ sudo docker logs -f mc
```
### ngrok
マイクラのサーバを建てることは出来たので後はUbuntuサーバにお客さんを招き入れるだけです．ポートを開放したいのですが私はアパート住み，ここの住所(IPアドレス)を出入り可能にしても何階の何号室に住んでる誰のオフィスビルに向かえばいいのか，僕のIPアドレスを訪ねる人にはわかりません．つまりポート開放ができません．
そんなあなたに**ngrok**！こいつもすごい．ポチポチするだけで個人の回線を引かずともポート開放を擬似的に行えちゃう！！アパート回線でも，外部と繋がれるngrokのトンネルをひくことで僕のお家のサーバへ直でアクセスできちゃう！
というわけでダウンロード&インストール
ダウンロードに必要なパッケージをインストールして…

```bash
$ sudo apt update
$ sudo apt install wget unzip
```
ngrokをダウンロードして…

```bash
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
```
解凍！！

```bash
$ unzip ngrok-stable-linux-amd64.zip
```
邪魔だしパスが通ってないと思うので動かしましょう．

```bash
$ sudo mv ngrok /usr/bin/ngrok
```
これで使えるはず(未検証 後で確認 ログインとか要ったかも)
現在サーバの25565番にアクセスするとマイクラのサーバにアクセスできます．そこに向けてトンネルを繋げてもらうので

```bash
$ ngrok tcp 25565
```

と叩くとそこに外部からアクセスできるURLが発行されます．
`tcp://X.tcp.ngrok.io:YYYYY`(X,YYYYYは数字)のようなURLが発行されると思われます．
これを使えば友人たちもJavaマイクラのマルチに誘えます！やったー！！！
Java版でマイクラを開いて「マルチプレイ」→「サーバーを追加」でサーバー名は自由に，サーバーアドレスは先程表示された「X.tcp.ngrok.io:YYYYY」(X,YYYYYは数字)にして参加するとみんなで遊べます！！
### nohup
ここは別にやらなくてもいいのですがサーバで他のプロセスも行わせたいと思った時，もしくはサーバのSSH接続を切断したい時，ngrokを停止しなければならなくなります．そのため裏で回しといてもらう必要があります．そこで役立つのが**nohup**です．ngrokでポート開放する時に

```bash
$ nohup ngrok tcp 25565&
```
と叩くだけでターミナルが返ってきます．でもこれではURLが確認できないので，

```bash
$ curl localhost:4040/api/tunnels
```
と叩くとngrokの状態などの情報が確認できます．上の方に"public_url"の項目があり，そこにURLがかいてあります．
これで完全にバックグラウンドにマイクラの鯖を建てることができました！！おめでとう！！！！

# 余談(ここまででブラウザを閉じても構いません)
ようやく建てたマイクラサーバですが結局友人ズは統合版で進めちゃったデータに夢中で誰も鯖に来ませんでしたとさ．

(´・ω・｀)

さらに余談ですが，今回の記事，Celeronは低電力でサーバーに良いと聞いたのでノートPCのWindowsをUbuntuServerで上書きしてサーバーにして行いました．ですがノートPCをサーバにするのは燃えるからよろしくないとのことなのでレンタルサーバを検討しています．(てことはレンタルサーバ借りちゃったらこの記事いらなくね)
まあきっと需要はどうしても鯖建てたいつよつよ高校生とかにあるだろう．