Dockerで雑にMastodonを起動する方法

## 概要

Mastodon (https://github.com/tootsuite/mastodon) を、ローカル環境などの Docker で雑に動かす方法のまとめです。具体的には Linux サーバ上に Docker と Docker Compose で環境を構築し、`http://<ip>:3000/` に表示します。細かい設定は抜きにして、とにかく動かして挙動を見たいかた向けの手順です。公式READMEでは、Docker関連の説明で一部足りない箇所があると思い、再整理しました。

なお、実際のサーバで動かす場合には、管理ユーザの設定や、メールサーバの設定がユーザ確認のために必要ですが、ここでは。省略しています。以下の管理ガイドやプロダクションガイドをご覧ください。

- [Administration Guide](https://github.com/tootsuite/documentation/blob/8367c216524513ca9ed1e6fb4505a734853c308b/Running-Mastodon/Administration-guide.md)
- [Production Guide](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md)

## Docker 関連セットアップ

まず、Docker Engine（Dockerコンテナを実行するためのプラットフォーム）と Docker Compose（複数のコンテナをサービスとして一括管理するプログラム）をセットアップします。以降の手順は Linux の場合です。

Docker Engine は次のコマンドを実行してセットアップすると、Docker プロジェクトの最新安定版をダウンロードします。

```
# curl -sSL https://get.docker.com/ | sh
```

それから Docker Engine の起動と、ブート後のサービス自動起動設定をします。次のコマンドは CentOS 7 の場合です。

```
# systemctl enable docker
# systemctl start docker
```

次は、Docker Compose のバイナリをセットアップします。

```
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

```

作業用 `docker` アカウントを作成します（root権限で全ての Docker 操作が可能なため、事実上の root ユーザとなりますので取り扱いにはご注意ください。あるいは、この手順を省略し、一般ユーザから `sudo docker` のように実行しても構いません）。

```
# /usr/sbin/adduser -g docker docker
```

ユーザを切り替えます。

```
# su - docker
```

最後にバージョン確認です。`Server:` のバージョンが表示されていれば正常です。表示されない場合は Docker Engine（dockerdデーモン）が起動しているかどうか、root 権限（正確には /var/run/docker.sock のアクセス権限があるかどうか）をご確認ください。

```
$ docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:06:25 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:06:25 2017
 OS/Arch:      linux/amd64
 Experimental: false
```

## Mastodon のセットアップ

GitHub のリポジトリから、ソースコードをダウンロードします。ここでは `/home/docker/` ディレクトリ以下での作業を想定していますが、任意の場所で実行できます。

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

ディレクトリを移動します。

```
$ cd live
```

Docker Compose は、現在の（カレント）ディレクトリ上のプロジェクト・ファイル（デフォルトは `docker-compose.yml`）を読み込み、一括してイメージの構築・ダウンロード・実行など操作を行えます。

`mastodon` ディレクトリ内には `docker-compose.yml` があります。これを使って、複数の Mastodon 関連コンテナを実行しますが、その前にイメージの取得と構築（ビルド）が必要です。

`docker-compose.yml` には複数のサービス（複数のコンテナ単位）や関連ファイルの記述があります。関係性は下図の通りです。

![mastodon compose.png](https://qiita-image-store.s3.amazonaws.com/0/13002/2849881e-334a-2054-c8eb-a1f6c5ced703.png)

サービスを実行する前に、`docker-compose.yml` ファイルを開き、サービス `db` と `redis` のボリューム行のコメント2箇所・4行を削除します（ボリューム機能を使い、コンテナ終了後もデータをホスト側に保存できるようにします）。具体的には、次のように、各 `volumes:` の前にある `#` を削除します。

```
version: '2'
services:

  db:
    restart: always
    image: postgres:alpine
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:alpine
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis:/data
```


それから、設定ファイル `.env.production` を作成します（これは Docker Compose 実行時、コンテナ内で有効になる環境変数を書き込むファイルです）。

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

詳細は後ほど編集します。


次は、Docker Compose 実行に必要なイメージのダウンロードとビルドを行います（`Dockerfile` をもとに、イメージを作成します。）。

```
$ docker-compose build
```

## 設定ファイル向けの準備と編集

シークレット（APIトークンに相当）を３つ作成します。次のコマンドを3回実行します（`PAPERCLIP_SECRET` `SECRET_KEY_BASE` `OTP_SECRET` で使います。）。

```
$ docker-compose run --rm web rake secret
<文字列>
```

実行すると `<文字列>` が出ますので、控えておきます。

それから、 `.env.production`ファイルを編集します。

10行目以降を編集します。対象は以下の行です。

```
# Federation
LOCAL_DOMAIN=<ホスト名 mastodon.example.jp など>
LOCAL_HTTPS=false

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=8979dee487...　←先ほどのシークレット
SECRET_KEY_BASE=74a137afd0b0...　←先ほどのシークレット
OTP_SECRET=aae3d46591fb057...　←先ほどのシークレット
（省略）
# Optionally change default language
DEFAULT_LOCALE=ja
```

なお、本稿では省略していますが、実際にユーザを登録するには、認証のためにメールサーバ用のセットアップも必要です。

## データベースの初期化とアセットのプリコンパイル

もう少し準備をします。

```
$ docker-compose run --rm web rails db:migrate
$ docker-compose run --rm web rails assets:precompile
```

特にエラーがでなければ準備完了です。

## Mastodon の起動

デタッチド・モード（バックグラウンドで）を起動します。

```
$ docker-compose  up -d
mastodon_redis_1 is up-to-date
mastodon_db_1 is up-to-date
Creating mastodon_sidekiq_1
Creating mastodon_streaming_1
Creating mastodon_web_1
```

`docker-compose ps` で動作状態を確認します。各サービス（コンテナ）の状態（State)が起動中(`Up`)なのを確認します。

```
$ docker-compose ps
        Name                   Command                  State                   Ports
---------------------------------------------------------------------------------------------
mastodon_db_1           docker-entrypoint.sh    Up                      5432/tcp
                        postgres
mastodon_redis_1        docker-entrypoint.sh    Up                      6379/tcp
                        redis ...
mastodon_sidekiq_1      bundle exec sidekiq     Up                      3000/tcp, 4000/tcp
                        -q def ...
mastodon_streaming_1    npm run start           Up                      3000/tcp, 0.0.0.0:400
                                                                        0->4000/tcp
mastodon_web_1          bundle exec rails s     Up                      0.0.0.0:3000->3000/tc
                        -p 300 ...                                      p, 4000/tcp
```

起動まで時間がかかりますので、ログを参照します。画面のスクロールが止まるまで待ちます。

```
$ docker-compose logs -f
```

止まったら `ctrl-f`で中断できます。

あとは、ブラウザから動作確認です。 `http://<ホスト名>:3000/` にアクセスし、画面が表示されるかを確認します。

![mastodon1.png](https://qiita-image-store.s3.amazonaws.com/0/13002/dbbcd771-2e74-ef43-578d-63c596e6c373.png)


あとは、ご自由にお使いください。


## 停止・再開

起動中のコンテナを停止するには

```
$ docker-compose stop
```

再開

```
$ docker-compose start
```


## 環境の削除

最後に `docker-compose.yml` によって作成したコンテナ、ボリューム、ネットワークなど削除するコマンド `docker-compose down` を実行します。

```
$ docker-compose down
```

ただし、PostgreSQL 用の `./postgres/` と Redis 用の `./redis/` の各ディレクトリは残り続けますので、必要なければ、このまま削除します（※root権限でないと削除できません）。

```
# rm -rf ./postgres
# rm -rf ./redis
```


## おまけ

管理ユーザ作成用コマンド

```
$ RAILS_ENV=production && \
    docker exec -it $(docker ps -q -f name=mastodon_web_1) bundle exec rails mastodon:make_admin USERNAME=<ユーザ名>
```


## 参考

- Mastodon README.md
 - https://github.com/tootsuite/mastodon/blob/master/README.md