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 Me gusta

Yo también querría esto.

Parece que esta función está algo implementada:

Configuración que uso:
clean orphan uploads grace period hours: 1
purge deleted uploads grace period days: 1

Sin embargo, una carga eliminada no incluye el caso de una publicación eliminada con la imagen contenida en ella. Creo que la imagen/carga debe editarse de la publicación antes de eliminarla.

Confirmo que las imágenes no se eliminarán si la (única) publicación que contiene esa imagen específica ha sido eliminada, ya que tengo imágenes que todavía existen en la base de datos y S3 de una publicación que fue eliminada en 2023 (y la imagen no se usó en ninguna otra publicación). Tampoco las ha eliminado nunca en casos anteriores.

Por lo tanto, si un moderador elimina una publicación por tener una imagen cargada que va en contra de las reglas, para eliminarla realmente, primero debe editarla del tema/publicación (y esperar que no exista en ninguna otra publicación). De lo contrario, existirá en S3 indefinidamente, al menos según mi comprensión.

Algunas funciones que serían geniales:

  • purge deleted uploads grace period days - O bien, esta configuración incluye el caso de una imagen contenida en una publicación eliminada, o bien se agrega otra configuración para ese caso.

  • purge deleted uploads grace period days - Usar horas en lugar de días. Las solicitudes de eliminación por derechos de autor generalmente requieren una acción extremadamente rápida, dentro de las 24-48 horas. 1 día es demasiado lento para este caso. Es probable que cualquier caché de CDN también deba purgarse manualmente después de haber sido eliminada, lo que hace que el plazo sea aún más ajustado.

  • Poder eliminar/purgar una imagen desde el panel de control. Sin embargo, si purge deleted uploads incluyera imágenes dentro de publicaciones eliminadas, esto sería menos necesario, pero todavía hay casos como la imagen que se usa como avatar, o banner de perfil, etc., además de ser más eficiente para los moderadores. Feature suggestion: Image removal/purge via web dashboard

  • Hacer que las URL de las imágenes sean buscables, esto cubriría el caso de que un moderador pueda encontrar todos los temas/publicaciones que contienen una imagen específica para eliminar también esas publicaciones. Sin necesidad de usar SSH.

  • La capacidad de prohibir la carga de ciertos hashes sería un buen toque.

Sería bueno porque entonces procesos como este podrían ser manejados por alguien sin acceso SSH y habilidades técnicas. Especialmente debido a la rapidez con la que deben manejarse. Es prohibitivamente caro necesitar personal técnico disponible las 24 horas del día, los 7 días de la semana para manejar cualquier caso como este que surja, incluso en días festivos, fines de semana, cuando alguien está enfermo, etc. No se puede predecir cuándo ocurrirá, por lo tanto, siempre se debe estar preparado para manejar uno rápidamente en cualquier momento. Es un atributo ineludible del contenido generado por el usuario.

1 me gusta

¿Por qué no se discute esto más ampliamente? Este es realmente un gran problema.

He escrito un script PHP que utiliza un archivo CSV generado a partir de la siguiente consulta SQL, que enumera todas las cargas y sus referencias:
(aumente el límite si tiene muchas cargas)

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

Ahora, lo que hace el script es filtrar las cargas que permanecen solo como borradores (que falsamente permanecen en la base de datos como expliqué aquí). El script genera una cadena separada por espacios con todos los nombres de archivo. También puede modificar el script para generar la ruta completa (elimine la función basename()).

Luego, inicie sesión en su servidor SSH de Discourse y ejecute el comando rm para todos los archivos.

  • Una desventaja de esto es que todas las imágenes que permanecen en borradores activos también se eliminarán (pero esto se puede limitar reduciendo eliminar borradores de más de n días).
  • Segunda desventaja: las entradas incorrectas de la base de datos aún permanecen, para eso debería pedir una solución a los desarrolladores.

Si se eliminan las entradas incorrectas, el problema debería solucionarse correctamente.

<?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)." ";
	}
?>

El archivo test.csv que contiene la consulta debe colocarse en el mismo directorio que el script.
Si tiene algún problema, ¡pregúnteme!

3 Me gusta

Mi suposición sería que quizás muchos no se dan cuenta de que las cargas no se eliminan automáticamente.

Solo enlazo otro hilo relevante, para cualquiera que quiera leer más:

2 Me gusta

Esperaba que esto ya estuviera solucionado después de tanto tiempo. Quizás tenga que volver a comprobar si los huérfanos siguen en el servidor. De todos modos, ese script me salva la vida.

2 Me gusta