Итак, у меня есть 9000+ оригинальных изображений, каждое с 5-7 сгенерированными размерами, уже сохраненных на S3. Перенос производства в Heroku, и одна из проблем, с которыми мы сталкиваемся, это тайм-аут на больших мастер-изображениях.
Начал пытаться Gem Carrierwave Direct перейти прямо в хранилище S3 и затем обработать асинхронно, но столкнулся с проблемой исчезновения существующих изображений, как только я добавил третью строку включения в базовый загрузчик:
class BaseUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
include CarrierWave::ImageOptimizer
include CarrierWaveDirect::Uploader
...
end
CarrierwaveDirect изменяет формат имени файла (вот метод: https://github.com/dwilkie/carrierwave_direct/blob/29caaa8d399968258299b57c84eac2e5e6fc4cf7/lib/carrierwave_direct/uploader.rb#L153)
Имена файлов изменяются следующим образом:
Orig carrierwave gen:
https://images.patchvault.org/uploads/issue/imageback/629/full_003b_a1_back.png
CW Прямой URL:
https://images.patchvault.org/uploads/issue/imageback/629/003b_a1_back_full.png
Таким образом, имя версии перемещается от начала к концу загруженного имени файла. Это действительно имеет смысл, но я имею дело с 2 годами и 9k изображениями:)
Когда я включаю include CarrierWaveDirect::Uploader
в BaseUploader
, это меняет способ, которым URL генерируются в представлении, и, следовательно, все изображения 404 (так как они больше не существуют)
- Какая лучшая практика здесь? Я сохраняю в Fog, но так как он загружается в Heroku
/tmp
, я должен просто переместить обработку в асинхронный режим?
- Могу ли я изменить поведение, переопределив этот метод, или это запрет?
- Есть ли способ легко переписать имена файлов изображений на S3 в новый формат или это не нужно?
Открыт для других решений, о которых я тоже не думаю:)
Путь генерируется в base_uploader.rb
:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
Rails 5.2.1, Ruby 2.5.2, Heroku-18 Standard 2x dyno (web) 1x dyno (рабочий). images.patchvault.org
- это CNAME для облачного дистрибутива CDN на корзине S3.