これが、どう達成すればよいのか見当もつかない私の目標です。iOS リバースエンジニアとして、私の考え方は、ソースコードでサーバーがどのように、どこからこの画像を送信しているかがわかれば、それを遡ってサーバーがローカルでこの画像をどこから読み込んでいるかを追跡できるというものです。しかし、私は Ruby を疑似コードを読むように読んでいるため、サーバーが画像を送信している場所を特定するのは私にとって非常に大きな課題になってしまいます
しかし、ソースコードに詳しい人にとっては、それははるかに簡単になるはずです。
ユーザーのすべてのアップロードを格納する uploads テーブルを確認しました。ユーザー ID が 1637 の Baal998 というユーザーについて、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)
これは、Rails で Upload.find(user_avatar.custom_upload_id).url を実行した場合と同じ結果です。
私の推測では、ユーザーがアバターをアップロードした後、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
何が問題だったのか見当がつきません。
問題解決:
私の フォーラム の誰かが、このアバター画像が proxy_cache_path 下の nginx キャッシュに保存されている可能性があると教えてくれました。通常は /var/nginx/cache ですが、proxy_cache_path も /var/nginx/cache も見つかりませんでした。
彼のアドバイスに触発され、launcher enter app で Discourse アプリにログインし、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#
画像は消えました。