チームの皆様、こんにちは。
私の ウェブサイト は中国でホストされていますが、ご存知の通り、中国のすべてのウェブサイトは政府からライセンスを取得して登録する必要があり、そのためすべての中国のウェブサイトは監視下にあります。
先日、私の CDN サービスプロバイダーである Qiniu(これも中国企業です)に対し、私のウェブサイトに含まれるいくつかの画像が違法であるとの報告がありました。CDN プロバイダーからは、これらの画像を削除し、「URL キャッシュをリフレッシュ」するよう指示があり、そうでなければ法律に基づいてアカウントを停止されると伝えられました。しかし、これらの画像はユーザーのアバターであり、どのように削除すればよいか分からずにいます。
How to Delete Uploaded Files? - #3 by codinghorror および How to Delete Uploaded Files? - #25 by Falco によると、参照のないアップロードされた画像は 48 時間後に自動削除されるはずです。私はこれらのユーザーアバターをデフォルトの文字のアバターに置き換えたのですが、72 時間経っても古いユーザーアバターに何の変化も起きていません。もしかすると、ユーザーアバターは「アップロードされた画像」とみなされていないからでしょうか。
サーバー上のユーザーアバターファイルを完全に削除する方法について、ご存知の方がいらっしゃいましたらご教示ください。
よろしくお願いいたします。
Yinglu
pfaffman
(Jay Pfaffman)
2
まだこのように動作すると思います。
削除したいファイルの URL からファイル名を取得します。
cd /var/discourse/shared/uploads
find . -name =FILENAME= | xargs exec rm
その後、CDN から削除する処理を行ってください。
お手伝いいただきありがとうございます。試してみましたが、うまくいきませんでした 
ファイルは 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#
他にアイデアはありますか?
pfaffman
(Jay Pfaffman)
4
すみません。アバターは異なる仕組みで動作します。どこを確認すべきか理解するには、コードを確認する必要があります。もし緊急で予算がある場合は、直接ご連絡ください。そうでなければ、調査する自由な時間がない可能性が高いです。他の誰かが知っているかもしれません。
こちらは個人サイトのため、現時点では予算がありません。お返しいただきありがとうございます!
riking
(Kane York)
6
ユーザーが将来アバターをアップロードできないようにするには、「アップロードされたアバターを許可」を無効にし、「選択可能なアバター」サイト設定を多くの選択肢と共に有効にします。
自動削除を機能させるには、置き換え用のプレースホルダーをアップロードする必要があるかもしれません。ユーザーレコードが未使用のアップロードされたアバター画像を維持し続けているためです。
アップロードされたファイル名は、画像コンテンツの SHA1 ハッシュに基づいて命名されます。これにより、裏側のファイルを見つける手助けになるかもしれません。
pfaffman
(Jay Pfaffman)
7
例えば
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 開発者をしており、フロントエンドプログラミングには不慣れです。
pfaffman
(Jay Pfaffman)
11
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)>
pfaffman
(Jay Pfaffman)
13
ユーザー名ではなく、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
ただし、システムやキャッシュをさらに更新する必要があるかもしれません。その場合はどのようにすればよいでしょうか?
ふむ、それは難しい状況ですね。もしかしたら、最近アバターを担当した @falco さんか、他の誰かがアドバイスしてくれるかもしれません。
より簡単に言うと、Discourse は https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png という URL へのアクセスをどのように解析するのでしょうか?ソースコードに詳しい方が、該当するソースファイルやクラス・関数を教えていただければ、非常に助かります。ありがとうございます!
pfaffman
(Jay Pfaffman)
18
Uploads モデルを確認してみてください。
また、CDN ではなくまず自サーバーから取得することから始めてください。問題が正しい場所で解決されていることを確認することが重要です。サーバーが画像を送信していないことが確認できたら、次に CDN と連携して作業を進めましょう。
pfaffman
(Jay Pfaffman)
20
はい、ご自身のサーバーから送信されていることが確認できます。したがって、修正すべきはそこです。画像の送信を停止したら、CDN をクリアしてください。