注意:この記事は、古い状態について述べています。冒頭の追加部分をお読みください。
修正されました
問題を解決するコミットが追加されました。それにより、ここに記されるパッチは、ActivityPubの相互接続性に障害を与える可能性を増加させます。このパッチは、適応せず可能な限りmasterへの追従を続けてください。(さもなくば、v1.5.1での運用を推奨します。)
以下は、アーカイブです。
8月9日に組み込まれた、”Add ActivityPub inbox (#4216)” というコミットで、 Mastodon に部分的に ActivityPub 対応が行われました。しかしながら、多くの既存の Mastodon インスタンスを ActivityPub 対応と誤認識する問題があります。(執筆時現在、まだ修正されていません。)
ここでは、この状態で運用された環境において、master運用を続けながらも、この問題を回避する手段を記します。
問題のコミット
問題となっているコミットは、以下のものです。
問題の概要
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 対応を取り除く。
判定の書き換えについては、以下のようにすることで可能です。
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などを参考にするとよいでしょう。