なんで建てた
9か月ほど続けていた某企業のインフラエンジニアの手伝いという職を4月一杯で失うことになり,春休み中なんもしてないじゃんとなりなんか手を動かさねば…と思っていた内に急に思い立った.
そのアルバイトではAWSを扱っていて,その感覚を忘れないうちにAWSの無料枠を使ってみることにした.なのでとりあえず1年は無料.
(アルバイトで得た知見などもそのうち記事にまとめたい.手伝いとはいえとても個人ではできないことを体験できたので)
ちなみに建てたのは今現在のTwitter運営に関する諸々の騒動が発生する前である.だから何というわけではないが建ててよかった.
今は気分でTwitterとMastodonを使い分けている.
自鯖というものを持ってWebコンテンツを運用するという経験がなかったのもある.
ところで,現在Mastodonのサーバは「インスタンス」ではなく「サーバ」と呼ばれているらしい.いつから変わったかとか,変わった理由などはよくわからないが,とにかく公式(https://joinmastodon.org/)の紹介文に「インスタンス」という語はない.よってこの記事では「インスタンス」はEC2のインスタンスを,「サーバ」はMastodonのサーバを指すことにする.
ただし https://docs.joinmastodon.org/ では"instance"という表記がほとんどである.どっちだよ.
使ったAWSのいろいろ
なんとこれ(CPUコア1つにRAM 1G + swap)でMastodonは動く.
Mastodonのアカウントの作成にはSMTPサーバが必要.
メディアストレージとして.
トゥートの全文検索用ではなく,ロギングのため.CognitoはKibanaへのログインのため.
作業工程
最初に無料で建てたと言ったな?あれは嘘だ.
ドメイン名すら持ってなかったので買った.Webサービスを自分で運用するなら最低限ドメイン名は持つ必要がある.
レジストラはGoogle Domainにした.Gに依存するのはよくないとはよく言われるが,サイトのUIがシンプルだしWHOIS公開代行は無料だし日本語表記なので使いやすい.
その辺のサービス品質は業界では普通なのかもしれないが,ほかにお名前.comしか使ったことがないのでわからない.
後から知ったのだが,".dev"というgTLDはGoogleがレジストリで,なぜかhttpsが必須らしい.
get.dev
ついでに「ドメイン」ではなく「ドメイン名」と表現するのも初めて知った.
AWSインフラの構築
AWSのアカウントを作り,ルートアカウントをそのまま使うのでは何かと不用心なので作業用のIAMユーザを作り,適当にポリシ(AdministratorAccess)を付与しておく.
ついでにルートアカウントで使用料の通知設定をしておく.この辺の入門的な作法は「AWSをはじめよう」という技術書がわかりやすい.完全に初歩から(AWS以前に,インフラとは何か?から)書かれており,題名の通りAWSを初めて触るにはいいと思う.
booth.pm
作業用のIAMユーザでサインインし直してVPCとサブネットを作成する.もちろんインスタンスを作成するときに一括でできるが,復習のために予め作った.一応IPv6 CIDRも設定した.
セキュリティグループも作っておく.インバウンドのポートは22,80,443,それにGitが使う9418を開けておく.後から考えると当たり前だが,9418を開けなかったせいでかなり苦労した(後述).アウトバウンドは全開放とした.
Mastodonの公式ドキュメントの前提になっている,Ubuntu18.04を選択した.
EBSボリュームはデフォルトの8GBから少し増やした方がよかった.20GBまで無料である.もちろん後から足してマウントすればいいのがEBSだが.
インスタンスが建ったらElastic IP(固定IPv4アドレス)を設定しておいた.
SES
dev.classmethod.jp
これを参考にした.おひとり様サーバなのでアカウントは一つしか作らない.よってメールは自分に対して送るだけなので,英作文して承認されるなどの作業は必要ではない.
そもそも一つしかアカウントを作らないならDBを直接いじればいいそうだが,よくわからなかったので別にSMTPサーバを用意した.
Elasticsearch
後述.
Preparing your machine - Mastodon documentation
と
Installing from source - Mastodon documentation
と
Setting up your new instance - Mastodon documentation
の通りにやった.本当に書いてある通りにやっただけなので書くことはあまりない.ファイアウォールの設定はセキュリティグループがあるので省略した.
Dockerコンテナがあるのでそれを使う方が作業は少ないが,nginxやらpostgresqlやらを触るのも初めてだったので,非Docker環境とした.シングルコアなのでビルドに数時間かかるし,SSHセッションも切れる.
一か所詰まったところがあって,bundle install
の際にhttp_parser.rb
というgemがどうにも正常に入らず,
Git submodules cannot be checked out if 9418 is blocked by saper · Pull Request #59 · tmm1/http_parser.rb · GitHub
を見つけてGemfile
の当該箇所を0.6.1に勝手に上げた.
これでhttpsでgemをクローンすることができるようになったのでひとまずビルドが成功し,トゥートもできたが,リモートフォローができない状態だった.
結局http_parser.rb
のバージョンを戻し,一時的に9418を開けてbundle install
し直し,さらに再ビルドすることで事なきを得た.意地でも9418を開けなかったために数日を無駄にした.
とりあえずこれでMastodonが動いた.めでたしめでたし.
メディアのS3移行
別におひとり様なのでストレージ数が足りなくなるわけではないが,
takanory.hatenablog.jp
を参考にしてやってみた.ついでにCloudFrontも間に導入してみた.
しかし数日でS3のリクエスト数の無料枠上限が埋まりそうになったので,すぐにインスタンスのローカルに戻した.Mastodonは自サーバのアカウントがフォローしている他のFediverseアカウントのメディアもキャッシュするからだと思われる.
戻し方はaws s3 sync
で逆をやり,.env.production
のS3なんとかの行をコメントアウトして各サービスをrestart
するだけ.
流石にRAMが1GBでは無理があったようで,WebUIが非常にモッサリする.
そこでEBSを2GB足してスワップ領域を追加した.これでサクサク動くようになった.
aws.amazon.com
Filebeat+Elasticsearch+Kibanaによるロギング環境の構築
これは別記事にまとめる.
おわりに
こうして出来上がったのが
mstdn.wiper.dev
これ.とりあえずTwitterなどで知ってる人と鯖缶っぽい人をフォローしてみている.
サーバを建ててから約1か月経っているので,すでに忘れていることが多々ある.
万が一この記事を参考にMastodonのサーバを建ててみるという人がいた場合,情報が欠けている可能性があることに注意してほしい.
文中に書かなかった参考文献
booth.pm
「AWSをはじめよう」の前作.
blog.yukiya.me
過去にjpとpawooとqiitadonのアカウントを作っていたが使っておらず,現在のMastodonを知らなかった.
qiita.com
保守.
qiita.com
jpの閉鎖告知の後,なぜかアクセスができなくなったのでチューニングを考えていた際に見つけた.
おひとり様サーバなのに負荷がかかったのなぜ…?そもそも負荷が増えたのか…??
他にAWSの公式ドキュメントをいろいろ読んだ.