사용자 아바타 파일을 삭제하는 방법은 무엇인가요?

팀 여러분,

제 웹사이트는 중국에 호스팅되어 있으며, 아시다시피 모든 중국 웹사이트는 정부로부터 라이선스를 등록해야 하므로 모든 중국 웹사이트가 감독을 받고 있습니다.

최근 누군가 제 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#

다른 아이디어가 있을까요?

아, 죄송합니다. 아바타는 동작 방식이 다릅니다. 어디서부터 살펴봐야 할지 이해하려면 코드를 직접 봐야 합니다. 만약 긴급한 상황이고 예산이 있다면 제게 직접 연락해 주세요. 그렇지 않으면 조사를 할 시간이 없을 것 같습니다. 다른 분이 아실지도 모르겠네요.

죄송합니다. 이 사이트는 개인 웹사이트라서 당장 예산이 없습니다. 그래도 답변해 주셔서 감사합니다!

사용자가 향후 아바타를 업로드하는 것을 방지하려면 allow uploaded avatars를 비활성화하고, 대량의 선택지를 가진 selectable avatars 사이트 설정을 활성화할 수 있습니다.

자동 삭제가 작동하려면 _대체용 플레이스홀더를 업로드_해야 할 수도 있습니다. 사용자가 아바타를 사용하지 않고 있더라도, 사용자 기록이 업로드된 아바타 이미지를 계속 유지하고 있기 때문입니다.


업로드된 파일은 이미지 콘텐츠의 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로 이동합니다.

사용자 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

터미널에서 이 코드를 실행했습니다.

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

모든 아바타 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

보시는 바와 같이, 이들은 전직 중국 국가원수에 대한 밈(meme)인 두 사용자의 아바타입니다. 다시 한번, 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에 대한 요청을 어떻게 파싱하나요? 소스 코드에 익숙하신 분 중 소스 파일이나 클래스/함수를 알려주시면 정말 도움이 될 것입니다. 감사합니다!

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을 비우실 수 있습니다.