海外VPSのVULTRでMinecraftを動かしてみた

# まず初めに
この記事は、

* minecraft大好き
* 家でサーバーを動かしたくない
* かといって、VPSを月極で借りるのは高い
* そもそも24時間遊んでるわけじゃない

などの理由で、時間借りしたい人におすすめです。
しかし、大半のVPSはインスタンスを削除しなければ課金が止まりません。
これでは、誰も接続していない時間も課金されてもったいないです。
そこで、使ってないときは削除して、遊びたいときに簡単に復旧できるようにしました。

# VPSの選定
* AWSはメモリの大きなプランは高い
* GCPはもっと高い
* IDCFは(ry

ので、候補として

* DigitalOcean
* このは
* vultr

が上がり、

* メモリの大きなインスタンスが安い
* 東京リージョンがある
* 無料枠がある

という点から、vultrになりました。

以下の記事を参考にしています。
> 海外VPSのVULTRでCoreOSを動かしてみた by @ta_kousuke http://qiita.com/koh-taka@github/items/36ffbbfd7d1145a80972

上記の記事に倣って、私もリンク貼っておきます。
http://www.vultr.com/?ref=7109367-3B
20ドルの無料枠がもらえるらしいですよ！
後述の設定だと、一時間0.08ドル～0.23ドルなので割と遊べちゃいます。

# 前提条件
まず、いくつか必要なものがあります。

* ローカルで動いてるMinecraftサーバー
* SSHでrsyncできるサーバーとその秘密鍵
* httpでzipが配信できる事

まず、ローカルでMinecraftサーバーを起動し、ワールドを生成しておきます。

次に、sshでrsyncできるサーバーを用意し、秘密鍵を登録しておきます。
http://yanor.net/wiki/?UNIX%2Frsync%2Frsync%E5%B0%82%E7%94%A8%E3%81%AE%E7%A7%98%E5%AF%86%E9%8D%B5%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B5%E3%83%BC%E3%83%90%E9%96%93%E3%81%A7rsync%E3%81%99%E3%82%8B
私は、ここを参考にSSHでログインできないようにしました。
また、/home/hoge/save-201702などを作成しておき、その中にサーバーのワールドを突っ込んでおきます。

最後に、ローカルで動いてるサーバーをzipで圧縮します。
この時、ワールドの入っているフォルダ（今回はsaveフォルダ)を含まないようにします。
そしてそのzipをhttpでvultrからアクセスできる範囲に置いておきます。
私は、さくらVPSに置いていますが、vultrの最小構成(月5ドル)に置くのもありかもしれません。

# スタートアップスクリプト
vultrでインスタンスを作成する際に指定できる、スタートアップスクリプトを使い、設定から起動までやってしまいます。
Ubuntuの16.10 x64を使うことを前提にしています。
あと、めんどくさいのでrootで動かしてます。適宜変更してください。
毎回消すからいいよね（　＾ω＾）・・・
手順は

1. aptでjdkとunzipを導入
2. サーバー本体をwgetして配置
3. ramdiskを用意
4. rsync用のカギを用意
5. rsyncで最新のワールドを取得
6. 定期バックアップ設定
7. 起動スクリプトの登録
8. 起動

となります。

## aptでjdkとunzipを導入
```bash
apt update
apt install default-jre unzip -y
```
説明するまでも無いでしょう

## サーバー本体をwgetして配置
```bash
wget https://hoge.net/minecraft/minecraft.zip -O /root/minecraft.zip
unzip /root/minecraft.zip -d /root
```
/root/minecraft/minecraft/
とならないよう、注意してください。

## ramdiskを用意
```bash
mkdir /mnt/ramdisk
chmod 775 /mnt/ramdisk
chown ${USER} /mnt/ramdisk
mount -t tmpfs -o size=1g tmpfs /mnt/ramdisk
```
ramdiskを1GB用意しています。
足りなければ増やしてください。

## rsync用のカギを用意
```bash
mkdir -p /root/.ssh
chmod 600 /root/.ssh

#取得用秘密鍵
echo "-----BEGIN RSA PRIVATE KEY-----
hoge
-----END RSA PRIVATE KEY-----" > /root/.ssh/id_rsa_for_restore

#更新用秘密鍵
echo "-----BEGIN RSA PRIVATE KEY-----
fuga
-----END RSA PRIVATE KEY-----" > /root/.ssh/id_rsa_for_backup

chmod 600 /root/.ssh/id*
```
rsyncしか許可しないsshの都合上、コマンド毎に鍵が必要でした。

## rsyncで最新のワールドを取得
```bash
rsync -azvv -e 'ssh -i /root/.ssh/id_rsa_for_restore -o "StrictHostKeyChecking no"' minesync@hoge.net:/home/minesync/save-201702 /mnt/ramdisk
ln -s /mnt/ramdisk/save-201702 /root/minecraft/save
```
今回はワールドを保管するサーバー側のユーザー名をminesyncにしています。

## 定期バックアップ設定
```bash
cat <<EOS > /root/minecraft/save.sh
service minecraft command save-all
sleep 10s
rsync -azvv -e 'ssh -i /root/.ssh/id_rsa_for_backup -o "StrictHostKeyChecking no"' /mnt/ramdisk/save-201702 minesync@hoge.net:/home/minesync
EOS
chmod +x /root/minecraft/save.sh
(crontab -l 2>/dev/null; echo "*/5 * * * * /root/minecraft/save.sh > /dev/null 2>&1") | crontab -
```
5分ごとに自動セーブし、rsyncで同期してます。

## 起動スクリプトの登録
```bash
cat <<'EOF' > /etc/init.d/minecraft
#!/bin/bash
# /etc/init.d/minecraft
# version 0.4.2 2016-02-09 (YYYY-MM-DD)
#
### BEGIN INIT INFO
# Provides:   minecraft
# Required-Start: $local_fs $remote_fs screen-cleanup
# Required-Stop:  $local_fs $remote_fs
# Should-Start:   $network
# Should-Stop:    $network
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description:    Minecraft server
# Description:    Starts the minecraft server
### END INIT INFO

#Settings
SERVICE='forge-1.7.10-10.13.4.1566-1.7.10-universal.jar'
SCREENNAME='minecraft_server'
OPTIONS='nogui'
USERNAME='root'
WORLD='save'
MCPATH='/root/minecraft'
BACKUPPATH='/media/remote.share/minecraft.backup'
MAXHEAP=7
MINHEAP=6
HISTORY=1024
CPU_COUNT=2

(省略)
EOF
chmod a+x /etc/init.d/minecraft
update-rc.d minecraft defaults
```
http://minecraft.gamepedia.com/Tutorials/Server_startup_script
ここのまんまなので、省略しました。
CPU_COUNTやHEAPはインスタンスによって変えた方がいいかもです。

## 起動
```bash
service minecraft start
```

まとめたものが、以下になります。
http://pastebin.com/PDhXCv96


## スタートアップスクリプトの登録
vultrのコンパネから、Servers>Startup Scriptsと行って作成したスクリプトを登録し名前を付けます。

# サーバーの起動
今回のサーバーは、ローカル環境でもRAMDISK上でなければまともに遊べないくらい重い＆メモリを6GBくらい消費するので、

> 150GB SSD プラン 月額80ドル　一時間0.119ドル

のプランを借ります。
サーバーを作成するときに、スタートアップスクリプトを選択して作成すれば、インストール完了時に実行され、minecraftサーバーが立ち上がってくるはずです。
遊び終わったら、5分くらい待ってからインスタンスをdestroyしてください。
止めるだけだと、課金が止まりません。
cronで自動的にサーバーは同期されているはずなので、次回起動時に同じようにスクリプトを指定して起動すれば、つづきからできるはずです。


# 今後の課題

* 毎回IP変わってマイクラの設定を書き換えるのがめんどくさい
* そもそも、起動がめんどくさいのでAPIを使っていい感じにする