Misskey v12フォークを作ってる話

2024-12-20

この記事は Fediverse Advent Calendar 2024 の 12/20 の記事です。

気づいたら終わろうとしている2024年ですが皆様いかがお過ごしでしょうか。

ほとんどの方は既存のActivityPub実装を使用してFediverseライフを楽しまれてることと存じますが、私は既存の実装では満足できないほどのSNS廃人なので、Misskeyの旧バージョンのフォークをハードフォークして日々理想のSNS作りに勤しんでいます。

本日はそんな私が開発しているMisskey v12のフォーク、Nexkey(Altairに名称変更予定)とその今年行なわれた変更を紹介をしていこうと思います。

オリジナルフォークのコンセプト

既存のSNSとして使えるActivityPub実装はインスタンスを一般公開することが前提となっていることが多く、それが故に機能とリソース消費量が多いものがほとんどです。Mastodonにはシングルユーザーモードが存在しますがこれを有効にしても大してパフォーマンスは改善しません。

GoToSocialのようなマイナーな実装にはエコなものも存在しますが、これにはカスタム絵文字リアクションなど個人的に欲しい機能が不足しています。Misskeyのモダンさやコンセプトとなっている「楽しい」見た目といったメリットを維持しつつ、メモリやCPUの使用量が少ない実装を目指し、Misskey v12のハードフォークとして開発されているのがAltairです。

Why Misskey v12

まず前提として述べておきたいことは、私がフォークしたのは主に「おひとり様インスタンス」と呼ばれているものにフォーカスした実装が欲しいからであって、現状の本家Misskeyと敵対するような実装を開発することが目的ではないということです。

当初は自分が運営していた公開インスタンス用(サ終済み)という側面もありましたが、今のAltairが目指しているものはMisskeyやFirefish、Mastodonなどのメジャーな実装より、どちらかといえばDolphin に近いです。

(だからEoLがアナウンスされた同じv12フォークであるFirefishの代替としてはあまり使えないと思う、一定以上の規模のインスタンスの場合他の実装を使うことをおすすめします。)

Misskeyはv13以降、ロール機能など大規模なインスタンスで運用されることが前提となっている機能を増やしており、これに伴いソースコードがかなり肥大化しています。

おひとり様や身内のインスタンス向けのフォークを開発するにはそこまで肥大化していないものの、そこまで古くなっていないv12がベースに最適だったというのが最大の理由です。

ここからは今年オリジナルフォークに行った変更の一部を紹介していこうと思います。

メモリ使用量の削減

Misskeyは元々クラスター構成で起動する仕様になっています。デフォルトだとWorkerの数は1で、Main (Master)とWorkerの2つのプロセスが親子関係で起動します。

この親プロセスが行ってることは実はそう多くはありません。ジョブキューのステータスの監視と定期的なジョブの実行くらいです。リクエストへの応答やジョブキューの処理などは全てWorkerプロセスが行なっています。Workerの数を増やさない限りあまり親プロセスを分離することにメリットはありません。また小規模なインスタンスではWorkerを増やすメリットもほぼありません。そのためこの2つのプロセスを統合してメモリ使用量を削減するという変更を行いました。

統合するだけなら比較的簡単です。が、問題が一つ発生しました。この親プロセスの役割の一つにサーバーメトリクスのデータの収集という役割があります。その機能が依存している systeminformation というライブラリが execSync などの、サーバーで重要なioパフォーマンスに著しい悪影響を及ぼす関数を多用していることが判明。この処理をWorkerに持ち込んでしまうとサーバーの応答性が悪化したり、CPU使用率が悪化してしまう恐れがあります。

考えた末にサーバーメトリクスで表示可能な情報を減らし、メモリ関係の情報とCPU使用率だけnodeの標準の非同期関数を使って取得するよう変更を行いました。

機能の削減

ターゲットとしているおひとり様や身内サーバーに不要と思われるチャンネルやギャラリー、Pagesなどの機能を削除しています。これはコードの量を減らしてメンテナンスしやすくすること、パフォーマンスを向上させることが狙いです。またパフォーマンスに悪影響を及ぼしていたチャートも最近消されました。

今後やりたいこと

大規模なリファクタリング

かなり大雑把な目標ですが、現状Misskeyの旧バージョンをベースにしてることもあり、あまり全体的にコードの品質がよろしくありません。

来年以降はこの問題を少しづつでいいのでクリアしていこうと思います。とりあえず大量の型エラーから地道に潰していきたい。

アンチスパム機能の強化

今年に入りスパム(荒らし)がかなり増えたのもあり、スパム対策の機能をそのうち本体に組み込みたいと思っています。

具体的にはNGワードやメンション制限などの機能を計画していますが、個人的に忙しかったのもありかなり後回しになっています。来年こそは実現したいねといったところです。

おわりに

個人的な事情で忙しい日が続きそうですが、今後も暇な時間を使って開発していこうと思っています。
最後まで読んでいただきありがとうございました。

All posts