こんにちは、Cutls Pです。これは、Fediverse (2) Advent Calendar 2020の12月10日の記事です。
はい。 ごめんなさい。米倉涼子に扮したオタク「楽天モバーーーイル!!(招待コードをチラつかせながら)」
米倉涼子に扮しきれなかったオタク「Fediverseの鯖代は 高 す ぎ る !(Digital Oceanの招待コードをチラつかせながら)」
寒すぎて一日中暖房付けてるので、どうせなら役に立つ暖房器具を身近に置いておこうということで、
自宅に鯖を置くことにした。
ちょうどmacOS環境が(iOSアプリの都合上)欲しかったので、Mac Mini 2018のi5/RAM 8GBを5.8万くらいでフリマにて落とした。
Mac Mini 2018はメモリ拡張できるので8GBでもいいかなと思った次第。
回線
もともとこの一帯は1Gbps回線しか引けないので、みんそくの評判がよさそうなプロバイダを適当に選んで契約した。
IPv6 IPoEで非混雑時間650Mbps、IPv4 over IPv6(DS-Lite: transix)だと600Mbps、IPv4 PPPoEだと400Mbpsくらい出る(有線接続時)ので
まぁ鯖にも使えるだろうと判断。
transixゲートウェイを経由した通信は自鯖には使えない。ネットワークに詳しくはないので、ポートを開けられないのだなぁ
くらしかわからないけども、とにかくIPoEか最悪PPPoEということになる。
さすがにいくら地球の石より多いv6のアドレスとはいえ、なるべく開示したくない。そもそも直接開示するとIPv6専用とかいうなかなかハードボイルドな鯖になってしまう。
そうなると自鯖勢御用達のCloudflareを通す他ない。プロキシとして挟めばCFと自鯖の間はv6で繋ぎながらv4に対してもサービスを提供できる。
外からこっちに向かってくる通信は全てCFを通るが、逆にこちらから外にする通信はDNSでAAAAが返ればIPoEで直接、Aしか返らなければtransixで通信することになる。
家庭用ルータでIPv6をブリッジ接続してるならコンピュータの設定をするだけでサーバを公開できる。NDプロキシを通しているとルータがファイアウォールとして機能するのでルータ側の設定も必要になる。今回はNDプロキシでとりあえず80ポートだけ通すようにしてみた。IPoEなのでルータ側で80ポートの宛先を決めることは無い。
443ポートもHTTPSのために開けたいのだが、とりあえずCloudflareのフレキシブルモードで対応している。フレキシブルモードとはCFとブラウザの間をHTTPSで保護して、CFと自鯖の間は通常のHTTPとして保護のない通信を行うものである。
取り急ぎの処置なのですぐCFまでの経路も暗号化する必要がある。
金があればまともなルータが欲しい。家庭用との間に挟みたい。
構築
次に、macOSにMastodonをインストールすることを考える。
方法はいくつか考えられる。
- 直接brew等を使って環境を構築し、Mastodonをインストール
- Docker for Macを使用する
- 仮想環境でUbuntu等を建てる
私は上からやっていきました
ミスりまくりましたの札
直接brew等を使って環境を構築し、Mastodonをインストール
Homebrewを突っ込んで、あとはいろいろやるだけですね!
zundaさんの https://qiita.com/zunda/items/5f8a0a8ee1e7c297dcd4 でやってみて、
devなところはproduction用に書き換えていった。
なぜかNginxが起動しない。プロセスはちゃんとアクティビティモニタに居座るがstopしても消えないし、
当然Welcome to Nginxなどと出るわけでもない。
そもそもport 80/433は抑えているはずなのにNodeでサクッと建てる系のサーバを建てたらすんなり立ち上がる。
localhostにアクセスするとNodeの方になる。
ファイアウォールから何までいろいろいじってみたもののダメなので、次にApache(httpd)で動かそうとしてみる。
しかし、これでもダメだった。
次に、GUIでいい感じにNginx/ApacheをいじくれるMAMPを試してみるが、これもいずれもダメ。
Docker for Mac
Dockerをいろいろ言い訳つけてやってこなかった民なのでどうしようもないが、
それでもいい感じに起動まではできたがポートがどうもおかしい。
そもそもまずDBのバックアップを放り込むのにめちゃくちゃ手間取ったが、
Docker何もわからないし、ポートがフォワーディングされてるのはわかるけど外に向けて何も開いてくれないし何もわからない。
Dockerは早々に諦めた。
仮想環境でUbuntuを建てた
何も書くことがないくらい普通に建った。ネットワークはブリッジにしないとダメだけどね。
もちろんメモリは先述の通り8GBしか積んでいないので、増設用の16GBメモリを注文して、ついでにセキュリティドライバーも購入。
はっやーい!すっごーい!って喜びながら牛丼を食べに外出した。
突然の別れ
1 | アクティビティモニター |
というわけで急いでDBを最バックアップして、前のVPSは全部残してあるので
DBの中身だけ入れ替えて起動してみる。
どうしてか高負荷になり何も受け付けてくれない。
これが僕らの始まりだった…
まぁ高負荷ならとりあえずスペック上げてみたらいいよねとRAM 8GB/4CoreのGCPに移動してもダメ、
挙句の果てに4Core/16GBにまでしてもダメという始末。
Sidekiqを見てみると未処理が毎秒数個溜まっていて埒が明かない。
スレッドを100くらい処理するようにしてもダメで、待機数が10000を超えてしまった。
鯖缶工場に駆け込んでみる。
まぁ大方の予想通りDBが悪さしていた。PgHeroの時間が無駄にかかりまくってるクエリ一覧
が11個もある。
ここにあるロングクエリをpsqlで入って実行してみると、index_statuses_on_uri
が使われていないという指摘。
インデックスがどっかいってしまったようだ。
CREATE UNIQUE INDEX index_statuses_on_uri ON statuses (uri);
でインデックスを再生成できるらしいが、
実行する度に被りがあるよって出てきて消してもまた別のが降ってくる。
結局いろいろ調べて重複してるやつを見たらなんと1200個もあった。そりゃ終わるはずがないのでとりあえず絶望してみる。
なんと、私がDBをぶっ壊すことを見越したのか3.3.0 rc1のリリースで
tootctl maintenance fix-duplicates
という重複直してインデックスを再生成してしまうコマンドが増えたのである。
これもなんと5分くらいで実行が終わってしまい、そのあとSidekiqは順調に処理を捌き(15スレッドx6プロセスでぶん回してた)
いい感じになったので4GB/4Coreのチョットイイマシンにして、
Mac Miniのない1週間の長いバケーションを楽しむのであった。