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

:bookmark: これは、孤児化および削除されたアップロードが Discourse サイトから自動的に削除される方法について説明するリファレンスガイドです。このガイドは、セルフホスト型およびホスト型の Discourse サイトの両方に適用されます。

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

Discourse サイトにアップロードされたファイルや画像が、もう参照されなくなった場合にどうなるのか、あるいはサイトからアップロードを削除する方法について考えたことはありますか?あなたは正しい場所に来ています!

Discourse にアップロードされたが、もう参照されていないファイルや画像を削除する必要がある場合があります。ユーザーインターフェースからこれを行う組み込みの方法はありませんが、Discourse には clean up uploads という名前の孤児化および削除されたアップロードを削除する自動 Sidekiq ジョブがスケジュールされています。

孤児化および削除されたアップロード

:information_source: 孤児化されたアップロードとは、Discourse サイトにアップロードされたが、もう参照されていないファイルのことです。アップロードは、以下のいずれの場合にも参照されていない場合、孤児化されたものとみなされます:

  • ポストの最新バージョン内
  • 下書き内
  • キューイング中のポスト内
  • サイト設定内(例:ロゴ、ファビコン)
  • カスタム絵文字内
  • テーマ内
  • ユーザーのアバター/背景/カード画像内
  • カテゴリのロゴ/背景画像内
  • バッジ画像内
  • グループのフラワ画像内

:information_source: アップロードが格納されているトピック/ポストが削除された場合、そのアップロードは「削除された」とみなされます。

アップロードの整理

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

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

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

サイト設定

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

  • 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 hours 設定は、検出された孤児化されたアップロードが削除されるまでの時間を制御します。purge deleted uploads grace period days 設定は、削除(墓碑化)されたアップロードが恒久的に削除される前に保持される期間を制御します。これは、別の purge deleted uploads スケジュールジョブによって処理されます。

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

S3 アップロードの削除

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

:information_source: 現在、エンタープライズプランでホストされている場合は、S3 ストレージからのアップロード削除に関するご質問がございましたら、team@discourse.org までお問い合わせください。

孤児化および削除されたアップロードの整理は、ローカルストレージと S3 ストレージの両方で同様に機能します。ローカルストレージと S3 ストレージの違いは、S3 アップロードの整理が 墓碑化ポリシー を通じて S3 によって自動的に処理される点です。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;

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