[master勢のみ・修正されました] Mastodon の 不完全な ActivityPub 対応を取り除く

注意:この記事は、古い状態について述べています。冒頭の追加部分をお読みください。

修正されました

問題を解決するコミットが追加されました。それにより、ここに記されるパッチは、ActivityPubの相互接続性に障害を与える可能性を増加させます。このパッチは、適応せず可能な限りmasterへの追従を続けてください。(さもなくば、v1.5.1での運用を推奨します。)

Require "inbox" to be set on actor to be ActivityPub-ready (#4595) · mastodon/mastodon@26d2664
Your self-hosted, globally interconnected microblogging community - Require "inbox" to be set on actor to be ActivityPub...

以下は、アーカイブです。

8月9日に組み込まれた、”Add ActivityPub inbox (#4216)” というコミットで、 Mastodon に部分的に ActivityPub 対応が行われました。しかしながら、多くの既存の Mastodon インスタンスを ActivityPub 対応と誤認識する問題があります。(執筆時現在、まだ修正されていません。)

ここでは、この状態で運用された環境において、master運用を続けながらも、この問題を回避する手段を記します。

問題のコミット

問題となっているコミットは、以下のものです。

Add ActivityPub inbox (#4216) · mastodon/mastodon@dd7ef0d
* Add ActivityPub inbox * Handle ActivityPub deletes * Handle ActivityPub creates * Handle ActivityPub announces * Stubs...

問題の概要

Mastodon は、現在 Ostatus から ActivityPub へ相互通信のプロトコルを置き換えようとしています。その中で、問題のコミットでは、ユーザーが “Ostatus を介するユーザー” か “ActivityPub を介するユーザー” か判定されるようになりました。

しかしながら、Mastodon v1.3.0以降の全てのユーザーが、ActivityPub を介するユーザーであると誤認識される問題があります。現在、 master を含む全ての Mastodon は、 ActivityPub に必要な機能の全ては実装していないため、そのように認識されることで、様々なやりとり(フォロー・お気に入り・ブースト・購読)が失敗し、最終的にトゥートが届いてこなくなります。

ユーザーが ActivityPub を介すると認識されるタイミング

WebFinger によるユーザー情報の取得のタイミングで情報が更新され、 Ostatus から ActivityPub に切り替わります。様々な相互のやり取り(フォロー・お気に入り・購読など…)が行われるタイミングで関係のあるユーザーの情報が更新されます。また、もともと登録されていなかったユーザーを検索などで取得した場合も ActivityPub を介するユーザーとして登録されます。(備考:GnuSocial は、大丈夫です。)

間違って登録されているリモートユーザーを確認する。

以下のSQL文を Mastodon のデータベースに行ってみることで確認できます。

SELECT id,username,domain,protocol FROM accounts WHERE protocol=1;

これで、列挙されるユーザーは、 ActivityPub を介するユーザーとして認識されており、様々な問題が起きているはずです。

問題への対応

1. 判定の修正(さらに間違いが増えないように)

まず、 ActivityPub として新たにユーザーが認識されないように対応しなくてはなりません。簡単には、以下の2通りの方法が考えられます。

  • 当該コミットのマージ以前のMastodonを利用する。
  • 判定を一時的に強制的に書き換えることで、 ActivityPub 対応を取り除く。

判定の書き換えについては、以下のようにすることで可能です。

https://github.com/yukimochi/mastodon/commit/1c6ce49f41c7476bf54860cf0029e2061709f5c3

2. ActivityPub を介するユーザーとして登録されたユーザーの情報を再取得させる。

続いて、 ActivityPub を介するユーザーとして登録されてしまった Mastodon のユーザーの情報を修復する必要があります。これには、WebFinger によるユーザー情報の再取得が必要となります。ここでは、 WebFinger 情報の有効期限を強制的に切ることで、早急に再取得を促します。

以下のSQL文を Mastodon のデータベースに行います。

UPDATE accounts SET last_webfingered_at=null WHERE protocol=1;

さらに、有効期限が切れた WebFinger 情報の更新を今すぐ行ってしまいましょう。

rails console にて以下のコードを実行します。

Account.where(protocol: :activitypub).each {|acc| ResolveRemoteAccountService.new.call(acc.acct) }

※あるユーザーの更新にエラーが生じるとそこで実行が中断されてしまうので、そのユーザーに関しては以下のように強制的に Ostatus を介するユーザーとして DB を書き換えて対処します。(なるべくしたくない)

UPDATE accounts SET protocol=0 WHERE id=<エラーの生じたユーザーのID>;

これで再度、確認のためにSQL文を実行して、何も表示されなければ正常に更新できました。

SELECT id,username,domain,protocol FROM accounts WHERE protocol=1;

3.再購読などをして、関係を修復する。

ActivityPub を介するユーザーとして判定されていた間に再購読の期限が来ていた場合、再購読に失敗します。したがって、すべてのユーザーをもう一度購読し直すことで、関係の修復をすることを推奨します。

これらについては、以下の記事の追記2などを参考にするとよいでしょう。

Mastodonのサーバ間通信が切れた場合のリカバリ - Qiita
注: この記事に書かれている接続切れ現象は結構特殊な状況による現象です。サーバでcronを回すのを忘れている場合以下の物とは関係なく有効期限切れにより接続が切れます。サーバ管理者の人はDocke…
タイトルとURLをコピーしました