Let's EncryptでSSL証明書が発行できない環境でmastodonのインスタンスを建ててみた話

HTTPS通信できない環境でmastodonのインスタンスを建ててみました。
docker利用でのインスタンスの作成です。
## インスタンス作成の準備
dockerユーザーを作成する。
##環境
Ubuntu 19.04
## マストドン導入前の準備
###パッケージのアップデート
まず最初にパッケージのアップデートを行う。

```ubuntu:パッケージのアップデート
$ sudo apt update
$ sudo apt upgrade
```
###DockerとDockercomposeのインストール
DockerとDockercomposeをインストールする。

```ubuntu:Dockerのインストールとバージョン確認
$ sudo apt install docker-compose
$ docker-compose -v
```


```ubuntu:DockerComposeのインストールとバージョン確認
$ sudo apt install docker.io
$ docker -v
```
###dockerユーザーの作成
インスタンス管理用ユーザーのdockerを作り、Dockerグループに所属させる。

```ubuntu:Dockerユーザーの作成かつdockerグループへの所属
$ sudo adduser --ingroup docker docker
```

以降の作業はdockerユーザで行う

```ubuntu:Dockerユーザーへの切り替えとバージョン確認
$ su - docker
$ docker version
```
##マストドンの導入
マストドンを導入する。オレオレ証明書を用いることもできるが、今回はHTTPSを使わなくてもよいバージョンでインスタンスを建てた。

```ubuntu:Mastodon(Ver2.0)の導入
$ git clone -b v2.0.0 https://github.com/tootsuite/mastodon mastodon (ここでgit checkoutをしろと出る場合があるが無視してよい。）
$ cd mastodon 
$ git checkout refs/tags/v2.0.0
```

次にdocker-compose.ymlを編集する。

- バージョンを3から2に変更する。

```ubuntu:docker-compose.ymlの編集(変更前)
1 version: '3'
```

```ubuntu:docker-compose.ymlの編集(変更後)
1 version: '2'
```

以下のコメントを4か所外す

```ubuntu:docker-compose.ymlの編集(変更前)
    8 #    volumes:
    9 #      - ./postgres:/var/lib/postgresql/data

   15 #    volumes:
   16 #      - ./redis:/data
```

```ubuntu:docker-compose.ymlの編集(変更後)
    8     volumes:
    9       - ./postgres:/var/lib/postgresql/data

   15     volumes:
   16       - ./redis:/data
```

次に環境設定ファイルのサンプルをコピーして用意し、必要なモジュールを入手してビルドする。

```ubuntu:環境設定ファイルのコピーと必要なモジュールの入手
$ cp .env.production.sample .env.production
$ docker-compose pull
$ docker-compose build
```
3種類のシークレットキーの生成を行い、環境ファイルに打ち込む。また、同ファイルのLOCAL_DOMAINとLOCAL_HTTPSを編集する。

```ubuntu:.env.productionの編集
$ docker-compose run --rm web rake secret
xxxxxxxxxx
$ docker-compose run --rm web rake secret
yyyyyyyyyy
$ docker-compose run --rm web rake secret
zzzzzzzzzz

$ vi .env.production
   15 LOCAL_DOMAIN=example.com <- (自分の持っているIP):3000に変更
   16 LOCAL_HTTPS=true <- falseに変更

   30 PAPERCLIP_SECRET=xxxxxxxxxx <- 1回目のdocker-composeの結果
   31 SECRET_KEY_BASE=yyyyyyyyyy <- 2回目のdocker-composeの結果
   32 OTP_SECRET=zzzzzzzzzz <- 3回目のdocker-composeの結果

   43 # DEFAULT_LOCALE=de <- コメントを外してja(日本語)に変更
```
ローカルで試したい場合はLOCAL_DOMAINの値をlocalhost:3000に変更する。

最期にDBの初期化とアセットのプリコンパイルを行う。

```ubuntu:DB初期化とアセットのプリコンパイル
$ docker-compose run --rm web rails db:migrate
$ docker-compose run --rm web rails assets:precompile
```
## mastodon起動
以下のコマンドを打ち込みMastodonのサービスを起動する。

```ubuntu:mastodonの起動
$ docker-compose up -d (起動)
$ docker-compose ps (起動確認)
```
http://(LOCAL_DOMAIN):3000/ にアクセスできれば起動成功である。
ログは以下のコマンドで確認できる。

```ubuntu:ログの確認
$ docker-compose logs -f
```
##管理者ユーザーの追加
mastodonを起動した後、ユーザー登録画面にユーザー名、メールアドレスとパスワードを打ち込む。
![ss_mastodon01_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531265/1e87b376-0b5e-46d3-7c1a-b11d5be649df.png)

メールサーバーの設定をしておらずメールが送られないため、コマンドでユーザー追加を行う。
今回はそのユーザーを管理者ユーザーとして登録する。

```ubuntu:ユーザー登録と管理者ユーザーへの昇格
$ docker-compose run --rm web rails mastodon:confirm_email USER_EMAIL=(設定したメールアドレス)
$ docker-compose run --rm web rails mastodon:make_admin USERNAME=(設定したユーザー名) 
```
このコマンドを行うとログイン画面からログインができるようになる。

##メールサーバーの設定
最後にメールサーバーの設定を行う。gmailを用いた方法を今回は用いる。

```ubuntu:.env.productionの内容
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=(自分の所有しているgmail)@gmail.com
SMTP_PASSWORD=(そのメールアドレスのパスワード)
SMTP_FROM_ADDRESS=(おそらく任意。私はSMTP_LOGINのメールアドレスを書いた)
```
ちなみにgmailを使う場合は[ここ](https://myaccount.google.com/security)で安全性の低いアプリのアクセスを許可する必要がある。（もっと安全な方法はあるが今回はこの方法を用いる。）
詳しくは[このリンク](http://karur4n.hatenablog.com/entry/2015/03/07/234600)を参照してほしい。
##停止、再開等のコマンド
```ubuntu:停止
$ docker-compose stop
```
```ubuntu:再開
$ docker-compose start
```
```ubuntu:環境削除
$ docker-compose down
$ cd ..
$ sudo rm -rf mastodon
```
##終わりに
HTTPSなし環境なのに最新バージョンでmastodonのインスタンスを建てようとしてハマってしまったため、この記事を書いた。
オレオレ証明書を発行してインスタンスを作成することも多分可能であると思う。

##参考にしたサイト
Dockerを使ってMastodonのインスタンスを作る | 人と情報
https://www.tmp1024.com/articles/mastodon-docker-install
Mastodonインスタンスをローカルに立てる簡単な手順
https://l-w-i.net/t/mastodon/init_local_001.txt
Gmail を使って Net::SMTPAuthenticationError が出力される場合の解決法
http://karur4n.hatenablog.com/entry/2015/03/07/234600