noellabo's tech blog

@noellaboの技術ブログ

tootctl accounts cull

以下の内容は、Mastodonのtootctlコマンドの非公式リファレンス 兼 解説記事です。 移動されたり、別の形で再公開されることが予想されますので、あらかじめご承知おきください。

accounts cull コマンド

もう存在しないリモートアカウントを削除します

ヘルプ

使い方:

tootctl accounts cull

オプション:

オプション 説明 必須
--dry-run 実際には削除を行わず、チェックだけを行う(予行演習) ×

説明:

データベース内のすべてのリモートアカウントに対してクエリを実行して、それがオリジンサーバーにまだ存在するかどうかを判断し、存在しない場合はデータベースから削除します。

一週間以内の活動を確認したアカウントはチェックから除外されます。

到達不能なドメインはチェックされません。

--dry-runオプションを使用すると、削除は実際には実行されません。

解説

使いどころ

リモートのアカウントのうち、閉鎖したサーバのアカウントや、アカウント削除依頼が伝播してこなかった(漏れた)アカウントの存在をチェックして、データベースの掃除を行うコマンドです。

サーバの閉鎖時は、単に接続できなくなるだけで、個々のアカウントの削除処理を行いません。これを実行してしまうとFediverseに一度に莫大な量のActivityをばらまくことになり、負荷が大きすぎるためです。

また、Mastodon以外のサービスが、必ずしも削除時に削除依頼のActivityを投げてくるとは限りません。

そのため、一定期間運用を続けていると、実際には削除されたリモートアカウントがデータベースに残るようになります。

確認に負荷がかかるので、頻繁に実行する必要はありませんが、何かの折りに実行することで、データベース容量の節約、配送エラーの削減など、サーバの動作を良好に保つことができます。

使う上でのポイント

相手先サーバがメンテナンスなど一時的にアクセスできない場合、削除されたかどうかを判断できないので、それらは保留されます。

閉鎖されたサーバなどでHTTP 410 Goneを返すように設定されていたり、削除されていることを示すHTTP 404 Not Foundが返されてくる場合は良いのですが、サーバやドメインが既に解約されていたりして、レスポンスが返ってこない到達不能状態になっている場合、このコマンドでは永遠に削除することができません。

実行後に到達不能のドメイン一覧が表示されるので、一時的な問題か、実際に閉鎖されたのか、情報収集して判断し、閉鎖されたドメインのアカウントを削除する場合はdomains purgeコマンドの実行が必要です。

未確認のドメインがなくなれば、実行後の報告メッセージが緑で表示されるようになります。"オールグリーン"です!

このコマンドは、かなりのリモートアカウントを一度にチェックすることになるため、実行にかなりの時間を要します。

ただし、実行中に存在を確認できたアカウントについてはtouchすることで確認済みの印をつける(アカウントのupdate日時が更新される)ので、7日以内に再実行した場合は未確認アカウントのみをチェックすることができるようになっています。

実際の動作

ActivityPubで接続しているリモートアカウントをすべて走査し、7日以内に登録したか情報が更新されたアカウントを除外して、相手のサーバが404または410エラーを返してくる(アカウントが存在しないか、サーバが閉鎖されている)場合にだけ、--dry-runオプションが指定されているかに応じて、指定されていればなにもせず、指定されていなければサスペンド処理を行ってから削除します。

また、存在が確認されたアカウントの情報を更新します(updateの更新のみ)。

チェックの際に応答を返してこないサーバは記憶し、コマンド実行中該当サーバへはチェックを行わずスキップします。コマンド実行結果に、応答を返してこなかったドメインの一覧を表示します。

実行中は、チェックを行ったアカウントにつき、存在しないことが確認されたものを緑の+で、存在が確認されたものを.で表示して経過を報告します。

実行が終了すると、削除した件数、スキップしたドメインの件数、--dry-runの場合は(DRY RUN)という報告を、スキップしたドメインがない場合はグリーンで、ある場合はイエローで表示します。

また、スキップしたドメインの一覧を報告します。

参考情報

ActivityPubでは、削除されたobjectが要求されたとき、Tombstone(墓碑)をobjectとしてHTTP 410 Goneで返すか、見つからないとしてHTTP 404 Not Foundを返す仕様になっています。