ユーザーアバターのファイルを削除するにはどうすればよいですか?

チームの皆様、こんにちは。

私の ウェブサイト は中国でホストされていますが、ご存知の通り、中国のすべてのウェブサイトは政府からライセンスを取得して登録する必要があり、そのためすべての中国のウェブサイトは監視下にあります。

先日、私の CDN サービスプロバイダーである Qiniu(これも中国企業です)に対し、私のウェブサイトに含まれるいくつかの画像が違法であるとの報告がありました。CDN プロバイダーからは、これらの画像を削除し、「URL キャッシュをリフレッシュ」するよう指示があり、そうでなければ法律に基づいてアカウントを停止されると伝えられました。しかし、これらの画像はユーザーのアバターであり、どのように削除すればよいか分からずにいます。

How to Delete Uploaded Files? - #3 by codinghorror および How to Delete Uploaded Files? - #25 by Falco によると、参照のないアップロードされた画像は 48 時間後に自動削除されるはずです。私はこれらのユーザーアバターをデフォルトの文字のアバターに置き換えたのですが、72 時間経っても古いユーザーアバターに何の変化も起きていません。もしかすると、ユーザーアバターは「アップロードされた画像」とみなされていないからでしょうか。

サーバー上のユーザーアバターファイルを完全に削除する方法について、ご存知の方がいらっしゃいましたらご教示ください。

よろしくお願いいたします。
Yinglu

まだこのように動作すると思います。

削除したいファイルの URL からファイル名を取得します。

cd /var/discourse/shared/uploads
find . -name =FILENAME= | xargs exec rm

その後、CDN から削除する処理を行ってください。

お手伝いいただきありがとうございます。試してみましたが、うまくいきませんでした :frowning:

ファイルは https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png なので、ファイル名は 5414_2.png で正しいでしょうか?

また、/uploads/shared ではなく /shared/standalone の下にあり、/uploads にはそのようなファイルが存在しません。シェルで確認できます:

root@iosre:/var/discourse/shared# ls
standalone
root@iosre:/var/discourse/shared# cd standalone/
root@iosre:/var/discourse/shared/standalone# ls
backups  postgres_backup  postgres_run  state  uploads
log      postgres_data    redis_data    tmp
root@iosre:/var/discourse/shared/standalone# find . -name 5414_2.png
root@iosre:/var/discourse/shared/standalone# cd uploads/
root@iosre:/var/discourse/shared/standalone/uploads# find . -name 5414_2.png
root@iosre:/var/discourse/shared/standalone/uploads#

他にアイデアはありますか?

すみません。アバターは異なる仕組みで動作します。どこを確認すべきか理解するには、コードを確認する必要があります。もし緊急で予算がある場合は、直接ご連絡ください。そうでなければ、調査する自由な時間がない可能性が高いです。他の誰かが知っているかもしれません。

こちらは個人サイトのため、現時点では予算がありません。お返しいただきありがとうございます!

ユーザーが将来アバターをアップロードできないようにするには、「アップロードされたアバターを許可」を無効にし、「選択可能なアバター」サイト設定を多くの選択肢と共に有効にします。

自動削除を機能させるには、置き換え用のプレースホルダーをアップロードする必要があるかもしれません。ユーザーレコードが未使用のアップロードされたアバター画像を維持し続けているためです。


アップロードされたファイル名は、画像コンテンツの SHA1 ハッシュに基づいて命名されます。これにより、裏側のファイルを見つける手助けになるかもしれません。

例えば

a=UserAvatar.where(user_id: 1234)
u=Upload.find(a.custom_upload_id)
upload_url=u.url

その後

cd /var/discourse/shared/standalone
rm UPLOAD_URL_FROM_ABOVE

登録ユーザーは7,000人以上いますが、違法なアバターを知らずに使用しているのは5人未満です。そのため、0か1かの問題にしたくありません。すべてのユーザーのカスタムアバター使用を禁止するのではなく、ケースバイケースで解決したいと考えています。

これをどのように行えばよいのでしょうか?全く見当もつきません。

例えば、この画像:https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png

snakeninny@bogon ~ % shasum /Users/snakeninny/Desktop/5414_2.png.jpeg 
c8d561c5484a1f197abd32995411caaa25e53bd6  /Users/snakeninny/Desktop/5414_2.png.jpeg
root@iosre:~# cd /var/discourse/shared/standalone
root@iosre:/var/discourse/shared/standalone# find ./ -name *c8d561c5484a1f197abd32995411caaa25e53bd6*
root@iosre:/var/discourse/shared/standalone# 

見つかりませんでした。これがご意図でしょうか?何か手掛かりはありますか?

これはコードの一部ですか?どこで、どのように実行すればよいのでしょうか?以前は iOS 開発者をしており、フロントエンドプログラミングには不慣れです。

Rails コンソール用です。以下の手順でアクセスできます。

cd /var/discourse 
./launcher enter app 
rails c

exit で終了できます。また、コンテナ内では上記の完全なパスではなく /shared に cd してください。

lincwee ユーザーの https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png についてです。
UserAvatar.where(user_id: 'lincwee') が空の配列を返します。何か心当たりはありますか?

root@iosre:~# cd /var/discourse/shared/
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app 
WARNING: Docker version 17.05.0-ce deprecated, recommend upgrade to 17.06.2 or newer.
root@iosre-app:/var/www/discourse# rails c
[1] pry(main)> a=UserAvatar.where(user_id: 1234)
=> []
[2] pry(main)> a=UserAvatar.where(user_id: lincwee)
NameError: undefined local variable or method `lincwee' for main:Object
from (pry):2:in `__pry__'
[3] pry(main)> a=UserAvatar.where(user_id: 'lincwee')
=> []
[4] pry(main)> 

ユーザー名ではなく、ID が必要です。

u = User.find_by(username: "lincwee")

これで ID を確認するか、u.id でアクセスできます。

ある程度は機能しました。ターミナルで以下を実行し、

cd /var/discourse/shared/
/var/discourse/launcher enter app
rails c

その後、以下のコードを実行してすべてのアバターURLを取得し、サーバーから削除しました。

uid = User.find_by(username: "user_name").id
user_avatars = UserAvatar.where(user_id: uid)
user_avatar = user_avatars[0]
upload_url = Upload.find(user_avatar.custom_upload_id).url

ただし、システムやキャッシュをさらに更新する必要があるかもしれません。その場合はどのようにすればよいでしょうか?

CDNプロバイダーから再度メールが届き、CDNアカウントが凍結されました。そのため、さらなるサポートを得るためにこのスレッドを更新します。

新しいメールには、以下のリンクが違法であると記載されていました。

https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/64/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/75/5414_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/96/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/90/5414_2.png

ご覧の通り、これら2つのユーザーアバターは、元中国の指導者を模したミームです。再度、CDNプロバイダーからサーバー上のこれらのファイルを削除し、CDNをリフレッシュするよう求められました。

リンクから、ユーザーが「baal998」と「lincwee」であることがわかります。私の前の投稿に記載されたコードスニペットによると、「lincwee」のアップロードされたアバターのURLは /uploads/default/original/2X/5/55512211b1c8969c8038b79840464952cd3eb089.jpeg でしたが、「baal998」の場合は /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg でした。その後、find /var/discourse/shared/ -name *55512211b1c8969c8038b79840464952cd3eb089* を実行して見つかったファイルをすべて削除しましたが、「lincwee」についてはこれで解決しました。しかし、「baal998」についてはうまくいきませんでした。*cb2188eaeecc3a648f021fa00da4734bd60ca183* という名前のファイルがもう存在しないにもかかわらず、https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png にはまだアクセスできてしまいます。

では、いったい https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png は私のサーバーのどこに保存されているのでしょうか? :sob:

ふむ、それは難しい状況ですね。もしかしたら、最近アバターを担当した @falco さんか、他の誰かがアドバイスしてくれるかもしれません。

より簡単に言うと、Discourse は https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png という URL へのアクセスをどのように解析するのでしょうか?ソースコードに詳しい方が、該当するソースファイルやクラス・関数を教えていただければ、非常に助かります。ありがとうございます!

Uploads モデルを確認してみてください。

また、CDN ではなくまず自サーバーから取得することから始めてください。問題が正しい場所で解決されていることを確認することが重要です。サーバーが画像を送信していないことが確認できたら、次に CDN と連携して作業を進めましょう。

https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png が CDN 由来である以上、
https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png は私のサーバー由来であるはずです。

はい、ご自身のサーバーから送信されていることが確認できます。したがって、修正すべきはそこです。画像の送信を停止したら、CDN をクリアしてください。