概要
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
には複数のサービス(複数のコンテナ単位)や関連ファイルの記述があります。関係性は下図の通りです。
サービスを実行する前に、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つ作成します。次のコマンドを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/
にアクセスし、画面が表示されるかを確認します。
あとは、ご自由にお使いください。
停止・再開
起動中のコンテナを停止するには
$ 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