マストドンを立ち上げるのに苦戦して知見がついた話

マイクロブログサービスの代名詞ともいえるTwitterから脱中央集権として登場したOSS、MastodonはRailsで開発されています。自身のサーバーサイドエンジニアとして知見を増やすためにMastodonを立てみようと思いました。

最終的になんとか立てれたものの、かなりつまづきがありました。同時にそれはいろいろと知見をつけるきっかけになったので、やはり素振りはローカルで満足するものではなく、人に使ってもらえるレベルまでやってこそだな、という話。

概要

  • Mastodonをちゃんと運営する前提で立ち上げようとした
  • 考えることいっぱいあるし構築面でもかなりつまづいた
  • でも結果サーバー環境構築やWebサービス開発の知見がついた

結果的にWebサービスの本番をどう構築するか、の知見をつけたいならすでにアプリケーションはできてるMastodonは良い題材だと思いました。

Mastodon is何?

MastodonはTwitterライクなマイクロブログSNSで、Twitterのような中央集権的ではなく分散型かつOSSとして公開されているのが特徴です。日本では2017年ぐらいに一部で話題になり、個人、企業問わずいろいろとインスタンスが設立されました。

個人レベルでも分散されたサーバーのひとつ(インスタンス)を立てることができ、他のサーバーの投稿ともやりとりできます。

技術的にはサーバーサイドはRuby on Railsで、フロントエンドはReactが使われています。

動機

前述のとおりサーバーサイドはRuby on Railsです。いろんなプロダクトに関わったりコードを読んだりすればある一定の知見や技術力が増えるはずなので、今の技術の主戦場もRailsである僕には1つの勉強に使う題材としてうってつけでした。

それと同時に、ニンジャラというゲームにハマっていますがどうにも他のプレイヤーと交流が持ちづらいことも課題でした。以前からTwitterでつながりのある人達でニンジャラの話題はおろかゲームに特化した話題をしてる人も多くいません。

かといってゲーム内で交流できる仕組みもほぼなく、でもチームバトルはある程度知った人同士で組まないと勝てる絵が描きづらかったり楽しくないという状況もありました。

もっと技術を勉強したい、もっと楽しく遊びたい、この2つを上手く掛け合わせたプランとしてやってみることにしました。

期待したこと

Mastodonはそれなりに知見が広がっていたり、公式のドキュメントもしっかりしています。構築自体は比較的に楽に完了して、参加してくれる他のプレイヤーさんを巻き込みつつ楽しく運営しながら、独自の機能追加をしていけると考えました。

やってみた結果

実際やってみようと思いたってからいろんなポイントで詰まりました。実際本番サーバーが上手く動作するまでは想像より大変でした。とてもまだ機能追加まで手をだせず、構築までの知見をつけるに留まりました。

ハマリポイント

ドメインが決まらない

自分で未来を見据えてサービスを動かしていくにあたってはドメインが必要です。ですが、立てるものはMastodon、題材はニンジャラ、と決まっているものです。個人開発でのサービスのようにイチからの命名ではありません。

そしてドメインにはTLDにもよりますが、基本的にいくらかのお金がかかります。変更も再利用も効かないドメイン名を一発で決めてやっていかねばなりません。一番大事なところが一発勝負です。とはいえエイヤで始めるしかないんですが、けっこう悩みました。

どこでどうやるかを悩む

Mastdonに限らず標準的なWebサービスは、ユーザーが画像を自由に登録できたり、メールを送信したり、いろいろできることがあります。そしてパフォーマンス良く、その上で費用も抑えていかねばなりません。その上でさらにスケールできる構成にできたらなお良しです。というより運営前にどの程度の負荷があるのか、回しきれるのか判断がつきづらいと思います。

結果的には、
本番サーバー: さくらのVPS
検証サーバー: Google Computing Engine
画像用オブジェクトストレージ: Google Cloud Strorage
メールサーバー: SendGrid
CDN: CloudFlare

という構成にしました。AWSではなくGCPに寄せたのは以前に使ったことがあったり管理しやすいと思ったりぐらいでそこまで強い考えはありません。

ただし本番に関しては従量制だと金額が読めない怖さがあったので本番は定額のさくらのVPSにしました。

この決断に悩んだこともそうですが、各種サービスの登録や今回初めて使うことになったSendGridやCloudFlareの知見も必要でした。

本番、検証環境構築でハマる

そもそもMastodonはDockerのdocker-composeも用意されていたり、さくらのVPSにはインストールスクリプトが用意されているので、ただ立てるだけなら簡単にできます。

しかし、今回は将来的にある程度のカスタマイズを前提としていたり、サブドメインを使いたかったりいくつかの理由のものDockerを使わずにセットアップすることにしました。

基本的にはMastodonの公式にちゃんとステップごとの説明付きの環境構築手順があるためそれどおりで大丈夫なはずです。ですが、それでもいくつかつまりました。

VPSごとの設定とfirewallの設定でつまる

firewallの設定がVPSで特殊だったり違ったり、Mastodon公式ではiptablesで制御するように書かれていますがそのへんが一筋縄ではいかなかったのでけっこうつまりました。

検証環境メモリ不足

そこをクリアしていざ検証環境をセットアップしていく段になりました。検証環境は最小で良かったので当初GCEのf1-microを検討しました。Rubyのinstallにメモリ不足になりました。これはひとまずオプションの設定で回避できましたが、asset-precompile(Railsでデプロイ時にJSまわりをよしなにしてくれるやつ)で再びメモリ不足。これがスワップとかも使ったものの上手く打開できず、結局はGCEインスタンスのランクを上げてメモリを多くして対応しました。

(検証時にのみ起動するやりかたで費用を抑える方向にしました)

DNS, CDN, firewall, SSL対応、 Webサーバー(nginx)まわりの連携

これは単に僕の知見が少なかったため上手く動いてないときに原因を特定するのに時間がかかりました。

とまあたくさんたくさんつまりました。

今回やれなかったこと

他にもDBのチューニングやパフォーマンス対策、画像の最適化などまだまだ考えることはあります。ただそこまでやってると全然進めないためいったん目をつぶることとしました。

感想

と、まあやったこことはそこまで多くないながらも、たくさんつまりました。

ですがここで詰まったことでいざ自分で個人開発の何かを立ち上げる際や、仕事でも活きるような経験と知見ができたので結果オーライですかね。

逆に言うと今回詰まったのはアプリケーションレベルではなくネットワークやインフラレイヤーだったりサービスの話だったりなので、すでにアプリケーションが完成しているMastodonを立てようとしたからこそ集中できたかもしれません。

Mastodon立ててみた、みたいな話はいろいろありますがほとんどは単純に構築しただけが多いような気がします。Mastodonに限らず個人開発でのやってみた系はローカルまでが多かったりもします。

今回、不特定多数が使うことを想定しているからこそメールやストレージ、CDNやドメインまで含めて考えて構築することになりましたし、そこまでやらないと経験できないことがあるなぁとあらためて再認識しました。

ちなみにこちらがそれです。もしこれを読んだ人にニンジャラプレイヤーがいれば是非!

Rails newのテンプレートをちゃんと設定してみた27インチLG製ディスプレイ 27UL850-W レビュー