Dockerを使ってMastodonのインスタンスを作る

目次

概要

最近、Mastodonのインスタンスを作ったので、Mastodonのインスタンスの作り方をここに書いておきます。

ちなみにMastodonの読み方は「マストドン」で、簡単にインスタンスを作れるDockerを使ってインスタンスを作ります。

OSはUbuntuです。

環境

  • Ubuntu 16.06 LTS
  • Mastodon 2
  • Docker

依存パッケージのインストール

まず、必要なパッケージをインストールします。

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

Dockerのインストール

では、Dockerのインストールをします。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo groupadd docker
sudo usermod -aG docker $USER

これで、Dockerのインストールが終わります。

後は、Ubuntuの起動時に自動で立ち上がるように次のコマンドを実行します。

sudo systemctl enable docker

docker-composeのインストール

Dockerを扱いやすくするために、docker-composeをインストールします。

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

これで、docker-composeが使えるようになりました。

Mastodonのインストール

Mastodonをダウンロードしましょう。

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

mastodonという名前のディレクトリにMastodonのファイルがあるので、cd mastodonでディレクトリの中に入ります。

そうしたら、インスタンスを立ち上げる前にいくつかの設定をします。

docker-compose.ymlの変更

docker-compose.ymlという名前のファイルがあると思います。

docker-compose.ymlとは、docker-composeコマンドを使ってDockerを使用する際に使う設定ファイルです。

何も変更しなくてもインスタンスを立ち上げることはできますが、データの永続化ができずいつデータが消えてもおかしくない状態になっています。

なので、docker-compose.ymlを変更しましょう。

変更として、Uncomment to enable *******の下にある#を消します。

消すと、このようになります。

version: '3'
services:

  db:
    restart: always
    image: postgres:9.6-alpine
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:4.0-alpine
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis:/data

  web:
    build: .
    image: gargron/mastodon
    restart: always
    env_file: .env.production
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
    volumes:
      - ./public/assets:/mastodon/public/assets
      - ./public/packs:/mastodon/public/packs
      - ./public/system:/mastodon/public/system

  streaming:
    build: .
    image: gargron/mastodon
    restart: always
    env_file: .env.production
    command: npm run start
    ports:
      - "4000:4000"
    depends_on:
      - db
      - redis

  sidekiq:
    build: .
    image: gargron/mastodon
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq -q default -q mailers -q pull -q push
    depends_on:
      - db
      - redis
    volumes:
      - ./public/system:/mastodon/public/system

.env.productionの用意

Mastodonでは、.env.productionというファイルで諸々の設定をします。

次のコマンドで.env.productionを用意しましょう。

cp .env.production.sample .env.production

.env.production.sampleの内容をコピーしたということで、あらかじめ用意されている設定の一部は記述されている状態です。

ここから必要な設定を追加していきます。

まず最初に、ドメインの設定をします。

次のところに、Mastodonにアクセスするためのドメインを記述します。example.comの場合はこのようにします。

LOCAL_DOMAIN=example.com

そうしたら、次の3つに値を設定します。

PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=

この値は次のコマンドを実行して表示される文字列を設定します。

docker-compose run --rm web rake secret

それぞれの項目毎に違う値を設定するので3回実行する必要があります。かなり時間がかかることもあるので気長に待ちましょう。

もし、あまりにも時間がかかり実行できないという場合は、DockerでUpdating permissionsが長い時の対処を見てDockerの設定を変えてみてください。

さらに、VAPID_PRIVATE_KEYVAPID_PUBLIC_KEYにも値を設定します。

docker-compose run --rm web rake mastodon:webpush:generate_vapid_key

こちらも2回実行してそれぞれ違う値を設定します。

他にも、メールの設定をします。

アカウントを登録した場合などにメールが送られてくるのですが、そのメールの設定をしなくてはなりません。

ここでは、Gmailを介してメールを送信する方法を紹介します。

SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=Gmailのアドレス
SMTP_PASSWORD=Gmailのパスワード
[email protected]

適当な値を設定してください。

データベースの設定

Mastodonではデータベースの設定を一発で終わらせることができます。

次のコマンドを実行して終わりです。

docker-compose run --rm web rake db:migrate

プリコンパイル

Mastodonで使うスタイルシートやスクリプトの生成をします。

docker-compose run --rm web rake assets:precompile

起動

これで、Mastodonを起動するまでの準備ができました。

立ち上げるには、次のコマンドを実行します。

docker-compose up -d

これで、起動できました。

OSを再起動した時でも、自動で起動するので、後は何もしなくて大丈夫です。

これで終わりのようにも感じますが、実はまだ終わりではありません。

リバースプロキシの設定

最後に、nginxというWebサーバを用意してそこからMastodonにアクセスするようにします。

そのため、普通Mastodonにアクセスしようと思ったら、nginxにアクセスして、nginxがMastodonにアクセスするというようになります。

nginxは次のコマンドでインストールします。

sudo apt-get install nginx

nginxの設定ファイルは/etc/nginx/sites-enabled/defaultにあります。

その設定ファイルに次の項目を追加します。

location ^~ /.well-known {
    root /var/www/html;
}

location / {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_pass http://localhost:3000;
}


location /api/v1/streaming {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_pass http://localhost:4000;
}

この記述は、server{ }の中括弧内の最後の方に記述しましょう。

後は、設定を読み込み直すためにnginxを再起動し、OSの再起動をしてもnginxが起動するようにしましょう。

systemctl restart nginx
systemctl enable nginx

HTTPS化

Mastodonでは、HTTPSと呼ばれる情報を読み取られにくいセキュアな通信方法を使うことが強く推奨されています。

そのため、nginxをインストールしてHTTPS化しやすくしました。

HTTPS化するためには、nginxの他にSSL証明書というものが必要なので、それを発行するLet’s Encryptというものをインストールします。

sudo apt-get install letsencrypt

証明書を取得します。example.comのところは立ち上げるMastodonで使うドメインを指定してください。

letsencrypt certonly --webroot -w /var/www/html -d example.com

最後に、nginxの設定を変えます。/etc/nginx/sites-enabled/defaultの最後に次のものを追加します。

server {
    listen 443 ssl http2;
    server_name _;

    root /var/www/html;
    index index.html;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;

    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

    location ^~ /.well-known {
        root /var/www/html;
    }

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto 'https';
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_pass http://localhost:3000;
        proxy_redirect http:// https://;
    }

    location /api/v1/streaming {
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto 'https';
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_pass http://localhost:4000;
        proxy_redirect http:// https://;
    }
}

ssl_certificatessl_certificate_keyで指定しているファイルは証明書を取得したドメインで変わるので、適当に変えてください。

設定が終わったら、設定を読み直すためにnginxを再起動しましょう。

systemctl restart nginx

アクセス

これで全ての設定が終わりました。

後は、ブラウザなどで指定したドメインのにアクセスしましょう。

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

アクセスしたら、まずアカウントを作るなど自由に使ってみましょう。

まとめ

疲れました。

色々と分からない部分が多く、設定についてもどのように設定すれば良いのか分かりにくいように感じました。

よし良ければ参考にしてください。