Edited at

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

More than 1 year has passed since last update.


概要

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

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


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

サービスを実行する前に、docker-compose.yml ファイルを開き、サービス dbredis のボリューム行のコメント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つ作成します。次のコマンドを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

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


停止・再開

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

$ 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=<ユーザ名>


参考