AzureのUbuntuVMにマインクラフト・サーバーを設置する（ついでにJavaScriptプログラミングできるようにする）




[去年Azureに設置していたマインクラフトサーバー](http://watanabe-tsuyoshi.hatenablog.com/entry/2015/06/14/060026)を消してしまったんで、またやり直すことにしました。
AzureのVM設定手順など、多少変わっていたので改めてステップ・バイ・ステップで最新の手順としてQiitaに投稿することにしました。

#前提
* マインクラフト（クライエント）をインストールしている。
* Azureのサブスクリプションを持っている。
* Windows 10 Anniversary Update から操作する。

マインクラフトの購入や体験版などに関しては[このブログ記事がよさそう](http://neko-aquaalta.hatenablog.jp/entry/2015/09/20/044421)です。
[Windows 10 Anniversary Update](http://qiita.com/search?utf8=%E2%9C%93&sort=&q=Windows+10+Anniversary+Update)はどうしてもじゃないけど、bashシェルが使えるようになったのでssl接続するときに便利。[PuTTy](https://winscp.net/eng/download.php#putty)があればそれでもOK。

#手順１ AzureにUbuntuのVMを作る
まずはホストマシーンとしてVMを作る。OSはUbuntu Server 16.04 LTS（2016年9月現在最新）を選んだ。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/eb20e060-ccef-44d2-6aa2-a9a95f9fb990.png)

VMの新規作成手順の詳細は省く。Authentication TypeにはPasswordを選ぶ。
User NameとPasswordは後で必要なので書き留めておく。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/ef65fcfb-3626-153c-5889-02b181dc9f64.png)

#手順２ VMのDNS名を設定する
VMをスタートするとIPアドレスは設定されいるが、DNS名はまだ設定されていない。静的IPサービスを利用しない限りIPアドレスは一定ではないので、安定した別名としてDNS名を設定しておく。
以下は設定が完了した状態。PUBLIC IP ADDRESS/DNS NAME LABELのリンクからDNS名の設定画面に行ける。
![2016-09-04 16_35_36-Properties - Microsoft Azure.png](https://qiita-image-store.s3.amazonaws.com/0/103139/600bf7f3-076f-e380-fe07-142cef2c81fb.png)

#手順３ マインクラフトサーバー用にポートを開く
マインクラフトサーバーはデフォルトでポート25565でゲームクライエントからの接続を待ちます。しかし新規作成されたVMは25565を開いていないので、以下のようにポート25565へのInboundの接続を許可するルールを新たに加える。
ちなみにルールの名前はなんでも構わない。私はminecraft-server-portにした。
![2016-09-04 16_49_40-ywatanaubuntu16-nsg - Microsoft Azure.png](https://qiita-image-store.s3.amazonaws.com/0/103139/9f7f3d72-e620-04b9-7b31-12a087dd43a2.png)

#手順４ VMにssh接続する
Windows 10 Anniversary Updateから利用可能になったBashシェルを開く。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/20f4db6b-33f4-9087-ad88-3bf50ff65b7b.png)

次にsshコマンドを実行し、

`ssh <user>@<fully-qualified-domain-name>`

* `<user>` VM作成時に指定したUser Name
* `<fully-qualified-domain-name>` VM作成後に設定したDNS名

パスワードを聞かれたら、VM作成時に指定したPasswordを入力してssh接続を完了する。以下はsshコンソール内での作業。

#手順５ Ubuntu側でもマインクラフト・サーバー用のポートを開く
`iptables`コマンドを使って、ポート25565を新規ファイアウォール・ルールとして加える。AzureVMとUbuntuOSの両方でポートが開いて初めてクライエントが接続できるようになることに注意。
`sudo iptables -I INPUT -p tcp -m tcp --dport 25565 -j ACCEPT`

確認のため `sudo iptables -L`コマンドを実行して以下のように設定されていれば完了。
![2016-09-04 17_15_50-.png](https://qiita-image-store.s3.amazonaws.com/0/103139/1805092a-064b-9d83-7c64-fef9ef3217c8.png)

#手順６ 必要なツールをインストールする
次にjavaとgitをインストールする。
`sudo apt-get install openjdk-8-jre-headless`（javaはビルドおよびマインクラフトサーバーの実行に必要）
`sudo apt-get install git` （ビルドに必要）

#手順７ サーバー関連ファイル用の新規ディレクトリを作成
サーバーのファイル類を保存するためのディレクトリを作成する。名前はなんでも構わないが、サーバーには[Spigot](https://www.spigotmc.org)を使用するので`minecraft_spigot`と指定することにした。
`mkdir minecraft_spigot`

#手順８ SpigotサーバーのBuildToolsをダウンロードする
SpgotサーバーファイルはBuildToolsと呼ばれるjarファイルをローカルに保存し、それをJavaでビルドすることによって配布する形をとっている。
以下のコマンドを実行する。
`cd minecraft_spigot` （上の手順で作成したディレクトリに移動）
`wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastStableBuild/artifact/target/BuildTools.jar`
（このURLは常に最新の安定したバージョンを指している。）

目的のファイルがダウンロードされれば完了。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/a7684134-2b4e-3ec6-f612-4c67f781cc14.png)

#手順９ Spigotをビルドする
ダウンロードしたBuildTools.jarをJavaで実行することで自動的にGitレポジトリが複数クローンされ、成果物が生成される。ビルドが完了するのに5分～10分ぐらいはかかると思う。

`java -jar BuildTools.jar`

以下のようなjarファイルが生成されれば成功。このファイル以外にもいくつかアウトプットが生成される。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/135e2110-d7dd-5511-8d11-b00e7352f4a6.png)

#手順１０ EULA合意のために一旦マインクラフトサーバーを実行する
マインクラフトサーバーを初めて実行すると
`java -Xmx1024M -Xms1024M -jar spigot-1.10.2.jar nogui`

"You need to agree to EULA in order to run the server." というメッセージとともにサーバープロセスが終了する、と同時に`eula.txt`というファイルが生成される。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/a9ce9111-c2f1-c3b4-9e39-4ca920c2ad05.png)

EULAはEnd User License Agreement（利用許諾契約）の略。先に進むためには、`eula.txt`ファイルをエディターで開いて`false`を`true`にして保存しなくてはならない。
以下、nanoを使って編集した様子。

![image](https://qiita-image-store.s3.amazonaws.com/0/103139/bbf2c929-8135-455c-61ad-026da0251740.png)

#手順１１ いよいよサーバーを実行
コマンドは上の手順と全く同じだが、今回はEULAに合意済みなのでサーバーがロードされ実行が始まる。
`java -Xmx1024M -Xms1024M -jar spigot-1.10.2.jar nogui`

これを何度も打ち込むのは面倒なのでスクリプトファイルに保存しておく。

``` sh
echo java -Xmx1024M -Xms1024M -jar spigot-1.10.2.jar nogui > ./start.sh
chmod +x ./start.sh
```

以下のようなプロンプト画面になればサーバースタート完了。この状態でクライエントから接続できる。
![2016-09-04 18_58_02-ywatana@ywatanaubuntu16_ ~_minecraft_spigot.png](https://qiita-image-store.s3.amazonaws.com/0/103139/7877e728-30e7-6cec-7ac9-88ab0f8fd3c1.png)

#手順１２ クライエントからサーバーに接続する
マルチプレイヤーゲームを選択した後、ダイレクト接続を選ぶ。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/7f256ccf-565b-4168-253e-7ccf957136b8.png)

サーバーアドレスに手順２で設定したDNS名を入力する。IPアドレスでも構わないが、友達を招待して遊ぶ場合などDNS名の方が名前が変わらなくて便利。
![2016-09-04 19_11_11-Minecraft 1.10.2.png](https://qiita-image-store.s3.amazonaws.com/0/103139/5c92e160-d5ed-e55b-965e-0570b3e22ed0.png)

#完了！
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/41ce9ed4-eb5d-b638-987b-d5b23681381d.png)

#サーバーの終了の仕方
サーバーに接続して遊んでいない間は、課金されないようにVMをStopして置いた方が良いのは言うまでもない。その際、ゲームの内容が正しく保存されるように、まずマインクラフトサーバーは終了する。

![image](https://qiita-image-store.s3.amazonaws.com/0/103139/66215708-d366-cac7-f6e2-dfdcc3f99102.png)

#番外編 ScriptCraftプラグインでJavaScriptを使う

##手順１ ScriptCraftプラグインをダウンロード
まずScriptCraftを[ScriptCraftのgithubレポジトリー](https://github.com/walterhiggins/ScriptCraft/releases)から`scriptcraft.jar`を`plugins`という名前のサブ・ディレクトリーにダウンロードする。

``` sh
cd plugins
wget https://github.com/walterhiggins/ScriptCraft/releases/download/3.2.0/scriptcraft.jar
```

以下の目的ファイルがダウンロードされたら完了。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/66b8fa4f-51de-63f4-dce4-d8b540566866.png)

##手順２ ユーザーをOP（オペレータ）にする
ScriptCraftを使ってJavaScriptを実行するにはOP権限が必要。マインクラフトサーバーのコンソールから以下のコマンドを実行。（yoshionminecraftは私のユーザー名）

![image](https://qiita-image-store.s3.amazonaws.com/0/103139/da4fdedb-98fb-0a4a-24ac-e2c2ba11fbd8.png)


これでマインクラフトでJavaScriptプログラミングが出来る環境が整いました。
例えばマインクラフトのゲーム画面から以下を実行すると、幅5ブロック、高さ6ブロック、奥行き8ブロックの「石」でできた立方体を作ることができるようになります。
`/js box(blocks.stone, 5, 6, 8)`

[マインクラフトJavaScriptプログラミングの詳細はこちらから](https://github.com/walterhiggins/ScriptCraft/blob/master/docs/YoungPersonsGuideToProgrammingMinecraft.md)。