WEB・アプリ開発

マストドンAWS構築チュートリアル完全版|初心者から大規模運用まで

マストドン(mastodon)のインスタンスをAWS(Amazon Web Service)に構築する手順をご紹介します。

実は難易度の高い構築

本記事は執筆から2年以上経過しているので状況が変わっている可能性があります。

単純なWebアプリケーションなんだから、DB作ってサーバーにコードをアップロードして終わりでしょ、と思いがちなのですが、実は結構難しいです。

マストドンはRuby on RailsというメジャーなWebフレームワークで作られていますが、その他に周辺技術が多く使われています。

Redis、Docker、Reactなどの比較的新しい技術やメールなどの外部サーバーと連携するような機能も必要になってきます。

なので、マストドンインスタンスを構築するだけで、それなりの技術力が必要だと言えます。それに、公式サイトの説明はそこまで丁寧ではなく、手順を説明している記事もまだ多くありません。

ネット上には、結構「意外と簡単だったー。」「公式ドキュメントが親切ですぐできた。」などの声も上がっているのですが、信じてはいけません。

かなり技術力を持っている人がマウンティングしている可能性があります。

少なくとも、WordPressなどを構築するのに比べるとずっと難しいです。

でも、この手順をそのまんまやればエンジニアではない方でも数時間で構築できるようにはなっています。

なぜAWSを使うのか

AWSであれば、もしあなたのインスタンスが人気になりユーザーが急増し負荷が増大しても、スケールアウトして負荷に対処することが比較的容易です。

また、AWSはクラウドサービスでは一番メジャーなので、AWSの使い方を知っておけば、違うプロジェクトでも重宝される可能性が高いです。

そして、個人的にはAWSだとSSL証明書が無料になるというのも大きなメリットだと思います。

マストドンを構成する技術

マストドンを構築する上で、知っておくとわかりやすい技術について解説します。ただ、React.jsのようなフロントエンドまわりなどは、構築時に意識しなくてもいいので触れていません。図にするとざっくり次のような感じです。

マストドンAWS構築チュートリアル完全版
技術名 役割
Nginx Webサーバー。
ユーザーからのアクセスを受付、レスポンスを返す。
Rails アプリケーション。
メインの処理ロジックが動く。
Postgresql リレーショナルデータベース。
データを保存しておく。
Redis キャッシュ。
永続しないデータを扱う。非同期処理のために使われる。
SMTPサーバ メールを送るために使う。
Docker 一種のVMを作る技術。通常の完全仮想化より高速。それぞれの構成要素を分離して管理・デプロイするのが容易になる。

公式READMEの方法だと、Rails、Postgresql、RedisはそれぞれのDockerコンテナ上に載りますが、NginxはDockerコンテナに載せるようになっていません。なのでNginxは普通にインストールする必要があります。公式READMEではNginxを使う前提の説明が多いのでDockerコンテナに載せない理由がよくわかりません。WEBサーバーは環境により様々な状況が想定されるから、各人に任せているのかもしれません。

ちなみに、Nginxをインストールしなくても、Railsに内蔵されているPumaというWebサーバだけでも動きますが、大規模運用に備えてやはりNginxを使うことにします。

技術要素については、一度お手元のパソコンに開発環境を構築すると理解がしやすいと思います。次の記事に詳しく手順をまとめました。

マストドン開発環境のMacへの構築方法|サクサク開発!ユーザ増!マストドン(Mastodon)をお手元のMacで開発するための環境構築方法のご説明をします。 なぜ開発環境が必要か ネット上には、「...

このチュートリアルの構成

いきなり商用レベルの要件を構築するとわかりずらいし、挫折する方も出てしまうかもしれないので、このチュートリアルでは少しずつステップアップしていく構成にしています。

スポンサーリンク

お手軽な手順

まず、1つのVMで、 https://yourdomain.com/などの独自ドメインで、HTTPSで利用できるようにします。

SMTPサーバはAWSのメールサービス、SESに任せます。それ以外は1つのEC2内に入れます。EC2というのは汎用的なVMのことです。

SSL証明書はLet’s Encryptという無料のものを使用します。

マストドンAWS構築チュートリアル完全版

普通に運用するだけならこれでOKだと考えていますが、大規模に運用していきたい人は次以降の手順を参考にしてください。

ロードバランサーの導入

お手軽な手順が済んだ状態から、ロードバランサー(ELB)を追加します。

後々のサーバー増設にそなえ、SSL証明書はEC2側ではなくELBにつけるようにします。AWSではELBにつけるSSL証明書を無料で発行してもらえます。

ちなみに、ユーザーはELBまでHTTPSでアクセスしますが、ELBはHTTPでEC2内のNginxに割りふります。

マストドンAWS構築チュートリアル完全版

負荷に合わせてEC2をスケールアウトする

もしユーザーが増えてきた場合、EC2を増設する必要が出てきます。ELBを追加してあるので、EC2を追加するだけで負荷対策ができるのですが、データをそれぞれのEC2から一か所で共有できるようにする必要があります。

なので、PostgresとRedisは各EC2から切り出し、RDS、ElasticCacheというように、AWSの専用サービスを使うことにします。なので、DockerコンテナはRails用のものだけになります。

マストドンAWS構築チュートリアル完全版

お手軽な手順

EC2インスタンスの作成

EC2のダッシュボードからEC2インスタンスを作成していきます。

マストドンAWS構築チュートリアル完全版

ここでは、「Ubuntu Server 16.04 LTS (HVM), SSD Volume Type 」を選びます。

マストドンAWS構築チュートリアル完全版

インスタンスのスペックを選びます。何でもよいのですが、リーズナブルなt2.nanoを選びます。

マストドンAWS構築チュートリアル完全版

インスタンスの詳細設定は特に変えずに進みます。

マストドンAWS構築チュートリアル完全版

ストレージのサイズは20GiBくらいにしておきます。

マストドンAWS構築チュートリアル完全版

Tagは特に追加せずに進みます。

セキュリティグループの設定にて、HTTP、HTTPSを追加します。

マストドンAWS構築チュートリアル完全版

「インスタンス作成の確認」で、「作成」を押すと、インスタンスにログインするためのキーペアを選びます。既存でもいいですし、新規に作ってもOKです。

マストドンAWS構築チュートリアル完全版

「インスタンスの作成」を押すと、作成が開始されます。完了まで5分くらいかかりました。

完了したかどうかは、インスタンスの一覧画面にて、以下のように表示されているかどうかでわかります。

マストドンAWS構築チュートリアル完全版

インスタンス一覧画面で、作成したインスタンスを選択すると、画面の下に情報が表示されます。そこで、「IPv4パブリックIP」の値を控えておいてください。

マストドンAWS構築チュートリアル完全版

スポンサーリンク

Route53でHosted Zoneを作る

Route53のコンソールに移ります。

当方が運営しているのはマストドンインスタンスは https://everydon.com/というURLなので、あなたのドメインに置き換えて読んでください。

対象のドメインで確認メールを受け取るために、Route53でHosted Zoneを作ります。

マストドンAWS構築チュートリアル完全版

対象のドメインを入力します。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

先ほど控えたIPv4パブリックIPを入力します。

マストドンAWS構築チュートリアル完全版

4つのNSの値を控えます。クリックすると右側にコピペできるフィールドで表示されます。

マストドンAWS構築チュートリアル完全版

対象のドメインをAWSで使えるようにするため、ドメインを購入したレジストラ側の管理画面からネームサーバーの値として先ほど控えた値に設定します。

当方はムームードメインを使っていますが、ムームードメインの場合は、NSの値の最後のドットは削除して入力します。

マストドンAWS構築チュートリアル完全版

SSHでログインする

ターミナルのアプリケーションを開きます。MacなどのUNIXコマンドが使えるOSを想定していますが、Windowsでもターミナル系のアプリケーションをインストールすれば同じようなことができるはずです。

ちなみに、以下コードにある行頭の $はプロンプトです。これより右にある文字列が実際に入力するコマンドです。

まずログインします。キーペアのファイルを下のように指定し、XX.XX.XX.XXには先ほど確認したIPv4パブリックIPを入れます。

このコマンドはキーペアのファイルがあるディレクトリで実行していますが、違うディレクトリの場合は、フルパスなり相対パスなりで指定する必要があります。



と聞かれた場合は、’yes’と入力してください。

Let’s EncryptでSSL証明書を取得する

Let’s Encryptのクライアントのcertbotを使うとマジックのように簡単です。

certbotをダウンロードし、実行権限をつけます。


certbotを実行します。


実行中に


と聞かれるので Yと入力します。


と聞かれるので、あなたのメールアドレスを入力します。


と聞かれるので Aと入力します。


と聞かれますが、これは Yでも NでもOKです。ただ、 Yだとお知らせメールが来るようになるので、私は Nにしています。

これで証明書がとあるディレクトリーに生成されます。

次にdhparamを生成します。


参考: (My) mastodon インスタンス構築手順

ミドルウェアの設定

t2.nanoだとメモリ容量がたりない可能性があるので、スワップの設定をします。


aptを最新にします。


sudo apt-get upgrade実行時に下のようなメッセージが出る場合がありますが Yと入力してください。


さらに sudo apt-get upgrade実行時に複数回下のようなメッセージが出る場合があります。


その場合は、2つ目の「keep the local version currently installed」を選びます。
十字キーで選択して、Enterで決定します。

ミドルウェアをインストールします。


Nginxの設定ファイルを修正します。


中身は以下とします。公式のドキュメントにあったサンプルを若干修正したものです。

ドメインを私のものにし、33行目の rootをubuntuの環境に合わせただけです。この手順に従っているなら、 everydon.comをあなたのドメインに置換すればそのまま使えるはずです。

マストドンのセットアップ

githubからソースコードを持ってきます。


環境変数のファイルを作成します。


docker-composeの設定ファイルを修正します。


dbとredisのセクションを修正します。以下でいうと、5〜6、12〜13行目のコメントアウトを外します。これをしないと、運用中にDBに入ったデータが docker-compose downする度に消えてしまいます。これにより、Dockerコンテナ側のデータのあるディレクトリと、EC2側のディレクトリを同期することになります。

ちなみに、EC2にはEBSをつけているので、EC2を停止してもデータが消えることはありません。なので、EC2を停止して、EC2のスペックを変えることも可能です。ユーザーが増えてきたらスケールアップしてもいいかもしれません。ただ、一つのEC2で運営している場合は、ダウンタイムが発生するので、ユーザーが使っていない深夜などにやったほうがいいかもしれません。

あと、EC2を停止する前に、一応 sudo docker-compose downでDockerを停止しましょう。

docker-compose buildします。これは5〜10分かかります。


次に、後で環境変数ファイルに記入する鍵(長い文字列)を3つ生成します。以下を3回実行します。


以下のような長い文字列の鍵が表示されます。3回分メモしておいてください。


ただ、初回だけ以下のように長い出力となる場合がありますが、必要なのは最後の行のみです。


環境変数ファイルを修正します。


修正する部分は3点です。

1点目は、Federationの部分で、 LOCAL_DOMAINをあなたのドメインにします。


2点目は、先ほど生成した3つの鍵を .env.productionに記入します。
以下の3つの =以降にそれぞれ記入します。


3点目は、お好みで言語を日本語にします。


migrationしてテーブルを作ります。


jsやcssをprecompileします。


ここでNginxを再起動します。


ここでようやく、 docker-compose upします。


バックグラウンドで実行する場合は、 -dをつけます。


これで https://everydon.com/(あなたのドメイン)にアクセスすると、マストドンのログイン画面が表示されるはずです。

マストドンAWS構築チュートリアル完全版

さぁ、早速ログインして使うぞ!と思っても、まだ使用することはできません。

Mastodonでのユーザー登録は、デフォルトではメールアドレス認証が必要です。

なので、登録したメールアドレスに送られる認証リンクをクリックして、ようやくログインできるようになります。

スポンサーリンク

メールの設定

メールはAWSのメールサービスSESを利用します。

SESの送信制限を解除する

SESは初期設定では、送信制限がかかり、SAND BOXモードになっており、次のような制限がかかっています。

  • 事前に認証したメールアドレス以外には送信できない
  • 1日当たり200通までしか送信できない
  • 1秒当たり1通までしか送信できない

認証したメールアドレスにしかメールが送信されない状態です。

以下から、この送信制限を解除するための申請をします。

http://aws.amazon.com/ses/extendedaccessrequest/

次の内容で申請しました。

マストドンAWS構築チュートリアル完全版

私の場合は、申請の翌日に英語の承認メールが来て、制限が解除されていました。

翌日まで待たずにすぐに動かしたい方は、次の「送信元に設定するアドレスの認証」と同じ手順で、送信先のアドレスも認証すると、とりあえずそのアドレスだけには送れるようになります。

送信元に設定するアドレスの認証

ユーザーに送られるメールの「送信元」に設定するメールアドレスが自分のものであることを、SESで認証する必要があります。

SESのコントロールパネルを開くと、東京リージョンはSESがないので、他のリージョンを選ぶ必要があります。日本に近いオレゴンをクリックします。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

送信元に設定したいメールアドレスを入力します。Gメールなどの無料アドレスでもOKです。

マストドンAWS構築チュートリアル完全版

そのアドレスに確認メールが届きますので、メール内のリンクをクリックします。

マストドンAWS構築チュートリアル完全版

リロードボタンをクリックすると、verifiedと表示されたら認証完了です。

マストドンAWS構築チュートリアル完全版

SMTP Credentialsの作成

次に、SMTPサーバーを利用するためのSMTP Credentialsを作成します。

まず、「Server Name」を控えておきます。

そして、「Create My SMTP Credentials」をクリックします。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

「認証情報をダウンロード」をクリックすると、credentials.csvというファイルがダウンロードされるので、保存します。

マストドンAWS構築チュートリアル完全版

環境変数ファイルへのSMTP情報の設定

ターミナルの作業に戻ります。

環境変数ファイルのSMTPの部分を修正します。



先ほど控えた「Server Name」とcredensitals.csvの中に記載されている値を設定します。以下のように対応しています。

.env.productionでの呼称 AWSでの呼称
SMTP_SERVER Server Name
SMTP_LOGIN Smtp Username
SMTP_PASSWORD Smtp Password

SMTP_FROM_ADDRESSは先ほどSESで認証したメールアドレスを記載します。

変更を反映するために、Dockerコンテナを再起動します。

「controlキー+C」でDockerコンテナは停止されます。
バックグラウンドで起動している場合は、以下を実行します。


起動します。


これで、登録時にメールアドレス確認メールがきちんと送信されるはずです。

cronの設定

Mastdonは生き物です!

急に取り乱してすみません。Mastodonは、息をするかのように、日々データを更新したり、他インスタンスとの連合を行っているので、定期的にメンテナンス処理をする必要があります。それをcronに登録します。


以下を追記します。


3つタスクを追加していますが、上二つはマストドンのデータをメンテナンスする処理です。

参考: Mastodonで他インスタンスの情報が正常に表示されない場合の対処

最後の一つは、Let’s Encryptは90日で期限が切れるので、更新する処理をしています。90日ごとにやればよいのですが、念のため毎週動かしています。

以上でお手軽な手順を終了です。

大抵のインスタンスはこれで十分だと思います。負荷が増えてきたら、とりあえず、EC2のスペックをスケールアップしていけば当分はしのげるはずです。

ロードバランサーの導入

ここからは、負荷対策に備えてロードバランサーを追加する手順をご紹介します。

SSL証明書の取得

SSL証明書を取得するために、対象のドメインの所有者があなたであることを証明する必要があります。

そのために、AWSからあなたのドメインのメールアドレス宛てに確認メールを送り、それをクリックすることで確認をします。

あぁ、受信するためにメールサーバー立てなきゃいけないのかぁ、と思うかもしれませんが、AWSではS3バケットをメールボックスに簡単にすることができます。

SESでドメインを認証する

SESのコンソールに移ります。

マストドンAWS構築チュートリアル完全版

対象のドメインを入力します。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

pending verificationと表示されます。

マストドンAWS構築チュートリアル完全版

Route53のコンソールで先ほど作ったHosted Zoneを見ると、2つレコードが挿入されているはずです。

マストドンAWS構築チュートリアル完全版

SESでメールの受信ルールを作る

SESのコンソールにて、確認メールを受けるため、ルール(どこ宛てのメールはどこに届く)を作ります。

マストドンAWS構築チュートリアル完全版

ルールの名前は適当でOKです。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

確認メールが保存されるS3バケットの名前を決めます。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

ACMでSSL証明書を作成する

ACM(Amazon Certificate Manager)のコンソールを開きます。

なお、SESはオレゴンリージョンを使っていましたが、ACMは後で作るELBと同じリージョンでないとダメのようです。なので、当方は東京リージョンのACMコンソールで行いました。

マストドンAWS構築チュートリアル完全版

ここは対象のドメイン名を入力して下さい。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

S3のコンソールで、先ほど作成したS3バケットの中身を見ると、確認メールが送られているはずです。下のようなファイルがいくつか入ってきています。どれでもいいので一つダウンロードします。

マストドンAWS構築チュートリアル完全版

ダウンロードしたファイルを開くと、メールフォーマットなので見づらいですが、下のような部分があるはずです。そこに記載されているURLをコピーします。

マストドンAWS構築チュートリアル完全版

コピーしたURLをブラウザで開くと下のようなページが表示されるので、「I Approve」をクリックします。

マストドンAWS構築チュートリアル完全版

ACMのコンソールで「続行」をクリックします。

マストドンAWS構築チュートリアル完全版

「発行済み」と表示されれば、SSL証明書の作成は完了です。

マストドンAWS構築チュートリアル完全版

NginxをHTTPで待ち受ける設定にする

「お手軽な手順」では、HTTPSでユーザーからのアクセスを受け付けるNginxの設定ファイルになっています。

ここでは、SSLはELBが担当するため、NginxはHTTPで待ち受けるようにします。


内容は以下になります。 everydon.comは、あなたのドメインに置換してください。


公式ドキュメントに記載されたものとの違いは、まずはHTTPS接続はしないので、基本はHTTPで接続する設定にしています。

Nginx再起動して変更を反映します。

スポンサーリンク

ELBの作成

ELB(ロードバランサー)を作成します。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

名前を適当につけ、リスナーにHTTPSを追加します。

マストドンAWS構築チュートリアル完全版

少し下にスクロールし、二つのアベイラビリティゾーンをチェックし、「次の手順」をクリックします。

マストドンAWS構築チュートリアル完全版

「証明書の名前」にて、先ほど作成した証明書を選択します。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

ターゲットとは、そのELBからアクセスを割り振られるEC2インスタンスのことです。一つのELBから複数のECインスタンスへアクセスを割振るのでそれらを「ターゲットグループ」と呼びます。

名前は適当でOKです。ヘルスチェックのパスは /aboutとします。

マストドンAWS構築チュートリアル完全版

最初の手順で作成したEC2のインスタンスを選択し、「登録済みに追加」をクリックします。

マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版 マストドンAWS構築チュートリアル完全版

これで、ELBが作成できました。

ELBに独自ドメインを割り当てる

Route53の対象のドメインのHosted Zoneで先ほど作成したAレコードを修正します。Alias Targetには作成したELBを選択します。このプルダウンはなかなか選択肢が表示されないことがあります。その場合、ELBのDNS名をここに貼り付けたりしてると表示されるようになります。

マストドンAWS構築チュートリアル完全版

これで https://everydon.com/のような独自ドメインからアクセスできるようになったはずです。

EC2の不要なポートを閉じる

実は今の状態だと、まだELBを経由せずにEC2に直接アクセスできます。

なので、HTTPやHTTPSでどこからでもアクセスできるルールを削除します。ただし、それを削除するとELBからEC2への通信もできなくなってしまうので、ELBからのHTTPアクセスは許可するようにします。

まず、ELBが所属しているセキュリティグループを確認します。

マストドンAWS構築チュートリアル完全版

対象のインスタンスを選択し、下に表示されるセキュリティグループをクリックします。

マストドンAWS構築チュートリアル完全版

編集をクリックします。

マストドンAWS構築チュートリアル完全版

不要なルールを削除していきます。そして、先ほど調べたELBのセキュリティグループを送信元に入力したHTTPを追加します。

なので、作業用のSSHと追加したHTTPの2ルールだけが残る形になります。

マストドンAWS構築チュートリアル完全版

Let’s Encrypt更新cronの削除

SSLはELBが担うので、Let’s Encryptを更新するcronは削除します。


以下の部分は削除してください。

負荷に合わせてEC2をスケールアウトする

鋭意執筆中です。しばらくお待ちください。

スポンサーリンク

Railsのスキルがない場合

マストドンを構築・運営するだけなら、正直Railsのスキルがなくてもできます。

ただ、先行するインスタンスと差別化していくためには、やはり独自にカスタマイズする必要がでてきます。Railsのスキルがないと、多分トップページの背景色を変えることもできないと思います。

なので、やはりRailsで開発がすらすらできる人が有利になります。

Railsのおすすめ入門教材についてまとめたので、よろしければご覧ください。

今Ruby on Railsに入門するならこの教材と進め方が最短!Ruby on Railsを比較的最近始めた私がやる価値のあると感じた教材を紹介していきます。また、それらの教材の最短の進め方についても...

手っ取り早く短期間でマスターしたい方は、スクールでプロから学んでしまうのもアリかもしれません。次の記事がまとまっています。

最速マスター!Ruby on Railsスクール5選!

個人的には、オンラインで質問し放題で現役のエンジニアが教えてくれるテックアカデミーがいいと思います。他のスクールは結構学生とかが講師やってます。。。

どのようにレッスンが進むか、無料説明会動画を視聴するとよくわかるので、興味がある方はそれだけでも見てみるといいかもしれません。

さいごに

いかがでしたでしょうか?

ぜひあなたらしいMastodonインスタンスを立ち上げてみてください!

ところで、開発環境の構築は済みましたか?

これからユーザーを集めるためには、先行インスタンスとの差別化を図る必要がありますよね。そのために、デザインや独自機能などをカスタマイズする必要があるのではないでしょうか?

本番環境のソースを弄るのも危険なので、お手元のパソコンでやはり開発環境を作っておきたいところです。

Macでの開発環境の構築方法を詳細に説明したので、そちらも合わせてご覧ください。

マストドン開発環境のMacへの構築方法|サクサク開発!ユーザ増!マストドン(Mastodon)をお手元のMacで開発するための環境構築方法のご説明をします。 なぜ開発環境が必要か ネット上には、「...

さらに話は変わりますが、

実名制SNS市場でのFacebookの独占体制ってよくないと思いませんか?

Facebookはフェイクニュース(偽ニュース)への対策が甘いと批判を受けています。また、Facebookはユーザーの画面を勝手に操作し、モルモットのようにユーザーを心理実験をしているというニュースもありました。

やはり独占体制によってあぐらをかいているのでしょう。

まだ、実名制をうたっているインスタンスはありません。

なので、Mastodon界のFacebook、いやFacebook打倒を目指して、実名限定のインスタンスを立ち上げました!世界初です。

その経緯はこちら。

世界初!実名制マストドンEverydon登場!打倒Facebook!Mastodon(マストドン)すごいブームですね。Pixivやドワンゴも参戦して、これからさらに多くの企業も始めるかもしれません。 ...

なので、実名出したくない方は、登録しないでくださいね。アカウント停止作業が割と大変なので。

ただ、今ならまだ若いユーザー番号が手に入ります。

Twitterでもそうですが、桁が小さいユーザー番号だったり登録日付が超初期だったりすると、情報感度が高いという永遠の称号になります。後悔したくない方はお早めに。

あと、この記事をシェアする場合は、実名で登録してくれそうな友達がいる方のみお願いします。スパイのように匿名で入る人にたくさん来られても困るので。

とはいえ、これがもっと広まれば、Facebookへのプレッシャーもかけられるはずです。

一緒にFacebookの独占体制を打ち破りましょう!