Это задача, как достичь которой я не имею ни малейшего представления. Как реверс-инженер iOS, я думаю: если я знаю в исходном коде, как и где сервер отправляет это изображение, я могу отследить процесс назад и увидеть, где сервер загружает это изображение локально. Но я читаю Ruby как псевдокод, поэтому найти место, где сервер отправляет это изображение, становится для меня огромной, огромной задачей
Для человека, который хорошо знаком с исходным кодом, это должно быть гораздо проще.
В discourse/app/models/upload.rb at main · discourse/discourse · GitHub
Я увидел таблицу uploads, в которой хранятся все загрузки пользователя. Для пользователя Baal998 с ID 1637 я выполнил запрос SELECT * FROM uploads WHERE user_id = '1637';, и результат следующий:
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)
Это то же самое, что и выполнение Upload.find(user_avatar.custom_upload_id).url в Rails.
Мое предположение: после загрузки аватара пользователем Discourse выполняет какие-то операции с оригинальным файлом аватара и сохраняет оптимизированные файлы в другом месте?
В таблице optimized_images эта строка показалась подозрительной
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)
sha1 и filesize совпадают с https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png , но на сервере этот файл отсутствует.
root@iosre:/var/discourse/shared/standalone# ls /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg
ls: cannot access /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg: No such file or directory
Непонятно, в чём проблема.
Проблема решена:
Один из участников моего форума сообщил, что это изображение аватара могло быть сохранено в кэше nginx по пути proxy_cache_path, который обычно находится в /var/nginx/cache, но я не смог найти ни proxy_cache_path, ни /var/nginx/cache.
Его идея вдохновила меня: я зашёл в приложение Discourse через команду launcher enter app и нашёл кэш 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#
Затем я удалил весь кэш:
root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache#
Изображение исчезло.