GCEでMasotodonのインスタンスを作ってみた

流行りに乗って[Masotodon](https://github.com/tootsuite/mastodon)のインスタンスを作成したときのメモです。
GCE(Google Compute Engine)とDockerを使いました。
VMさえ何とかなれば、大体は無料でできると思います。

大まかな流れは、

1. GCEのVMを作る
2. Freenomでドメインを取得する
3. パッケージを導入する
4. Mastodonをセットアップする
5. Nginxをセットアップする
6. Mastodonを起動する

という感じです。
初投稿の拙い記事ですがご容赦ください。

# GCEのVMを作る
まずはMastodonのインスタンスを動かすマシンを用意します。[Google Cloud Platform Console](https://console.cloud.google.com)から適当にプロジェクトを作成し、`コンピューティング>VMインスタンス`を選択してください。なお、GCEを使うためにはクレジットカードの登録が必須だと思われます。[無料試用枠](https://cloud.google.com/free)が使えると良いですね。
さて、`インスタンスを作成`をクリックしたら、`名前/ゾーン/マシンタイプ/ブートディスク`を適宜指定しましょう。ここではそれぞれ、`qiita/us-east1-c/micro/Ubuntu 16.04 LTS`にしました。ブートディスクのサイズは30GBまで無料だそうです。(規約を確認してください)
その下の`ファイアウォール`にて`HTTPトラフィックを許可する` `HTTPSトラフィックを許可する`の2つにチェックを入れ、`管理、ディスク、ネットワーキング、SSH 認証鍵`を展開します。`ネットワーキング`タブを開き、`外部IP`で`新しい静的IPアドレス...`を選択し、適当な名前で予約しましょう。
ここまで来たら`作成`をクリックし、VMインスタンスを作成します。VMインスタンスが正常に作成されたことを確認したら、`外部IP`をしっかりメモってください。これから使います。

# Freenomでドメインを取得する
次は[Freenom](http://www.freenom.com)でドメインを取得します。サイトを見れば使い方は何となくわかると思います。ここでは、`example.tk`とでもしておきましょう。
希望のドメインが見つかったら`今すぐ入手!`で選択し、下部のチェックアウトをクリックします。`Use DNS`をクリックしたら、`Use Freenom DNS Service`タブの`IP address`入力欄に先ほどの`外部IP`を入力してください。`Period`は`12 Months@FREE`で良いと思います。
終わったら`Continue`をクリックしてください。サインインして終了です。なお、途中で個人情報の入力が求められますが、必須ではないです。
ドメインが有効になるまで時間がやや掛かるみたいなので、その間にVMを弄っていきましょう。

# VMを整備する
sshでVMに接続できるようにしてください。公開鍵をプロジェクト(VMインスタンスではない！)に登録すれば良いようです。接続できたら、
`$ sudo apt-get update && sudo apt-get upgrade -y`
しておきましょう。
次に、必要なパッケージを導入していきます。まずは[Docker](https://docs.docker.com/engine/installation/linux/ubuntu)です。次のコマンドを順に実行していってください。
`$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -`
`$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"`
`$ sudo apt-get update && sudo apt-get install docker-ce -y`
`$ sudo usermod -aG docker $USER`
続けて[Docker Compose](https://docs.docker.com/compose/install)も導入していきます。
`$ sudo su`
``# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose`` (最新のバージョンを使ってください)
`# chmod +x /usr/local/bin/docker-compose`
`# exit`
これでパッケージの導入はおしまいです。簡単ですね。一旦sshを終了し、再接続してください。

# Mastodonをセットアップする
いよいよMastodon本体を触っていきます。
適当なディレクトリに移動したら、
`$ git clone https://github.com/tootsuite/mastodon && cd mastodon`
してください。
`$ cp .env.production.sample .env.production`
で.env.productionを作成したら、
`$ vim .env.production`
で編集していきます。`LOCAL_DOMAIN`に先ほどFreenomで取得したドメインを入力し(ここでは`example.tk`)、`:wq`でvimから抜けてください。
次に、Mastodonをbuildしていくのですが、マシンタイプがmicroではメモリが足りないようです。そこで、swapの設定をしておきます。
`$ sudo su`
`# fallocate -l 2G /swap`
`# chmod 0600 /swap`
`# mkswap /swap`
`# swapon /swap`
`# echo '/swap swap swap defaults 0 0' >> /etc/fstab`
`# exit`
これでbuildの準備は整ったので、
`$ docker-compose build`
を実行しましょう。この過程でとても時間が掛かるので、半荘でも打っていてください。
buildが成功したら、
`$ docker-compose run --rm web rake secret`
でsecretを取得します。secretは最下行の長い文字列です。これをコピーしたら、
`$ vim .env.production`
で.env.productionを開き、`PAPERCLIP_SECRET` `SECRET_KEY_BASE` `OTP_SECRET`に設定します。
続いて、次の2つを実行してください。
`$ docker-compose run --rm web rails db:migrate`
`$ docker-compose run --rm web rails assets:precompile`
何が起こるか説明は省略します。
最後に、メール周りの設定とデータベースの永続化を施してMastodonのセットアップは終了です。この辺りは皆さんにお任せしたいと思います。(知識も経験もないので)

# Nginxをセットアップする
上記まででMastodonをローカルで実行することはできますが、まだ外部からアクセスできません。そこで、Nginxを用いてアクセスを実現するのが主流みたいです。(要出典)
まず、必要なパッケージを入れていきます。
`$ sudo add-apt-repository ppa:certbot/certbot -y`
`$ sudo apt-get update && sudo apt-get install certbot nginx -y`
次に、証明書を取得します。
`$ sudo certbot certonly --standalone --agree-tos -d example.tk` (自分で取得したドメインに書き換えることを忘れずに)
上手くいったことが確認できたら、[ここ](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md#nginx)から設定をまるごとコピーしてください。そして、
`$ sudo vim /etc/nginx/conf.d/mastodon.conf`
にペーストし、`example.com`を自分のドメインに書き換えてください(ここでは`example.tk`)。保存し終了するコマンドは`:wq`です。書き換える場所は全部で4箇所あったはずです。そのうち2箇所はファイルのパスだと思いますが、きちんと存在することを確認すると良いと思います。

# Mastodonを起動する
ここまでで自分のドメインにブラウザからアクセスしてみると、Nginxの初期画面(Welcome to nginx!)が出てくると思います。後は、
`$ docker-compose up -d`
でMastodonを起動し、
`$ sudo systemctl restart nginx`
でNginxを再起動してください。

お疲れ様でした。(覚え書きなので、どこかで間違っていたら超ごめんなさい)