Hacobuneでマイクラサーバを(無理矢理)起動してみた

Hacobuneで遊んでみましたのでメモを残しておきます。

https://www.sakura.ad.jp/information/announcements/2021/08/12/1968207782/

### この記事の概要

- Hacobuneはインターネット経由でのアプリケーションへのアクセスにはhttpsのみ対応
- マイクラみたいなサービスはそのままだと接続できない
- httpsはOKなので、WebSocketでトンネルすればいけるかな? -> 出来た

### おことわり

この記事はいわゆる「試してみた」系です。認証など適当に扱ってますのであくまで参考程度と思っていただければ。

## マインクラフトサーバを起動してみる(ダメなパターン)

まずはマイクラサーバを起動してみます。
**後述しますがこの手順だけだとクライアントから接続できません。**

Dockerイメージは`itzg/minecraft-server`を利用します。

https://github.com/itzg/docker-minecraft-server

ということで早速Hacobuneの操作をしてみます。

### コントロールパネル

適当にプロジェクトを作り、アプリケーションの新規作成をしてみます。

#### イメージ

イメージには先程の`itzg/minecraft-server`を指定し、ポートはマイクラサーバのデフォルト`25565`を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/c42414e2-d379-3fca-6037-8fa2a8acb948.png)

#### 環境変数

環境変数には`EULA=TRUE`を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/9d9b54e0-9828-c6ff-a342-6cb5871a771a.png)

起動引数と設定ファイルの欄は空でいいです。

#### 外部公開

外部公開を有効にし、適当なドメインを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/fa54572f-d910-80e8-c962-2425a529755e.png)

ちゃんと調べていませんが全ユーザー通じて一意じゃないといけないっぽい..??
↑の画像みたいに枠が赤くなってたらダメっぽいですね。

#### 永続化

`itzg/minecraft-server`は`/data`にデータを格納するようなのでボリュームを割り当てておきます。
まずボリュームを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/f1089406-58fa-8dc4-e559-14f28c316c0d.png)

その後`/data`にマウントします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/b8467e22-83f0-4ef0-bcb1-661556ca7a5a.png)

あとは保存を押して起動を待つだけです。

しばらく待つとURLが表示されるはずです。
![スクリーンショット 2021-08-19 16.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/610b420f-5dfa-b997-dc85-c9c96a313472.png)

このURLを控えてクライアントから接続してみます。
ここでは`minecraft.c1.hacobuneapp.com`ですね。

## クライアントからつなぐ(ダメなパターン)

マインクラフトを起動し、「マルチプレイ」を選択、サーバに接続してみます。
(後で気づきましたがクライアントのバージョンが古いですね。。。)

先程控えた`*.c1.hacobuneapp.com`にポート番号`443`をつけてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/cadd8ece-5b23-11f2-27bb-e01312ea0640.png)

さてこれでつながるはず、、、

が、こんなエラーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/5ae123a9-a410-8fa4-6ba7-96fb1229ec01.png)

### Hacobuneアプリケーションへのインターネットからの接続はHTTPSのみ対応

あれ?Hacobuneの外部接続ってどうつながるんだっけ?と思いマニュアルを確認したらちゃんと**httpsのみ対応**と書いてありました…

![スクリーンショット 2021-08-19 16.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/d4202014-bccc-25d5-f290-d83f48ac00cf.png)

https://manual.c1.hacobuneapp.com/docs

マイクラみたいにHTTPSじゃないサービスを公開するのはできないってことですね。。。

## よろしい、ならばWebSocketだ

HTTPSがつながるってことはWebSocketはOKということですよね、ということでマイクラサーバへの接続をWebSocketでトンネルする方法を試してみることにしました。

## マインクラフトサーバを起動してみる(WebSocket版)

TCP接続をWebSocketでトンネルしてくれるようなやつがいればいいですね。
ちょっと探したらこんなのが見つかりました。

https://kazeburo.hatenablog.com/entry/2018/10/22/164546

これを使って、クライアント側とサーバ側でそれぞれ`wsgate`を起動してマイクラのTCP接続をトンネルしてあげればよさそうです。

Hacobuneのマニュアルによると、
> 同じプロジェクト配下に作成されたアプリケーション同士は設定したホスト名で通信することができます

とのことなので、Hacobune上では

- WebSocketサーバ
- マイクラサーバ

の2つのアプリケーションを起動し、WebSocketサーバの方を外部公開してHTTPS経由でアクセスさせるようにします。
クライアント側はマイクラと同じマシンで`wsgate`を起動すればよさそうです。

ということでまずはHacobune側を設定します。

### マインクラフトサーバの設定変更

先程起動したマインクラフトサーバを編集し、外部公開を無効にします。
後ほどwsgate-serverで必要になるためアプリケーション名は控えておきます。

### wsgate-serverの起動

次にwsgate-serverを起動します。
Dockerイメージがなさそうなため、↓のようなDockerfileを用意しました。  

```docker
FROM ubuntu
MAINTAINER Kazumichi Yamamoto <yamamoto-febc@gmail.com>

RUN apt-get update; \
    apt-get install -y ca-certificates curl zip; \
    apt-get clean; \
    curl -LO https://github.com/kazeburo/wsgate-server/releases/download/v0.4.0/wsgate-server_linux_amd64.zip; \
    unzip -j wsgate-server_linux_amd64.zip wsgate-server; \
    rm wsgate-server_linux_amd64.zip; \
    mv wsgate-server /usr/local/bin/

ENTRYPOINT ["/usr/local/bin/wsgate-server"]
```

自分でビルドしてDockerHubにpushするなりリポジトリを用意するなりします。

次にHacobune上でアプリケーションを起動します。
設定は以下のような感じです。

- ポート: `8086`
- 起動引数: `--map /map.txt --listen 0.0.0.0:8086`
- 設定ファイル: `/map.txt`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/31460cd8-43c7-757c-aeeb-1832072aaeaf.png)

起動引数で指定している`--map`は、どのパスにリクエストが来たらどこにトンネルするというマッピング情報です。
これは以下のように作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/849c2670-2605-04b1-64c9-999808b2d432.png)

`minecraft`というパスにリクエストが来たら`minecraft-server`という名前のアプリケーションの25565ポートへというものですね。
この設定だと最終的に`https://<Hacobuneが割り当てたURL>/proxy/minecraft`というパスになります。

あとは忘れずに外部公開を有効にしてURLを控えておきます。

## クライアントからつなぐ(WebSocket版)

クライアント側では`wssgate-client`を起動しておき、マインクラフトからはそちらにつなぐことでWebSocketでトンネリングしてHacobune上のサーバに接続します。

まずwssgate-clientを起動します。
サーバ側と同じくマッピングファイルが必要なので以下のように作成します。

```txt
0.0.0.0:25565,https://<Hacobuneが割り当てたURL>/proxy/minecraft
```

そして起動します。

```bash
$ wsgate-client --map map-client.txt
```

次にマインクラフト側です。
今度はサーバの接続先を`wsgate-client`にするため`localhost`にします。

これで繋がりますね！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/ee0eb6ec-9392-308b-3379-73d3ecb5032b.png)

軽く遊んでみましたが十分遊べそうな感じでした。

## 終わりに

多分にカッとなってやった感ありますが、無理矢理マイクラサーバを起動し遊ぶことができました。

Hacobuneは

> オープンβ版提供期間中は無料でご利用いただけます

とのことなのでもうちょっと遊んでみようかと思ってます。

以上です。