S3からのアップロード整理と削除

:bookmark: このガイドは、Discourseサイトから孤立した、または削除されたアップロードが自動的に削除される仕組みについて説明します。このガイドは、セルフホスト型およびホスト型Discourseサイトに適用されます。

:person_raising_hand: 必要なユーザーレベル:管理者

Discourseサイトにアップロードされたが参照されなくなったファイルや画像がどうなるのか、またはサイトからアップロードを削除する方法について疑問に思ったことはありませんか? ここがまさにその場所です!

Discourseにアップロードされたファイルや画像を削除する必要がある場合がありますが、それらが参照されなくなっても、ユーザーインターフェースから直接削除する方法はありません。しかし、Discourseにはclean up uploadsと呼ばれる、孤立した、または削除されたアップロードを削除するためにスケジュールされた自動Sidekiqジョブがあります。

孤立した、または削除されたアップロード

:information_source: 孤立したアップロードとは、Discourseサイトにアップロードされたものの、もはや参照されていないファイルのことです。アップロードが孤立していると見なされるのは、次の場合にのみ参照されていない場合です。

  • ポストの最新バージョン
  • 下書き
  • キューに入れられたポスト
  • カスタム絵文字
  • テーマ
  • ユーザーアバター/背景/カード画像
  • カテゴリのロゴ/背景画像

:information_source: アップロードは、それが含まれているトピック/ポストが削除されたときに「削除された」と見なされます。

アップロードのクリーンアップ

アップロードをDiscourseから完全に削除するには、次のいずれかを行う必要があります。

  • アップロードへの参照をすべて削除することにより、アップロードを孤立させます。これは、ポスト内のアップロードリンクを編集するか、アップロードが参照されている他の場所から削除することで実行できます。
  • アップロードを含むすべてのトピック/ポストを削除すると、アップロードは「削除された」と見なされます。削除する前にポストから画像を削除して孤立させる必要があることに注意してください。

その後、clean up uploadsジョブが実行されると(猶予期間後)、孤立した未参照のアップロードと削除されたアップロードはすべてストレージから削除されます。

サイト設定

次のサイト設定は、Discourseがアップロードを自動的に削除する方法を変更するために、example.discourse.com/admin/site_settings/category/filesで利用できます。

  • clean up uploads: デフォルトはtrue
  • clean orphan uploads grace period hours: デフォルトは48
  • purge deleted uploads grace period days: デフォルトは30

clean up uploads設定を使用して、孤立した未参照のアップロードの自動削除を有効または無効にできます。clean orphan uploads grace period hourspurge deleted uploads grace period daysは、検出された孤立した、または削除されたアップロードが削除され、サイトから完全に削除されるまでの期間を制御する2つの設定です。

clean up uploadsジョブに関する追加の詳細は、GitHubのclean_up_uploads.rbファイルで確認できます。

S3アップロードのパージ

:warning: 次のセクションは、セルフホスト型Discourseサイトにのみ適用されます。

:information_source: 現在Enterprise Planでホストされている場合は、S3ストレージからアップロードを削除することについて質問がある場合は、team@discourse.orgまでご連絡ください。

孤立した、または削除されたアップロードのクリーンアップは、ローカルストレージとS3ストレージで同様に機能します。ローカルストレージとS3ストレージの唯一の違いは、S3アップロードのクリーンアップがtombstone policyを介してS3によって自動的に処理されることです。この処理方法の詳細については、ストレージライフサイクルの管理を参照してください。

デフォルトでは、clean up uploadsジョブにはS3アップロードが含まれます。ただし、この機能を無効にしたい場合は、s3 configure tombstone policyサイト設定のチェックを外すことができます。

「いいね!」 4

これは正確ですか?投稿を削除する前に画像を削除して、孤立させる必要があると思います。

また、最後のものは purge deleted uploads grace period days にすべきでしょうか?

「いいね!」 1

「アップロードのクリーンアップ」を有効にすると、警告メッセージが表示されるため、恐ろしく感じられるかもしれません。既存のフォーラムを Discourse に移行する際には、この設定は無効になります。すべてのインポートスクリプトが投稿内のすべてのアップロードを正しく登録するわけではないため、有効にすると多くの添付ファイルが失われる可能性があります。

以下のクエリを使用して、アップロードが投稿によって正しく参照されているかを確認できます。

select p.post_id, u.id as upload_id
from (select id post_id, (regexp_matches(cooked, 'data-download-href=[^\\s]+/default/([a-z0-9]+)', 'g'))[1] upload_sha from posts where raw like '%upload://%' order by created_at) as p
join uploads u on u.sha1 = p.upload_sha
where not exists(select * from upload_references r where r.upload_id = u.id)

すべてが正しければ、このクエリは何も返さないはずです。Data Explorer プラグインでこのクエリを使用すると、参照されていない添付ファイルがある投稿へのリンクもきれいに表示されます。

上記のクエリで結果が返される場合は、以下のクエリを使用して不足しているアップロード参照を修正できます。

insert into upload_references(upload_id, target_type, target_id, created_at, updated_at)
select u.id, 'Post', p.post_id, u.created_at, u.updated_at
from (select id post_id, (regexp_matches(cooked, 'data-download-href=[^\\s]+/default/([a-z0-9]+)', 'g'))[1] upload_sha from posts where raw like '%upload://%' order by created_at) as p
join uploads u on u.sha1 = p.upload_sha
on conflict do nothing;

修正を行うには、直接データベースにアクセスする必要があります。