AWSのEC2で最小限の努力でmastodonを構築する

- mastodonをとりあえず動かした時のメモ
- 今回はAWSというよりミドルより上寄りの話なのでEC2内というかubuntuの話しかしません

#mastodonとは
- 今トレンドのツイッターみたいなやつ
- dockerとdocker-composeさえあれば一応動く
- https://github.com/tootsuite/mastodon  

#前提条件
- AWSのアカウント
- SESの制限解除をしておくと楽
 - アカウント承認用のメールサーバーは含まれてないので外部か自分でpostfix上げるなり何なりする必要がある
 - SESの横着した使い方はまた今度

#流れ
- EC2を上げる(ubuntuを想定)
- gitでもzipファイルの転送でもなんでもいいのでソースをインスタンスに乗せる
- dockerとdocker-composeをいれる
- postfix でも SES でもなんでもいいのでSMTPのサーバーを上げる
- 設定ファイルを書く
- docker-compose up
- 以上

# 理想
- 贅沢にいこう  
![risou.jpg](https://qiita-image-store.s3.amazonaws.com/0/176127/8cbfc05c-fa3f-879a-0830-cd65fa5876b2.jpeg)


# 現実（このページの範囲）
- とりあえず動かそう  
![新規キャンバス.jpg](https://qiita-image-store.s3.amazonaws.com/0/176127/e850a2b3-c0b6-dbb8-1b68-0cc92067a08e.jpeg)


# 手順
- 殆どgithubに書いてある https://github.com/tootsuite/mastodon
- EC2インスタンスをあげる
![ec2.jpg](https://qiita-image-store.s3.amazonaws.com/0/176127/bf887f20-d139-4d55-71b9-71ea0af46595.jpeg)
- t2.nanoとかt2.microだとメモリと容量が足りない疑惑があるので、スワップの設定をした方がいいかも  

```スワップファイルを作るんじゃ.sh
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
```
```最新版にするんじゃ.sh
sudo apt-get update
sudo apt-get upgrade
```

```必要なパッケージを入れるんじゃ.sh
sudo apt-get install -y python3-pip unzip docker.io
sudo pip3 install docker-compose  #pipでdocker-composeを入れないとyml読み込むときにエラーを吐く
```

```mastodonのパッケージを適当な場所にバラすんじゃ.sh
unzip mastodon-master.zip
cd mastodon-master
```
- とりあえず動かす為に必要なファイルは 
 - env.production  

もともとソースに入ってるsampleファイルをコピーして作成  

```env.productionを作るんじゃ.sh
cp .env.production.sample .env.production
```
```.env.production
# Service dependencies この項目はDockerを使うなら触らない
REDIS_HOST=redis
REDIS_PORT=6379
DB_HOST=db
DB_USER=postgres
DB_NAME=postgres
DB_PASS=
DB_PORT=5432

# Federation くせもの
LOCAL_DOMAIN=<自分のドメイン.com>
LOCAL_HTTPS=false  #とりあえずfalseで

# Application secrets 後述
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=

# Optionally change default language
# DEFAULT_LOCALE=de
DEFAULT_LOCALE=ja

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=<任意のメールサーバー SESなら email-smtp.us-east-1.amazonaws.com とか>
SMTP_PORT=587
SMTP_LOGIN=<ログインID>
SMTP_PASSWORD=<パス>
SMTP_FROM_ADDRESS=<送信元アドレス@自分のドメインとか.com>
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
#SMTP_AUTH_METHOD=plain
#SMTP_OPENSSL_VERIFY_MODE=peer
#SMTP_ENABLE_STARTTLS_AUTO=true

##### S3 とかの設定はまたこんど
```
- PAPERCLIP_SECRET=
- SECRET_KEY_BASE=
- OTP_SECRET=  
は後で書くのでとりあえずビルドする  

`sudo docker-compose build`
自分みたいにセコく使ってる t2.nano だとメモリが足りなくてビルドができないので最初のswapの設定とかをしましょうね
t2.nanoだと５分くらいかかるので待ちましょう
お金持ちは時間を金で買ってください
ちなみにこの手順だと sudo しないとdockerをちゃんと読んでくれません

さっきの３つの項目の鍵を生成する
`sudo docker-compose run --rm web rake secret`
を三回やって、さっきの設定ファイルに

```.env.production
PAPERCLIP_SECRET=592859d9exsuggoinagaimojiretudayo8d792a37c1cb14b2c1124nagainagai08afba854bf702aa90aa6da21595c53534ec5f2748f8c06f14227842004314a91
SECRET_KEY_BASE=d792a37c1cb14b2c1sakkitohachigausuggoinagaimojiretudayo8124nagainagai08afba854bf702aa90aa6da21595c53534ec5f2748f8004314a91c06f14227842
OTP_SECRET=14b2c1124koremosakkitochigausuggoinagaimojiretudayo8d792a37c1cbnagainagai08afba854bf702aa90aa6da21595c5306f14227842004314a91534ec5f2748f8c
```
みたいな感じに書きます

あとはDBとかの初期設定ですね

```初期設定じゃ.sh
sudo docker-compose run --rm web rails db:migrate
sudo docker-compose run --rm web rails assets:precompile
```

# 起動
`sudo docker-compose up`
でログとかを見れる状態で
`sudo docker-compose up -d`
でデーモンでうごいてくれます
あとは
http://localhost:3000/
とか
http://＜自ドメイン＞:3000/
にアクセスすれば見れます
（セキュリティグループの 3000 ポートはあけておくこと）

# 管理者の登録
ユーザーを管理者にするときは
`sudo docker-compose run --rm web rails mastodon:make_admin USERNAME=<ユーザー名>`
って感じで登録してやってください
`http://＜さっきつくったmastodonのURL＞/admin/settings`
で管理者用の設定ができます（ページ名とか説明とか）

# なんか動かないときは
- もう一回これをやる

```初期設定じゃ.sh
sudo docker-compose run --rm web rails db:migrate
sudo docker-compose run --rm web rails assets:precompile
```


#その他
- 3000にリダイレクトするのが面倒なのでELBを前に置くと楽
- ハマりどころとしては、
 - https -> ELB -> http -> EC2 とした場合、ユーザー承認メールが https://のリンクになってくれない事ですかね

全然関係ないけどこういうの好き

```
redis_1      |                 _._                                                  
redis_1      |            _.-``__ ''-._                                             
redis_1      |       _.-``    `.  `_.  ''-._           Redis 3.2.8 (00000000/0) 64 bit
redis_1      |   .-`` .-```.  ```\/    _.,_ ''-._                                   
redis_1      |  (    '      ,       .-`  | `,    )     Running in standalone mode
redis_1      |  |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
redis_1      |  |    `-._   `._    /     _.-'    |     PID: 1
redis_1      |   `-._    `-._  `-./  _.-'    _.-'                                   
redis_1      |  |`-._`-._    `-.__.-'    _.-'_.-'|                                  
redis_1      |  |    `-._`-._        _.-'_.-'    |           http://redis.io        
redis_1      |   `-._    `-._`-.__.-'_.-'    _.-'                                   
redis_1      |  |`-._`-._    `-.__.-'    _.-'_.-'|                                  
redis_1      |  |    `-._`-._        _.-'_.-'    |                                  
redis_1      |   `-._    `-._`-.__.-'_.-'    _.-'                                   
redis_1      |       `-._    `-.__.-'    _.-'                                       
redis_1      |           `-._        _.-'                                           
```