Nettoyage des téléchargements et purge des téléchargements depuis S3

:bookmark: Ce guide de référence décrit comment les téléversements orphelins et supprimés sont automatiquement purgés d’un site Discourse. Ce guide s’applique aux sites Discourse auto-hébergés et hébergés.

:person_raising_hand: Niveau d’utilisateur requis : Administrateur

Vous êtes-vous déjà demandé ce qu’il advient des fichiers et images téléchargés sur un site Discourse mais qui ne sont plus référencés, ou comment supprimer des téléversements d’un site ? Vous êtes au bon endroit !

Vous pouvez avoir besoin de supprimer des fichiers et images téléchargés sur Discourse qui ne sont plus référencés. Il n’existe pas de méthode intégrée pour le faire via l’interface utilisateur ; cependant, Discourse dispose d’un travail Sidekiq automatique planifié pour supprimer les téléversements orphelins et supprimés, appelé clean up uploads.

Téléversements orphelins et supprimés

:information_source: Les téléversements orphelins sont des fichiers qui ont été téléchargés sur un site Discourse mais qui ne sont plus référencés. Un téléversement est considéré comme orphelin si et seulement si il n’est pas référencé :

  • Dans la dernière version d’un message
  • Dans un brouillon
  • Dans un message en file d’attente
  • Dans un paramètre du site (par exemple, logo, favicon)
  • Dans un emoji personnalisé
  • Dans un thème
  • Dans une image d’avatar/arrière-plan/carte d’utilisateur
  • Dans une image d’arrière-plan de catégorie
  • Dans une image de badge
  • Dans une image de groupe (flair)

:information_source: Les téléversements sont considérés comme « supprimés » lorsque le sujet/message dans lequel ils sont contenus est supprimé.

Nettoyage des téléversements

Pour supprimer complètement un téléversement de Discourse, vous devez effectuer l’une des actions suivantes :

  • Forcer le téléversement à devenir orphelin en supprimant toute référence au téléversement. Cela peut être fait en modifiant le lien du téléversement dans le message où il se trouve, ou dans tout autre endroit où le téléversement pourrait être référencé.
  • Supprimer tous les sujets/messages contenant le téléversement, ce qui entraîne que le téléversement est considéré comme « supprimé ». Notez que vous devez supprimer l’image du message avant de supprimer le message pour l’orpheliniser.

Tous les téléversements orphelins non référencés et les téléversements supprimés seront ensuite supprimés du stockage (après une période de grâce) une fois que le travail clean up uploads s’exécutera.

Paramètres du site

Les paramètres du site suivants sont disponibles à l’adresse example.discourse.com/admin/site_settings/category/files pour modifier la façon dont Discourse purge automatiquement les téléversements.

  • clean up uploads : par défaut true
  • clean orphan uploads grace period hours : par défaut 48
  • purge deleted uploads grace period days : par défaut 30

Le paramètre clean up uploads peut être utilisé pour activer ou désactiver la suppression automatique des téléversements orphelins non référencés. Le paramètre clean orphan uploads grace period hours contrôle la durée après laquelle un téléversement orphelin détecté est purgé. Le paramètre purge deleted uploads grace period days contrôle la durée pendant laquelle les téléversements mis au rebut (supprimés) sont conservés avant d’être supprimés définitivement — cela est géré par un travail planifié séparé purge deleted uploads.

Des détails supplémentaires sur le travail clean up uploads sont disponibles dans le fichier clean_up_uploads.rb sur GitHub.

Purge des téléversements S3

:warning: La section suivante ne s’applique qu’aux sites Discourse auto-hébergés.

:information_source: Si vous êtes actuellement hébergé sur notre Plan Entreprise, veuillez contacter team@discourse.org si vous avez des questions sur la suppression des téléversements de votre stockage S3.

Le nettoyage des téléversements orphelins et supprimés fonctionne de manière similaire pour les stockages locaux et S3. La seule différence entre le stockage local et les stockages S3 est que le nettoyage des téléversements S3 est automatiquement géré par S3 via une stratégie de mise au rebut (tombstone policy). Consultez Gestion du cycle de vie de votre stockage pour plus de détails sur la façon dont cela est géré sur S3.

Par défaut, le travail clean up uploads inclut les téléversements S3. Cependant, si vous souhaitez désactiver cette fonctionnalité, vous pouvez décocher le paramètre du site s3 configure tombstone policy.

4 « J'aime »

Est-ce exact ? Je pense que vous devez supprimer l’image du message avant de supprimer le message pour l’oriente.

De plus, ce dernier ne devrait-il pas être purge deleted uploads grace period days ?

1 « J'aime »

Activer le « nettoyage des téléversements » semble effrayant avec le message d’avertissement. Lors de la conversion d’un forum existant en Discourse, ce paramètre sera désactivé. Tous les scripts d’importation n’enregistreront pas correctement tous les téléversements dans les publications, donc si vous l’activez, vous pourriez perdre de nombreuses pièces jointes.

Avec la requête suivante, vous pouvez vérifier si les téléversements sont correctement référencés par les publications :

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)

Cela ne devrait renvoyer aucune ligne si tout est correct. Si vous utilisez cette requête dans le plugin Data Explorer, elle liera également proprement les publications qui ont des pièces jointes non référencées.

Si la requête ci-dessus renvoie des résultats, vous pouvez corriger les références de téléversement manquantes avec la requête suivante :

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;

Vous aurez besoin d’un accès direct à la base de données pour effectuer la modification corrective.