読者です 読者をやめる 読者になる 読者になる

Mastodonのインスタンスを立ててみた

Mastodonとは

github.com

mstdn.jpがブレイクしたことで話題になったようで、耳に入ったのでこれは流行りに乗れるのではと思い、サーバーを立てる側に回ってみた。 docker-composeを使うだけなので、難しくはないが、あとで振り返るためにメモを残しておく。

↓作成したインスタンス

mstdn.pics

↓執筆時のスコアは629

Mastodon instances

環境

手順

ドメインを取得する

お名前.comなどでドメインを取得しておく。 今回は良しなに

  • mstdn.pics
  • mstdn.video

を取っておいた。

サーバーを用意する

AWSのコンソールで、上記の環境を用意する。 今回は、一旦お試しということで、無料枠を使うためにt2.microを使用した。 HTTPSを使用するので、EC2インスタンス作成の際にはセキュリティグループを変更して、

を追加する必要がある。(デフォルトではSSH用のポートしか開いていない)

次に、Elastic IPでインスタンスIPアドレスを固定して、Route53でDNSのレコード設定をしておく。

必要なソフトをインストールする

インスタンス作成の際にダウンロードした鍵を使用してインスタンスSSHできたらまずは必要なソフトをインストールする。

  • git
  • docker
  • docker-compose >= 1.10.0
  • lets encrypt
  • nginx

それぞれ

git

$ sudo apt-get install git

docker

$ sudo su -
$ wget -qO- https://get.docker.com/ | sh
$ docker version
$ exit
$ sudo usermod -aG docker $USER

docker-compose

$ sudo su -
$ curl -L https://github.com/docker/compose/releases/download/1.10.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

lets encrypt

$ git clone https://github.com/letsencrypt/letsencrypt.git
$ cd letsencrypt/
$ ./letsencrypt-auto --help

nginx

$ sudo apt-get install nginx

のような感じでインストールした。

Mastodonをインストールする

冒頭に紹介した本家のリポジトリをフォークして、そいつをクローンして以下のように作業する。 (リポジトリのREADMEに書いてある)

$ cd mastodon
$ cp .env.production.sample .env.production
$ vi .env.production

以下変更点

# Federation
LOCAL_DOMAIN=your domain
LOCAL_HTTPS=true

# 全て同じ
PAPERCLIP_SECRET= docker-compose run --rm web rake secret で取得できるキー
SECRET_KEY_BASE= docker-compose run --rm web rake secret で取得できるキー
OTP_SECRET= docker-compose run --rm web rake secret で取得できるキー

# https://sparkpo.st/smtp にアカウント登録してSMTP_SERVER, SMTP_LOGIN, SMTP_PASSWORDを取得しておく
# sparkpostで取得したドメインでのメアドをverifyするにはRoute 53でTXTレコード設定をする必要があった。
SMTP_SERVER=sparkpostで手に入るホスト名
SMTP_PORT=587
SMTP_LOGIN=sparkpostで手に入るログイン ID
SMTP_PASSWORD=sparkpostで手に入るパスワード
SMTP_FROM_ADDRESS=mail@ドメイン名 # 送信元にしたいメアド。domainがsparkpostに登録&verifiedならOK
$ docker-compose build
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rails db:migrate
$ docker-compose run --rm web rails assets:precompile
$ docker-compose up -d # デーモンでの起動が嫌なら -dを消す

ここまでやれば

$ curl localhost:3000

は成功するはず。

これらに外部から80, 443ポートでアクセスしたいので、Lets EncryptとNginxの設定をする。

Lets Encryptの設定

$ cd letsencrypt
$ ./letsencrypt-auto certonly --webroot -w /home/mastodon/live/public(適当で良さそう) -d ドメイン名
$ メールアドレスを入力し、利用規約に同意する

すると、 /etc/letsencrypt/live/ドメイン名/に鍵が生成されているので、nginxの設定の際に使用する。

Nginxの設定

あとはNginxの設定をする。公式リポジトリのREADMEを元に少し変更すればOK

github.com

だが、やっていることは

  • 80 -> 443ヘリダイレクト
  • 443へリダイレクトさせたリクエストを localhost:3000へ転送する
  • /api/v1/streaming へのアクセスは localhost:4000へ転送する

と、その他のチューニング。

公式READMEの設定ファイルをコピーして、以下少しだけ変更する。

$ sudo vi /etc/nginx/conf.d/mstdn.conf


server {
  listen 80;
  listen [::]:80;
  server_name ドメイン;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name ドメイン;
...
  ssl_certificate     /etc/letsencrypt/live/ドメイン/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/ドメイン/privkey.pem;
...

$ sudo systemctl restart nginx

これで、アクセスできるはず。

気持ち

  • 基本的に docker-composeするだけだが、その他メールサーバーが必要とか、HTTPSとか、READMEに指示のないところを適宜自分で設定していったので、最初はスラスラできないのではと思った。

知見

  • 作成時、上記インスタンス一覧サイトに登録されているものは700ほどで、フォロワー3000以上のTwitterアカウントで拡散などしても意外とインスタンスの登録者は集まらなかった。ので、mstdn.jpがもう日本はほぼ独占している以上、色のないインスタンスを作っても登録者は集まらなそう。 差別化を測るために .picsは写真メインのインスタンス、などのように特化していこうかなという戦略も考えられる。
  • インスタンスのスコアをあげるにはHTTPS対応を始め、

observatory.mozilla.org

CryptCheck

で診断をすることが有効である。