Mastodonのインスタンスをたててみた(Docker版)

この記事にはアフィリエイト広告が含まれています

2022年11月の始め頃に某氏によってTwitterが買収されてから様々な変化がありました。

その変化を受けてユーザーの間で話題になったのがMastodon(マストドン)というソーシャルネットワークサービスです。

厳密には上記SNSを構築するためのソフトウェアがMastodonである、という見方も可能ですが、この記事ではSNSとして扱っています。

Mastodonの特徴として「脱中央集権型」というのがあります。
他のSNSのように一つのサーバーにみんながログインしてサービスを受けるという形ではなく、各自が好きなインスタンス(Mastodonではサーバーのことをインスタンスと呼称しています)にアカウントを作ってサービスを受ける形になっています。

インスタンスは誰でもたてることができますので試しにAWSのLightsailを使ってたててみました。
その手順を解説します。

目次

サーバーの仕様

  • AWS Lightsail(1GBメモリのプラン)
  • Amazon Linux 2
  • docker及びdocker composeが使える状態
  • gitコマンドが使える状態

メモリが1GBだとswap必須ですので使えるようにしておく必要があります。

Mastodonの構築手順

STEP
ソースファイルのダウンロード

GitHubからソースファイルを一式ダウンロードします。

git clone git@github.com:mastodon/mastodon.git
STEP
設定ファイルのコピー

ダウンロードしたソースファイルのディレクトリに移動して、設定ファイルをコピーします。

cp .env.production.sample .env.production
STEP
docker用NICのアドレス確認

docker用のNICのIPアドレスを確認します。

ip a

「docker0」の部分にある「inet」の値(172.17.0.1となっていることが多いと思います)を控えておきます。

STEP
docker-compose.ymlの編集

ダウンロードしたソースファイルのディレクトリにあるdocker-compose.ymlを編集します。

当該ファイル中の下記項目にある「127.0.0.1」をSTEP3で控えた値に変更します。

  • webのports
  • streamingのports

dbのセクションに下記を追記します。

environment:
POSTGRES_USER: mastodon
POSTGRES_DB: mastodon_production
POSTGRES_PASSWORD: {データベース接続用のパスワード}

dbのセクションのhealthcheckの内容を下記に変更します。

test: ['CMD', 'pg_isready', '-U', 'mastodon', '-d', 'mastodon_production']
STEP
dockerイメージの取得

下記のコマンドを実行してdockerイメージを取得します。

sudo docker-compose pull
STEP
キーの生成

以下のコマンドを実行してキーを生成します。

sudo docker-compose run --rm web bundle exec rake secret

ランダムな文字列が表示されるので控えておきます。

尚、キーは2つ必要になりますので上記のコマンドを2回実行してそれぞれ表示される値を控えておいてください。

STEP
VAPIDキーの生成

以下のコマンドを実行してVAPIDキーを生成します。

sudo docker-compose run --rm web bundle exec rake mastodon:webpush:generate_vapid_key

VAPID_PRIVATE_KEYとVAPID_PUBLIC_KEYが表示されるのでそれぞれ控えておきます。

STEP
設定ファイルの編集

STEP2でコピーした設定ファイルの内容を編集します。
以下の項目を修正します。

LOCAL_DOMAIN={インスタンスのドメイン名}
REDIS_HOST=redis
DB_HOST=db
DB_PASS={データベース接続用のパスワード}
ES_ENABLED=false
SECRET_KEY_BASE={STEP6で控えた値のうちのいずれか1つ}
OTP_SECRET={STEP6で控えた値のうち、SECRET_KEY_BASEに指定しなかった方の値}
VAPID_PRIVATE_KEY={STEP7で控えた値のうち、VAPID_PRIVATE_KEYに表示された値}
VAPID_PUBLIC_KEY={STEP7で控えた値のうち、VAPID_PUBLIC_KEYに表示された値}
SMTP_SERVER={SMTPサーバー名}
SMTP_PORT={送信ポート}
SMTP_LOGIN={SMTPサーバーにログインする際のアカウント名}
SMTP_PASSWORD={SMTPサーバーにログインする際のパスワード}
SMTP_FROM_ADDRESS={通知メールの送信元アドレス}
S3_ENABLED=false
STEP
データベースの作成

以下のコマンドを実行してデータベースを作成します。

sudo docker-compose run --rm web rails db:migrate

尚、作成時に「mastodonというroleが見つからない」という意味のエラーが出た場合には「postgres14」というディレクトリを削除してから再度実行してみてください。

STEP
アセットファイルの作成

以下のコマンドを実行してアセットファイルを作成します。

sudo docker-compose run --rm web rails assets:precompile
STEP
dockerコンテナの起動

以下のコマンドを実行してdockerコンテナを起動します。

sudo docker-compose up -d
STEP
ディレクトリのパーミッションの変更

以下のコマンドを実行してディレクトリのパーミッションを変更します。

sudo chmod 777 public/system

以上でMastodonの構築は完了です。

ただ、このままでは外部からアクセスができないのでリバースプロキシをたてる必要があります。
ホストOSの方ではwebサーバーを動かしていない環境なのでこれもdockerを使って構築していきます。

リバースプロキシの構築手順

STEP
ディレクトリの作成

設定ファイルやSSL証明書を置くためのディレクトリを作成します。

# 例
mkdir nginx

以降はこのディレクトリを作業ディレクトリとして進めていきます。

STEP
docker-compose.ymlの作成

以下の内容でdocker-compose.ymlを作成します。

version: '3'
services:
  reverse-proxy:
    restart: always
    image: nginx:latest
    volumes:
      #- ./nginx/:/etc/nginx
      #- ./nginx/conf.d:/etc/nginx/conf.d
      #- ./nginx/ssl:/etc/nginx/ssl
      - /var/www/html:/var/www/html
      - /etc/letsencrypt:/etc/letsencrypt
    ports:
      - "80:80"
      - "443:443"
    extra_hosts:
      - 172.17.0.1:host-gateway

  certbot:
    image: certbot/certbot
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/html:/var/www/html
    command: ["--version"]

extra_hostsの部分の「172.17.0.1」は「Mastodonの構築手順」のSTEP3で控えたアドレスになります。

STEP
dockerコンテナの起動

以下のコマンドを実行してdockerコンテナを起動します。

sudo docker-compose up -d
STEP
コンテナ内のディレクトリをコピー

以下のコマンドでコンテナ内のディレクトリをホスト側にコピーします。

sudo docker cp nginx-reverse-proxy-1:/etc/nginx .
STEP
ドキュメントルートの修正

nginx/conf.d/default.confのrootを修正します。

root /var/www/html;
STEP
docker-compose.ymlの修正

コンテナを停止してからSTEP2で作成したdocker-compose.ymlを修正、コンテナを再起動します。

sudo docker-compose stop
version: '3'
services:
  reverse-proxy:
    restart: unless-stopped
    image: nginx:latest
    volumes:
      - ./nginx/:/etc/nginx
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
      - /var/www/html:/var/www/html
      - /etc/letsencrypt:/etc/letsencrypt
    ports:
      - "80:80"
      - "443:443"
    extra_hosts:
      - 172.17.0.1:host-gateway

  certbot:
    image: certbot/certbot
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/html:/var/www/html
    command: ["--version"]

volumesの中のコメント(3行)を削除した形になります。

sudo docker-compose up -d
STEP
SSL証明書の取得


Let’s EncryptでSSL証明書を取得します。
以下のコマンドを実行します。

sudo docker-compose run --rm certbot certonly --webroot -w /var/www/html -d {インスタンスのドメイン名}

「Enter email address (used for urgent renewal and security notices)」に対してはメールアドレスを入力します。
このアドレスにSSL証明書の期限切れ通知などのメールが届きます。

「Please read the Terms of Service at 〜」に対しては「y」を入力します。

「Would you be willing, once your first certificate is successfully issued, 〜」に対してはy/nどちらでも大丈夫ですが、私は「n」を入力しました。

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/{インスタンスのドメイン名}/fullchain.pem
Key is saved at: /etc/letsencrypt/live/{インスタンスのドメイン名}/privkey.pem
This certificate expires on 2023-05-13.
These files will be updated when the certificate renews.

少々待つとSSL証明書が発行されて2つのパスが表示されますので控えておきます。

STEP
シンボリックリンクの作成

取得したSSL証明書(2ファイル)のシンボリックリンクを作成します。
以下のコマンドを実行します。

sudo ln -s /etc/letsencrypt/live/{インスタンスのドメイン名}/fullchain.pem nginx/ssl/
sudo ln -s /etc/letsencrypt/live/{インスタンスのドメイン名}/privkey.pem nginx/ssl/
STEP
confファイルの修正

Mastodonにリバースプロキシ経由でアクセスできるようにconfファイルを修正します。
以下のコマンドでコピーした後に当該ファイルを修正します。

sudo cp /{Mastodnのディレクトリ}/dist/nginx.conf ./nginx/conf.d/default.conf
  • upstreamのサーバーアドレスを上記「Mastodonの構築手順」のSTEP2で確認したdocker用NICのものに変更。
upstream backend {
    server 172.17.0.1:3000 fail_timeout=0;
}
upstream streaming {
    server 172.17.0.1:4000 fail_timeout=0;
}
  • server_nameをインスタンスのドメイン名に変更。(80番ポートと443番ポート)
server_name {インスタンスのドメイン名};
  • SSL証明書のパスを変更。
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
  • try_filesの=404を@proxyに変更。(複数箇所あります)
try_files $uri @proxy;
STEP
リバースプロキシを再起動

以下のコマンドを実行してリバースプロキシを再起動します。

sudo docker-compose stop
sudo docker-compose up -d

以上で完了です。

https://{インスタンスのドメイン名}/aboutにアクセスすると画面が表示されます。

Mastodonの画面

まとめ

各々の環境によって微妙に違うところはあるかと思いますが、Mastodonインスタンスたち上げの参考になれば幸いです。

使用しているポートは80番、443番、3000番、4000番です。(プロトコルはTCP)
これらのポートがファイアウォールなどでブロックされていて正常に表示されない場合があります。
適宜設定を変更してみてください。


広告


この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次