Когда мы хотим скопировать данные из production окружения Ruby on Rails приложения в development или staging, обычно, нам нужно скопировать дамп базы данных и статические файлы (например, изображения загруженные пользователями). Копирование базы может не представляет проблем (например, ее можно копировать из бэкапов или резервных серверов БД). А вот копирование статических файлов занимает много времени и ресурсов сервера с которого копируют (и на который копируются) файлы.
В рассылке ror2ru Макс Лапшин предложил копировать статические файлы с production в текущее окружение по запросу, обработку производить в middleware.
Ниже, моя реализация такой middleware.
Поместите следующий код в файл соответствующего окружения
(например config/environments/development.rb
).
public_path = Rails.root.join('public')
# регулярные выражения запросов, которые будут обрабатываться
matching_paths = [/^\/uploads/, /^\/system/] # localhost:300/uploads/pic.jpg
# сервер с которого будем пытаться подгрузить файлы, если они отсутствуют
# на текущем сервере
remote_host = 'http://production-example.com'
config.middleware.insert_after ActionDispatch::Static,
StaticMissing::Middleware, public_path, matching_paths, remote_host
Наше middleware подключается после ActionDispatch::Static - это middleware, которое отдает статические файлы в Ruby on Rails. Если ActionDispatch::Static не найдет файла соответствующего запросу в текущем окружении, то оно передает обработку запроса ниже по цепи middleware. Вот тут-то мы и должны вклиниться!
В нашей StaticMissing::Middleware мы проверим, есть ли файл соответствующий запросу на production-сервере. Если есть - то загрузим, сохраним в текущем окружении и передадим обработку запроса Rack::File middleware.