GCPでMastodonを構築

[Mastodon公式ページ](https://github.com/tootsuite/mastodon)と[Qiitaの記事「AWSのEC2で最小限の努力でmastodonを構築する」](http://qiita.com/tsuitta_dayo/items/dfd659ec68435653d16a)を参考にGCP(Google Cloud Platform)でMastodonを構築してみた。

# 手順
## GCE(Google Compute Engine) 構築
- [GCEにアクセス](https://console.cloud.google.com/compute/instances)
- インスタンスを作成をクリック
    - 名前を適当に
    - OSはUbuntu 16.04 LTS
    - ファイアウォールでHTTP, HTTPS両方にチェックを入れて作成
    - mastodonはけっこうリソースを食うらしいのでmicroでは物足りないかも。今回この記事を書くときはmicroでやってみる。
- [ファイアウォールルール](https://console.cloud.google.com/networking/firewalls/list)にて「ファイアウォールルールを作成」をクリック
    - 名前を適当に
    - ソースIPの範囲を0.0.0.0/0へ
    - プロトコルとポートをtcp:3000へ

## GCE上で必要なモジュールのインストール
- [GCEにアクセス](https://console.cloud.google.com/compute/instances)
- 先程作ったインスタンスの「接続」でSSHをクリックしてリモートログイン
- コマンドを打つ（docker.io, docker-composeのインストール）

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python3-pip docker.io
$ sudo pip3 install docker-compose
```

- Mastodonを持ってくる

```
$ git clone https://github.com/tootsuite/mastodon.git
```

## SendGridの設定
- [公式ページ](https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid)に従って設定を行う
- 「インスタンス上で Postfix を使用してメールを送信する」ができればOK、以降は実施不要

## Mastodonの設定
- 鍵を3回生成（1回目だけすごく時間かかる。出力結果をどこかにメモしておくこと）

```
$ sudo docker-compose run --rm web rake secret
$ sudo docker-compose run --rm web rake secret
$ sudo docker-compose run --rm web rake secret
```

microだとおそらくOut of memoryが出る。その場合、[スワップファイルを作るんじゃ.sh
](http://qiita.com/tsuitta_dayo/items/dfd659ec68435653d16a#%E6%89%8B%E9%A0%86
)を参考に以下のコマンドを打つ。

```
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```

- 設定ファイルを作る

```
$ cd  /home/${ユーザ名}/mastodon
$ cp .env.production.sample .env.production
$ vi .env.production
```

変更点だけ記載

```
LOCAL_DOMAIN=${GCEの外部IPアドレス}
LOCAL_HTTPS=false

PAPERCLIP_SECRET=${鍵の内容}
SECRET_KEY_BASE=${鍵の内容}
OTP_SECRET=${鍵の内容}

DEFAULT_LOCALE=ja

SMTP_SERVER=smtp.sendgrid.net
SMTP_PORT=2525
# ここAPIキーを使えそうな気もするけど、どうすれば良いのかわからなかった
SMTP_LOGIN=${SendGridのログイン名}
SMTP_PASSWORD=${SendGridのパスワード}
```
- DBの構築

```
$ sudo docker-compose run --rm web rails db:migrate
```
- コンパイル（時間かかる）

```
$ docker-compose run --rm web rails assets:precompile
```
- 実行（実行方法は2種類）

```
$ sudo docker-compose up # これで実行するとログが見れる
$ sudo docker-compose up -d # これで実行するとデーモン実行
```

` http://${GCEの外部IPアドレス}:3000 ` で接続可能。
このままだと使いづらいので80番からアクセスされた時に3000番に割り振るようフロントエンドサーバを立てる。

念のためMastodonを止めておく。

```
$ sudo docker-compose down # デーモン実行時もこのコマンドでOK
```

## lighttpdの設定
- インストール

```
$ sudo apt-get install lighttpd
```

- プロキシの設定

```
$ sudo lighty-enable-mod
→「Enable module:」が出てきたら「proxy 」と打つ
$  sudo vi /etc/lighttpd/conf-enabled/10-proxy.conf
→末尾に「proxy.server = ("" => (( "host" => "127.0.0.1", "port" => 3000)))」追加。
$ sudo service lighttpd restart
```

この後にMastodonを実行すれば80番ポートでアクセスできる。
（httpsで運用する方法は分からなかったので勉強中）

# 参考URL
Mastodon
https://github.com/tootsuite/mastodon
Qiita（AWSのEC2で最小限の努力でmastodonを構築する）
http://qiita.com/tsuitta_dayo/items/dfd659ec68435653d16a
GCP
https://console.cloud.google.com
SendGrid
https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid
lighttpd
https://help.ubuntu.com/community/lighttpd