Esse é o objetivo que não faço ideia de como alcançar. Como um engenheiro reverso de iOS, minha ideia é que, se eu souber no código-fonte como/onde o servidor envia essa imagem, posso rastrear e ver onde o servidor carrega essa imagem localmente. Mas eu leio Ruby como se fosse pseudocódigo, então localizar onde o servidor envia essa imagem se torna uma tarefa enorme para mim
Isso deveria ser muito mais fácil para alguém que esteja familiarizado com o código-fonte, no entanto
Em discourse/app/models/upload.rb at main · discourse/discourse · GitHub
Vi a tabela uploads, que armazena todos os uploads de um usuário. Para o usuário Baal998, cujo ID é 1637, executei SELECT * FROM uploads WHERE user_id = '1637'; e o resultado foi:
id | user_id | original_filename | filesize | width | height | url | created_at | updated_at | sha1 | origin | retain_hours | extension | thumbnail_width | thumbnail_height | etag | secure | access_control_post_id | original_sha1 | animated | verified | verification_status
------+---------+-------------------+----------+-------+--------+-----------------------------------------------------------------------------+----------------------------+----------------------------+------------------------------------------+--------+--------------+-----------+-----------------+------------------+------+--------+------------------------+---------------+----------+----------+---------------------
2210 | 1637 | 2.pic.jpg | 60610 | | | /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg | 2016-08-08 09:37:13.937306 | 2018-01-05 02:38:49.498264 | cb2188eaeecc3a648f021fa00da4734bd60ca183 | | | jpg | | | | f | | | | | 1
(1 row)
O que é o mesmo que executar Upload.find(user_avatar.custom_upload_id).url com Rails.
Minha suposição é que, após o usuário fazer o upload do avatar, o Discourse fará algo com o arquivo original do avatar e armazenará os arquivos otimizados em outro lugar?
Na tabela optimized_images, esta linha parecia suspeita
id | sha1 | extension | width | height | upload_id | url | filesize | etag | version | created_at | updated_at
-------+------------------------------------------+-----------+-------+--------+-----------+----------------------------------------------------------------------------------------+----------+------+---------+----------------------------+----------------------------
49538 | e6dc9b0d6c18f2a4c3c0d2027534d01cfc89c84e | .jpg | 135 | 135 | 2210 | /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg | 10968 | | 2 | 2016-08-08 09:37:13.937306 | 2016-08-08 09:37:13.937306
(1 row)
O sha1 e o filesize correspondem a https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png , mas no servidor esse arquivo não existe.
root@iosre:/var/discourse/shared/standalone# ls /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg
ls: não foi possível acessar /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg: Arquivo ou diretório inexistente
Não faço ideia do que estava errado.
Problema resolvido:
Alguém do meu fórum me disse que essa imagem de avatar pode estar armazenada no cache do nginx em proxy_cache_path, que geralmente é /var/nginx/cache, mas não consegui encontrar nem proxy_cache_path nem /var/nginx/cache.
Fui inspirado por ele a entrar no aplicativo Discourse via launcher enter app e, em seguida, encontrei o cache do nginx:
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# cd /var/nginx/cache
root@iosre-app:/var/nginx/cache# ls
0 1 2 3 4 5 6 7 8 9 a b c d e f
root@iosre-app:/var/nginx/cache#
E excluí todos os caches:
root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache#
A imagem desapareceu.