Auto purge uploads from old deleted posts

Discourse already automatically removes orphan unreferenced uploads. Why not expand this functionality and erase uploads from deleted posts? Only staff members are able to see deleted posts and that is very useful. But is it really necessary to keep all the files indefinitely? As administrator I really don`t care about 2 years old deleted pictures. Some of which may even be right out against site guidelines.

It would be nice if Discourse would automatically delete these kind old files and place some kind of text block in the place of deleted file. So that it would be evident that file deletion has taken place.

For example all year old uploads which are referenced only in deleted posts would be automatically deleted.

8 Mi Piace

Lo vorrei davvero anche io.

Sembra che questa funzionalità sia in parte implementata:

Impostazioni che uso:
clean orphan uploads grace period hours: 1
purge deleted uploads grace period days: 1

Tuttavia, un caricamento eliminato non include il caso di un post eliminato con l’immagine in esso contenuta. Credo che l’immagine/caricamento debba essere prima rimosso dal post prima dell’eliminazione.

Posso confermare che le immagini non verranno eliminate se il (unico) post contenente quella specifica immagine è stato eliminato, poiché ho immagini che esistono ancora nel database e in S3 da un post eliminato nel 2023 (con l’immagine non utilizzata in altri post). Non me le ha mai eliminate nemmeno nei casi precedenti.

Quindi, se un moderatore elimina un post perché contiene un’immagine caricata che viola le regole, per eliminarla veramente deve prima rimuoverla dall’argomento/post (e sperare che non esista in altri post). Altrimenti, rimarrà su S3 indefinitamente, almeno per quanto ne so.

Alcune funzionalità che sarebbero davvero ottime:

  • purge deleted uploads grace period days - O includere questa impostazione nel caso di un’immagine contenuta in un post eliminato, o aggiungere un’altra impostazione per quel caso.

  • purge deleted uploads grace period days - Usare ore invece di giorni. Le richieste di rimozione per violazione del copyright generalmente richiedono un’azione estremamente rapida, entro 24-48 ore. 1 giorno è troppo lento per questo caso. È probabile che anche la cache di qualsiasi CDN debba essere rimossa manualmente dopo l’eliminazione, rendendo la tempistica ancora più stretta.

  • Possibilità di eliminare/rimuovere un’immagine dalla dashboard. Tuttavia, se purge deleted uploads includesse le immagini all’interno dei post eliminati, questo sarebbe meno necessario, ma ci sono ancora casi come l’immagine utilizzata come avatar, o banner del profilo, ecc., oltre ad essere più efficiente per i moderatori. Feature suggestion: Image removal/purge via web dashboard

  • Rendere ricercabili gli URL delle immagini, questo coprirebbe il caso di un moderatore in grado di trovare tutti gli argomenti/post che contengono una specifica immagine per eliminare anche quei post. Senza dover usare SSH.

  • La possibilità di bannare determinati hash dai caricamenti sarebbe un bel tocco.

Sarebbe bello perché allora processi come questo potrebbero essere gestiti da qualcuno senza accesso SSH e competenze tecniche. Soprattutto per la rapidità con cui devono essere gestiti. È proibitivamente costoso avere personale tecnico pronto 24 ore su 24, 7 giorni su 7, per gestire qualsiasi caso di questo tipo che si presenta, anche durante le festività, i fine settimana, quando qualcuno è malato, ecc. Non si può prevedere quando si verificherà, quindi è necessario essere sempre pronti a gestirlo tempestivamente in qualsiasi momento. È un attributo ineludibile dell’UGC.

1 Mi Piace

Mi chiedo perché non se ne parli più ampiamente? Questo è davvero un grosso problema.

Ho scritto uno script PHP, che utilizza un file CSV generato dalla seguente query SQL che elenca tutti i caricamenti e i loro riferimenti:
(aumenta il limite se hai molti caricamenti)

SELECT 
    uploads.original_filename,
    ROUND(uploads.filesize / 1000000.0, 2) AS size_in_mb,
    uploads.extension,
    uploads.created_at,
    uploads.url,
    upload_references.upload_id,
    upload_references.target_id,
    upload_references.target_type,
    upload_references.created_at,
    upload_references.updated_at
FROM upload_references
JOIN uploads ON uploads.id = upload_references.upload_id
ORDER BY upload_references.target_type
LIMIT 90000

Ora, ciò che fa lo script è filtrare i caricamenti che rimangono solo come bozze (che rimangono erroneamente nel database come ho spiegato qui). Lo script produce una stringa separata da spazi con tutti i nomi dei file. Puoi anche modificare lo script per produrre il percorso completo (rimuovere la funzione basename()).

Quindi accedi al tuo server SSH di discourse ed esegui il comando rm per tutti i file.

  • Uno svantaggio di questo è che verranno eliminate anche tutte le immagini che rimangono nelle bozze attive (ma questo può essere limitato abbassando elimina bozze più vecchie di n giorni).
  • Secondo svantaggio: le voci errate nel database rimangono ancora, per questo dovrei chiedere una correzione agli sviluppatori.

Se le voci errate vengono eliminate, il problema dovrebbe essere risolto correttamente.

<?php 
 
if (($open = fopen("test.csv", "r")) !== false) {
    while (($data = fgetcsv($open, 100000, ",")) !== false) {
        $array[] = $data;
    }
 
    fclose($open);
}
$final = array();
$i=0;
foreach ($array as $item){
	if($item[7]=="Draft"){
			foreach ($array as $item_inside){
			if(($item_inside[4]==$item[4]) && ($item_inside[7]!="Draft")) $i++; //taisa i++, kad nav tikai drafts
			}
		if($i==0)array_push($final, $item[4]); //bija tikai drafti, var likt masiivaa
		$i=0;
	}
}
$final_unique= array_unique($final);
//print_r($final_unique);
 
foreach($final_unique as $single){
	echo basename($single)." ";
	}
?>

Il file test.csv contenente la query dovrebbe essere posizionato nella stessa directory dello script.
Se hai problemi, chiedi pure!

3 Mi Piace

La mia ipotesi è che forse molti non si rendono conto che i caricamenti non vengono eliminati automaticamente.

Allego un altro thread pertinente, per chi volesse leggere di più:

2 Mi Piace

Speravo che questo fosse già stato risolto dopo tanto tempo. Potrei dover ricontrollare se gli orfani rimangono ancora sul server. Comunque quello script salva la vita.

3 Mi Piace

Ehi! Penso che questo sia stato in qualche modo risolto la scorsa settimana…

Ora abbiamo un’automazione[1] per rimuovere il markdown di caricamento dei post eliminati, ad esempio:

 Ehi, è un post normale con un link a [Discourse](https://www.discourse.org) 
 e un'immagine: ![logo.png|100x200](upload://gj6GJHlc1Sa5YXuGz549oXBbcFv.png)
 e un file: [small.pdf|attachment](upload://3bWzVVoRhUXxi7tiPenInoebHyX.pdf) (130 Byte)

Quando l’automazione è stata eseguita in questo post, questa sarà la versione revisionata:

 Ehi, è un post normale con un link a [Discourse](https://www.discourse.org) 
 e un'immagine:
 e un file: 

E poiché questi caricamenti sono ora orfani, saranno rilevati dal processo di pulizia dei caricamenti


Inoltre, se sei self-hosted, puoi aggiornare le direttive di controllo della cache con le impostazioni s3_stale_while_revalidate e s3_max_age


  1. Rimuovi markup di caricamento nei post eliminati è il nome dell’automazione ↩︎

1 Mi Piace