Cloud Foundry v2上でminecraftを動かしてアクセスする方法を調査(番外編）

# Cloud Foundry v2上でminecraftを動かしてアクセスする方法を調査(番外編）

[Cloud Foundry v2上でminecraftを動かしてアクセスする方法を調査](http://qiita.com/morikat/items/5c777708de4f4b272435)の番外編として

以前Qiitaに投稿した[『Cloudn PaaS v2(CloudFoundry)の Service(PostgreSQL & MySQL）に接続』](http://qiita.com/morikat/items/5c777708de4f4b272435)のchiselを応用すれば
ひとまずS3の永続化の課題は残るもののコンテナ上で動くminecraftへのproxyは実現可能なのでは？と推測し実験してみました。


## アクセスするまでの手順(minecraftサーバ+proxy側）

### Cloud Foundry上のコンテナ内で動かすminecraftアクセスする為に用意したcf-minecraft-chiselをclone

```bash
$ git clone https://github.com/morikat/cf-minecraft-chisel
$ cd cf-minecraft-chisel
```

###. サーバ起動に必要なeula.txtを追加する

```bash
$ echo 'eula=true' > eula.txt
```

### アプリをcloudfoundryにpushする

```bash
$ cf push minecraft-app
```
### chisel clientを起動する



```bash
$ ./chisel-bin/chisel_linux_amd64 client -v --keepalive 3s http://hogehoge.mybluemix.net 25565:127.0.0.1:25565
```

上記の場合
http://hogeohge.bluemix.net 部分は
pushしたアプリのURL

25565:127.0.0.1:25565部分は
chisel clientを動かすマシン上の25565:Cloud Foundry上のアプリからみたminecraft serverのIP:minecraft serverのポート

macやwindows上でchisel clientを動かす場合は

chisel-bin配下にそれぞれのバイナリを格納しているのでそちらを利用する

```bash
$ ls chisel-bin/
chisel_darwin_amd64  chisel_linux_amd64  chisel_windows_386.exe
```

### アクセスするまでの手順(minecraftクライアント側）

chisel経由でcloudfoundry上のminecraftへアクセス

### マルチプレイを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/37192/72ae7d8a-b4e3-e964-15cd-444df5fe3d1c.png)

### サーバ追加
![image](https://qiita-image-store.s3.amazonaws.com/0/37192/4facec51-f4f8-f13c-8088-a7fa89bdff95.png)

### サーバ追加画面
![image](https://qiita-image-store.s3.amazonaws.com/0/37192/ec3b7472-0caa-da38-7378-8cae1c948aa2.png)

サーバ名は分かりやすい名前に設定し、サーバアドレスはchisel clientを起動させたマシンとポートを指定して完了をクリック

### 追加したサーバへ接続
![image](https://qiita-image-store.s3.amazonaws.com/0/37192/7ad4abd8-9fd4-5e3c-0d68-85782d5db182.png)
サーバに接続をクリックしてサーバに接続を行う

### ワールド画面
![image](https://qiita-image-store.s3.amazonaws.com/0/37192/51ea1092-a538-3bc5-1e8a-fc9862772eef.png)

## 動作原理解説

### [cf-minecraft-chisel](https://github.com/morikat/cf-minecraft-chisel)（アプリ自体）

#### eula.txt(手動で追加するファイル）
minecraftのサーバはeula.txtにeula=trueという値を入れると
[EULA](https://account.mojang.com/documents/minecraft_eula)に同意したことになる
※それぞれが同意する必要があるので手動で格納という形にしている）

#### chisel-bin配下
proxy経由でcloud foundryのコンテナ内のアプリにアクセスする為のバイナリが格納されている

#### manifest.yml
内部で使うminecraft用buildpackのブランチを指定
メモリは512M指定をデフォルト指定で必要に応じて変更を行う

#### minecraft_download_url.txt
minecraft用のbuildpack側でこの中のURLの値を使ってサーバのjarファイルをダウンロードする

#### start_minecraft.sh
cloudfoundry上でminecraftサーバを起動する際のコマンド
manifest.ymlのmemoryの値に応じてこちらも変更を行う

### [heroku-buildpack-oracle-java](https://github.com/morikat/heroku-buildpack-oracle-java/tree/minecraft)(buildpack側)

minecraftブランチをminecraft用に変更している
fork元オリジナルのbuidpackは[こちら](https://github.com/trautonen/heroku-buildpack-oracle-java)

#### bin配下

##### detect
eula.txtがあるかどうかでminecraftのbuildpackを適用するか判断

#### compile
1. JDKをインストール
2. minecraft_donwload_url.txtの値を使ってminecraftのjarファイルを取得
3. proxy用のchiselをダウンロード

#### lib配下

##### utils
compile部分で呼ぶfunction定義などが格納

## 残課題

### s3などに対応させて永続化

[heroku-buildpack-minecraft](https://github.com/jkutner/heroku-buildpack-minecraft)のように
s3cmdを使って60秒間隔でwhileを使ってs3とsyncさせる等の工夫が必要

### Cloud Foundry側のコンテナ内で動くminecraft serverのプロセスが死んだ場合のリカバリ

通常Cloud Foundryのアプリケーションであればプロセスが死んだ場合は、自動でインスタンスを起動させる仕組みが存在している

現状のcf-minecraft-chiselの対応だとプロセスの監視対象がchiselのサーバ側になっている為、実用的にするにはこちらも対策が必要