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

  • 126
    いいね
  • 10
    コメント

概要

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

参考