Bereinigen von Uploads und Löschen von Uploads aus S3

:bookmark: Dies ist eine Referenzanleitung, die beschreibt, wie verwaiste und gelöschte Uploads automatisch von einer Discourse-Website entfernt werden. Diese Anleitung gilt sowohl für selbst gehostete als auch für gehostete Discourse-Websites.

:person_raising_hand: Erforderliche Benutzerstufe: Administrator

Haben Sie sich jemals gefragt, was mit Dateien und Bildern passiert, die auf einer Discourse-Website hochgeladen wurden, aber nicht mehr referenziert werden, oder wie Sie Uploads von einer Website entfernen können? Sie sind hier genau richtig!

Möglicherweise müssen Sie Dateien und Bilder löschen, die auf Discourse hochgeladen wurden, aber nicht mehr referenziert werden. Es gibt keine integrierte Möglichkeit, dies über die Benutzeroberfläche zu tun. Discourse verfügt jedoch über einen automatischen Sidekiq-Job mit dem Namen clean up uploads, der regelmäßig verwaiste und gelöschte Uploads entfernt.

Verwaiste und gelöschte Uploads

:information_source: Verwaiste Uploads sind Dateien, die auf eine Discourse-Website hochgeladen wurden, aber nicht mehr referenziert werden. Ein Upload gilt nur dann als verwaist, wenn er nicht referenziert wird:

  • In der neuesten Version eines Beitrags
  • In einem Entwurf
  • In einem wartenden Beitrag
  • In einer Site-Einstellung (z. B. Logo, Favicon)
  • In einem benutzerdefinierten Emoji
  • In einem Theme
  • In einem Benutzer-Avatar/Hintergrund/Kartenbild
  • In einem Kategorie-Logo/Hintergrundbild
  • In einem Abzeichenbild
  • In einem Gruppen-Flair-Bild

:information_source: Uploads gelten als „gelöscht", wenn das Thema/der Beitrag, in dem sie enthalten sind, gelöscht wird.

Bereinigung von Uploads

Um einen Upload vollständig von Discourse zu entfernen, müssen Sie eine der folgenden Maßnahmen ergreifen:

  • Erzwingen Sie, dass der Upload verwaist wird, indem Sie jegliche Referenz auf den Upload entfernen. Dies kann erreicht werden, indem Sie den Upload-Link aus dem Beitrag, in dem er enthalten ist, oder aus allen anderen Stellen, an denen der Upload referenziert wird, entfernen.
  • Löschen Sie alle Themen/Beiträge, die den Upload enthalten, wodurch der Upload als „gelöscht" gilt. Beachten Sie, dass Sie das Bild aus dem Beitrag entfernen müssen, bevor Sie den Beitrag löschen, um ihn zu verwaisten.

Alle verwaisten, nicht referenzierten Uploads und gelöschten Uploads werden dann nach Ablauf einer Gnadenfrist aus dem Speicher entfernt, sobald der Job clean up uploads ausgeführt wird.

Site-Einstellungen

Die folgenden Site-Einstellungen sind unter example.discourse.com/admin/site_settings/category/files verfügbar, um zu konfigurieren, wie Discourse Uploads automatisch bereinigt.

  • clean up uploads: Standardmäßig aktiviert (true)
  • clean orphan uploads grace period hours: Standardmäßig 48
  • purge deleted uploads grace period days: Standardmäßig 30

Die Einstellung clean up uploads kann verwendet werden, um die automatische Löschung verwaister, nicht referenzierter Uploads zu aktivieren oder zu deaktivieren. Die Einstellung clean orphan uploads grace period hours steuert, wie lange nach dem Erkennen eines verwaisten Uploads gewartet wird, bevor dieser entfernt wird. Die Einstellung purge deleted uploads grace period days steuert, wie lange getombstone-te (gelöschte) Uploads aufbewahrt werden, bevor sie endgültig entfernt werden – dies wird durch einen separaten geplanten Job namens purge deleted uploads behandelt.

Weitere Details zum Job clean up uploads finden Sie in der Datei clean_up_uploads.rb auf GitHub.

Bereinigung von S3-Uploads

:warning: Der folgende Abschnitt gilt nur für selbst gehostete Discourse-Websites.

:information_source: Wenn Sie derzeit unseren Enterprise-Plan nutzen, wenden Sie sich bitte an team@discourse.org, wenn Sie Fragen zum Löschen von Uploads aus Ihrem S3-Speicher haben.

Die Bereinigung verwaister und gelöschter Uploads funktioniert sowohl für lokalen als auch für S3-Speicher ähnlich. Der einzige Unterschied zwischen lokalem Speicher und S3-Speicher besteht darin, dass die Bereinigung von S3-Uploads automatisch von S3 über eine Tombstone-Richtlinie durchgeführt wird. Weitere Einzelheiten dazu, wie dies bei S3 gehandhabt wird, finden Sie unter Verwalten des Speicherlebenszyklus.

Standardmäßig umfasst der Job clean up uploads auch S3-Uploads. Wenn Sie diese Funktion jedoch deaktivieren möchten, können Sie die Site-Einstellung s3 configure tombstone policy deaktivieren.

4 „Gefällt mir“

Ist das korrekt? Ich glaube, Sie müssen das Bild aus dem Beitrag entfernen, bevor Sie den Beitrag löschen, um ihn zu verwaisten.

Sollte der letzte auch purge deleted uploads grace period days lauten?

1 „Gefällt mir“

Das Aktivieren von „Uploads bereinigen“ klingt mit der Warnmeldung beängstigend. Beim Konvertieren eines bestehenden Forums in Discourse wird diese Einstellung deaktiviert. Nicht alle Import-Skripte registrieren alle Uploads in Beiträgen ordnungsgemäß. Wenn Sie diese Einstellung aktivieren, verlieren Sie möglicherweise viele Anhänge.

Mit der folgenden Abfrage können Sie überprüfen, ob Uploads ordnungsgemäß von den Beiträgen referenziert werden:

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)

Diese sollte keine Zeilen zurückgeben, wenn alles korrekt ist. Wenn Sie diese Abfrage im Data Explorer Plugin verwenden, werden auch die Beiträge mit nicht referenzierten Anhängen ordnungsgemäß verlinkt.

Wenn die obige Abfrage Ergebnisse zurückgibt, können Sie die fehlenden Upload-Referenzen mit der folgenden Abfrage beheben:

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;

Sie benötigen direkten Datenbankzugriff, um die korrigierende Änderung vorzunehmen.