マストドンのインスタンスを構築するドン

こんにちは。
サービス開発部の母良田です。
朝が弱いフレンズです。

Mastodonが最近やたら話題になっていますね。
少し出遅れましたが、今回はそのMastodonのインスタンスを構築してみようと思います。

書くこと

サービスとして運用していく上での理想的な環境構成はさておき、
とりあえずアプリケーションが動作するところまで書きます。

インフラはAWSを使用します。
基本的には、公式のドキュメントを見ればだいたい大丈夫そうです。

そもそもMastodonとは

Mastodonとは、ドイツの@Gargronさんが開発しているTwitterライクな分散型SNSです。
最大の特徴は、「分散型」の文字通りアプリケーションが稼働するサーバが分散している点にあります。

TwitterがTwitter社のサーバで稼働しているのに対して、アプリケーションがオープンソースで公開されているMastodonは
だれでも自由にサーバを構築し、サービスを運営することが可能です。

このサーバのことを「インスタンス」、インスタンス同士の繋がりを「連合」と呼び、
OStatusというプロトコルによって実現されているそうです。

日本においては、日本の大学生が運営しているmstdn.jpと、Pixiv社が運営しているpawooが最大勢力となっているようです。
pawooは「不適切なコンテンツ」が理由で海外の一部インスタンスから国交断絶されるなど、
各インスタンスが地方自治的に運営されているMastodonならではの面白い動きを見せています。

前置きが長くなりましたが、さっそく書いていきましょう。

必要なリソースを入れる

とりあえずgitとdocker-composeが使えれば大丈夫です。
今回はAmazon Linuxで構築しています。

# yum updateしとく
$ sudo yum update -y

# gitインストール
$ sudo yum install -y git_

# dockerインストール、起動
$ sudo yum install -y docker
$ sudo service start docker

# dockerグループにec2-userを追加
$ sudo usermod -a -G docker ec2-user

# docker-composeインストール
$ sudo sh -c "curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose"
$ sudo chmod +x /usr/local/bin/docker-compose

dockerグループへの追加を反映するために一度ログアウトし、再ログインしてください。

続いてMastodonのリソースを取得します

git clone https://github.com/tootsuite/mastodon.git

設定ファイルを修正

取得したリソースの中に設定ファイルがあるので、それらを修正していきます。

docker-compose.ymlのvolumesのコメントを外して、
Dockerコンテナ上のDB情報をホストコンピュータ内に永続化するようにします。

割愛〜〜〜〜〜〜

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

〜〜〜〜〜〜割愛

 

中身を見ると分かりますが、コンテナは以下のような構成になっているようです。

  • WebApplication(Rails)
  • Streaming(Node.js)
  • sidekiq(Job worker的なやつ)
  • DB(Redis)
  • DB(Postgres)

 

続いて.env.productionファイルを作成します。

$ cp -p .env.production.sample .env.production

 

.env.productionファイルの修正の前に、シークレットキーを取得しておきましょう。

# 3回実行し結果をメモ
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rake secret

 

.env.productionファイルを修正します。
なんか色々ありますが、とりあえず必要な箇所のみ見ていきましょう。

SMTPの設定は、ユーザ登録時のメール認証に必要になります。
細かい手順は割愛しますが、今回はSESを使用しました。

LOCAL_DOMAIN= # 自分のサーバのドメイン
LOCAL_HTTPS=false # SSLの使用
# 取得したシークレットキーを記載
PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=

SMTP_SERVER=email-smtp.us-east-1.amazonaws.com
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=

テーブルの作成とアセットファイルのコンパイル

サービスを稼働する前に、テーブル作成などの処理を行います。

# テーブル作成
$ docker-compose run --rm web rails db:migrate
# コンパイル
$ docker-compose run --rm web rails assets:precompile

起動する

Dockerコンテナを起動してサービスを稼働させます。

$ docker-compose up -d

Nginxの設定とか

nginxをインストールして3000番ポートを読みに行くようにします。

# nginxインストール
$ sudo yum install nginx -y
# 起動
$ sudo service nginx start
# 自動起動設定
$ sudo chkconfig nginx on
$ sudo chkconfig --list nginx

 

設定ファイルは公式のドキュメントのものをそのまま使えそうです。

SSLの設定もしておきましょう。Let’s Encryptを使います。
SSLに関するNginxの設定は公式のドキュメントのままで問題なさそうです。

$ git clone https://github.com/letsencrypt/letsencrypt /usr/local/letsencrypt
$ letsencrypt/letsencrypt-auto --debug
$ letsencrypt/letsencrypt-auto certonly
$ openssl dhparam 2048 -out /etc/ssl/certs/dhparam.pem

ユーザの設定について

補足になりますが、以下コマンドでメール認証をせずにユーザ登録、ユーザを管理者に設定することができます。

# メールの認証
$ docker-compose run --rm web rails mastodon:confirm_email USER_EMAIL=アカウントのメールアドレス
# 管理権限の付与
$ docker-compose run --rm web rails mastodon:make_admin USERNAME=登録したユーザー名

できた

 

せっかくなので何かつぶやいてみます。

なんだか寂しい気持ちになってきますね。

ここまででなんか動かないときは、テーブル作成とアセットファイルのコンパイル、起動コマンドを再度実行してみたりしてください。

まとめ

いかがでしたでしょうか。
このように、インスタンスの構築だけであればあまり手間を掛けずにできます。

弊社のSNSキャンペーンツールであるfvCurationは既にTwitter、Instagram、Facebookに対応していますが、
マストドンのAPIを利用した機能も何か作れそうな気がしてきますね!

寂しいのでリモートフォローお願いします。
https://パオンヌ.ninja/@horota