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

私もこれが非常に欲しいです。

この機能は、ある程度実装されているようです。

使用している設定:
clean orphan uploads grace period hours: 1
purge deleted uploads grace period days: 1

ただし、削除されたアップロードには画像を含む投稿が削除されたケースは含まれません。画像/アップロードは、削除前に投稿から編集して削除する必要があると思われます。

特定の画像が(唯一)含まれていた投稿が削除された場合でも、画像は削除されないことを確認できます。2023年に削除された投稿から、データベースとS3にまだ存在する画像があります(画像は他の投稿では使用されていません)。以前のケースでも削除されたことはありません。

したがって、モデレーターがルール違反のアップロード画像を含む投稿を削除した場合、それを完全に削除するには、まずトピック/投稿から編集して削除する必要があります(他の投稿にも存在しないことを願って)。そうでなければ、私の理解では、S3には無期限に存在し続けます。

非常に役立つ機能:

  • purge deleted uploads grace period days - この設定に、削除された投稿に含まれる画像のケースを含めるか、そのケースのためにもう1つの設定を追加してください。

  • purge deleted uploads grace period days - 日ではなく時間を使用してください。著作権侵害の削除依頼は、通常、24〜48時間以内に迅速な対応が必要です。このケースでは1日は遅すぎます。削除後、CDNキャッシュも手動でパージする必要がある場合があり、タイムラインはさらにタイトになります。

  • ダッシュボードから画像を削除/パージできること。ただし、削除されたアップロードのパージに削除された投稿内の画像が含まれる場合、これはそれほど必要なくなりますが、アバターやプロフィールバナーなどで画像が使用されているケースもあり、モデレーターにとってはより効率的です。Feature suggestion: Image removal/purge via web dashboard

  • 画像URLを検索可能にすること。これにより、モデレーターが特定の画像を含むすべてのトピック/投稿を見つけて、SSHを使用せずにそれらの投稿も削除できるようになります。

  • 特定のハッシュのアップロードを禁止できる機能があれば便利です。

これにより、SSHアクセスや技術スキルを持たない担当者でも、このようなプロセスを処理できるようになります。特に、これらの処理を迅速に行う必要があるためです。技術スタッフを24時間年中無休で待機させて、発生する可能性のあるあらゆるケースに対応できるようにすることは、非常に高価です。いつ発生するか予測できないため、いつでも迅速に対応できるように準備しておく必要があります。これはUGCの避けられない属性です。

「いいね!」 1

なぜこれがもっと広く議論されないのか不思議です。これは本当に大きな問題です。

以下のSQLクエリから生成されたCSVファイルを使用するPHPスクリプトを作成しました。これは、すべてのアップロードとその参照をリストします。
(アップロードが多い場合は、制限を増やしてください)

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

このスクリプトは、下書きとしてのみ残っているアップロードをフィルタリングします(これは、こちらで説明したように、データベースに誤って残っています)。スクリプトは、すべてのファイル名のスペース区切りの文字列を出力します。スクリプトを変更して、完全なパスを出力することもできます(basename()関数を削除します)。

次に、DiscourseのSSHサーバーにログインし、すべてのファイルに対してrmコマンドを実行します。

  • これの1つの欠点は、アクティブな下書きに残っているすべての画像も削除されることです(ただし、これはn日より古い下書きを削除するを低くすることで制限できます)。
  • 2つ目の欠点は、誤ったデータベースエントリがまだ残っていることです。これについては、開発者に修正を依頼する必要があります。

誤ったエントリが削除されれば、問題は適切に修正されるはずです。

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

クエリを含むファイルtest.csvは、スクリプトと同じディレクトリに配置する必要があります。
何か問題があれば、私に聞いてください!

「いいね!」 3

私の推測では、おそらく多くの人がアップロードが自動的に削除されていないことに気づいていないからでしょう。

詳細を読みたい人のために、関連する別のスレッドをリンクします。

「いいね!」 2

この件は長い間経ったので、すでに修正されていることを望んでいました。サーバー上に孤児(残骸データ)がまだ残っているかどうか再確認する必要があるかもしれません。いずれにせよ、そのスクリプトは非常に役立ちます。

「いいね!」 3

こんにちは!これは先週あたりに修正されたと思います…

削除された投稿のアップロードマークダウンを削除するための自動化が追加されました[1]。例えば:

 こんにちは、これは[Discourse](https://www.discourse.org)へのリンクと画像がある通常の投稿です: ![logo.png|100x200](upload://gj6GJHlc1Sa5YXuGz549oXBbcFv.png) そしてファイル: [small.pdf|attachment](upload://3bWzVVoRhUXxi7tiPenInoebHyX.pdf) (130 Bytes)

この投稿で自動化が実行されると、改訂版は次のようになります:

 こんにちは、これは[Discourse](https://www.discourse.org)へのリンクと画像がある通常の投稿です:
 そしてファイル: 

そして、これらのアップロードは orphans (孤児) になるため、cleanup uploads job によって検出されます。


また、セルフホストされている場合は、s3_stale_while_revalidate および s3_max_age 設定を使用してキャッシュ制御ディレクティブを更新できます。


  1. Remove upload markup in deleted posts が自動化名です ↩︎

「いいね!」 1