EC2+Dockerで自分ドメインのMastodon構築


自分ドメインのEC2でMastodonインスタンス構築する手順

- [Mastodon](https://github.com/tootsuite/mastodon)
- [Documentation](https://github.com/tootsuite/documentation)

### 環境

- EC2
	- Ubuntu 16.04
		- Resources Needed: https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Resources-needed.md

	- Security Group
		- Inbound SSH
		- Inbound ICMP
		- Inbount HTTPS
	- Elastic IPをassign

- その他
 - ドメイン・DNS: GoDaddy
 - メール配信: Mailgun
 - SSL: Let's Encrypt(Certbot)


## ドメイン・DNS

レジストラにGoDaddyを使う場合。
DNS設定でAレコードを追加し、Elastic IPへ向けておく。
`www.`なども使う場合はCNAMEレコードも追加。

名前解決できることを確認する。

```
$ dig $DOMAIN @8.8.8.8
```



## メール関連

登録時のメール配信のための設定にMailgunを使う場合。
Mailgunでドメインを追加したら

- https://app.mailgun.com/app/domains/$DOMAIN

で`Default SMTP Login`/`Default Password`を確認する。（あとで使う）
![Screen Shot 2017-04-26 at 1.39.24.png](https://qiita-image-store.s3.amazonaws.com/0/281/c9a7f70b-de2e-a68a-b679-d5ffc8dbc554.png "Screen Shot 2017-04-26 at 1.39.24.png")



続いて`Domain Verification & DNS`のTXT,MXのレコード設定を確認。

![Screen Shot 2017-04-26 at 1.38.04.png](https://qiita-image-store.s3.amazonaws.com/0/281/2f75c189-6810-c583-a0fd-33de681ae616.png "Screen Shot 2017-04-26 at 1.38.04.png")

この4件をレジストラ側で追加する。
完了するとMailgun上でドメインがVerifyされてメールが送れるようになる。







## Certbot

Let's Encryptの無料SSL証明書を取得する。

- [Certbot](https://certbot.eff.org/)

環境（今回はUbuntu16.04 x nginx）に合わせた[インストール指示](https://certbot.eff.org/#ubuntuxenial-nginx)を読む。


```
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot
$ certbot --version
certbot 0.11.1
```

うまくいけば一度しか使わないが、使い方を一応見ておく。

```
$ certbot -h
```

次のコマンド実行は何度も設定不備でエラーになると一定時間ロックされてしまうので注意。
ドメインの名前解決ができること,セキュリティグループでポート443番が空いていることを確認する。

ドメインはカンマはさんで複数指定可能。

```
$ sudo certbot certonly --standalone -d $DOMAIN,$DOMAIN2,...

$ sudo ls -R /etc/letsencrypt/live/
```

## Docker
普通に`rails s`するだけでも大体の動き確認はできるが、`docker-compose`を使う。

インストールして起動まで。

```
$ sudo apt-get update

$ sudo apt install docker.io
$ docker -v
Docker version 1.12.6, build 78d1802

$ sudo apt install docker-compose
$ docker-compose -v
docker-compose version 1.8.0, build unknown

$ sudo service docker start
$ sudo usermod -aG docker $(whoami)
$ exit
```

ログインし直す。

```
$ docker ps   
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```






## Mastodon

本丸のソースコードを取得し、タグ付きバージョンに切り替える。

```
$ git clone https://github.com/tootsuite/mastodon
$ cd mastodon
$ git tag | tail -1
v1.2.2
$ git checkout v1.2.2
```

### Dockerコンテナ群のビルド

```
$ cp .env.production.sample .env.production

$ docker-compose pull 
$ docker-compose build
```

### secret生成

```
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rake secret
```
生成されたsecretたちを控えておく。

### 設定

```
$ vim .env.production
```

- `PAPERCLIP_SECRET`,`SECRET_KEY_BASE`,`OTP_SECRET`
: secretたちを設定する
- `LOCAL_DOMAIN `
- `SMTP_LOGIN`,`SMTP_PASSWORD`: Mailgunで表示されたものに修正
- `SINGLE_USER_MODE=true`: 自分以外のユーザーを作らない場合はコメント外して有効に

```
$ docker-compose run --rm web rake db:migrate
$ docker-compose run --rm web rake assets:precompile
$ docker-compose up -d
$ docker-compose logs -f
...
web_1        | => Booting Puma
web_1        | => Rails 5.0.2 application starting in production on http://0.0.0.0:3000
web_1        | => Run `rails server -h` for more startup options

```

立ち上がったら別シェルで

```
$ curl localhost:3000
<html><body>You are being <a href="https://localhost/">redirected</a>.</body></html>ubuntu@ip-172-30-xx-xxx:~/mastodon
```

## nginx

いよいよ終盤。


```
$ sudo apt install nginx-core
$ nginx -v
nginx version: nginx/1.10.0 (Ubuntu)
```

### SSL dhparam

```
$ sudo cat /etc/nginx/nginx.conf|grep dhparam
          ssl_dhparam         /etc/ssl/certs/dhparam.pem;
          
$ sudo openssl dhparam 2048 -out /etc/ssl/certs/dhparam.pem
```

### 設定

```
$ sudo cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.original
$ sudo vim /etc/nginx/nginx.conf
```

[Production Guide](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md)の設定をいじって`http`ディレクティブ内に差し込む。

- SSL関連 `ssl_certificate`/`ssl_certificate_key`
- ドメイン名 `server_name`
- 公開ディレクトリ `root`





syntax checkして起動。

```
$ sudo nginx -t -c /etc/nginx/nginx.conf
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo service nginx restart
$ sudo service nginx status
```

## 動作確認

作ったドメインからブラウザアクセスすると無事に動いた。

![Screen Shot 2017-04-26 at 2.05.18.png](https://qiita-image-store.s3.amazonaws.com/0/281/2a2e7185-8d5b-9a63-9448-f789dafeea5d.png "Screen Shot 2017-04-26 at 2.05.18.png")


ユーザー登録するとSidekiq、Mailgun経由でメールが送信される。

```
sidekiq_1    | 2017-04-25T17:06:56.110Z 1 TID-gn57hjjrc ActionMailer::DeliveryJob JID-3d44cf5c8890886aae8fc0b5 INFO: done: 3.322 sec
```

メールをconfirmするとログインできるようになる。

![Screen Shot 2017-04-26 at 2.09.34.png](https://qiita-image-store.s3.amazonaws.com/0/281/06563cc3-3c14-4994-c939-fc4bc34db666.png "Screen Shot 2017-04-26 at 2.09.34.png")


Toot

![Screen Shot 2017-04-26 at 2.10.42.png](https://qiita-image-store.s3.amazonaws.com/0/281/69b542ce-5f7f-4b77-df49-77003f1fb32c.png "Screen Shot 2017-04-26 at 2.10.42.png")

## 宿題

- データ永続化などは追って
- すぐに情報が古くなりそう