Подтвердить что ты не робот

Рабочий рецепт Capistrano для загрузки предварительно скомпилированных активов Rails 3.1 в Amazon S3

У нас есть приложение Rails 3.1, которое позволяет пользователям загружать фотографии на Amazon S3. Поскольку мы используем S3 в производстве, я хотел бы автоматически (на cap deploy) также загружать предварительно скомпилированные активы (application.js и application.css и изображения) в наш ведро S3, где они будут обслуживаться. Достаточно просто.

Вне настройки config.action_controller.asset_host = "http://assets.example.com"

Короче говоря, Я ищу некоторые примеры рабочего "рецепта" для Capistrano, чтобы сделать это, но, похоже, не может найти современных (совместимых с конвейером компонентов). Мы успешно прекомпилируем активы, но как переместить их на S3? И, в идеале, только те, которые изменились?

"Мясо" текущего "рецепта":

...

after "deploy:update_code", "deploy:pipeline_precompile"
before "deploy:finalize_update", "deploy:copy_database_config"

namespace :deploy do
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
  end

  # copy database.yml into project
  task :copy_database_config do
    production_db_config = "/path_to_config/#{application}.yml"
    run "cp #{production_db_config} #{current_release}/config/database.yml"
    `puts "replaced database.yml with live copy"`
  end
  task :pipeline_precompile do
    run "cd #{release_path}; RAILS_ENV=production bundle exec rake assets:precompile"
  end
end
4b9b3361

Ответ 1

Хотя это напрямую не отвечает на вопрос о загрузке ваших активов на S3 при развертывании, я думаю, что следующий подход может решить ваши задачи и будет немного проще реализовать.

Основные преимущества хостинга активов на S3 и использование директивы config.action_controller.asset_host включают (среди прочего):

  • возможность дополнительной одновременной загрузки активов
  • обслуживание активов из домена без файлов cookie

Вместо того, чтобы использовать s3, вы можете использовать CloudFront CDN для достижения тех же преимуществ. Новый маршрут ресурсов рельсов очень хорошо работает с CloudFront. Вот шаги, которые я сейчас использую в производстве:

Создать новый пакет CloudFront

  • Метод доставки должен быть загружен
  • Выберите Custom Origin и укажите его на свой веб-сервер.
  • В разделе "Сведения о рассылке" вы можете добавить дополнительные записи CNAME, такие как cdn01.mydomain.com и т.д.
  • По умолчанию корневой объект можно оставить пустым

Если ваш сайт обслуживается через SSL, вам нужно будет использовать имя хоста стиля x12whx1751nfir.cloudfront.net, поскольку пользовательские сертификаты пока недоступны, так как они с ELB, и ваши пользователи будут видеть ошибки несоответствия имени хоста сертификата. Если вы не используете SSL, вы можете использовать либо имя хоста по умолчанию, либо любые созданные CNAME.

Как только это будет установлено, первоначальные запросы объекта будут получены с вашего сервера и помещены в CloudFront. Отпечатки пальцев дайджеста, сгенерированные конвейером активов, будут обрабатывать ваши требования только для отправки активов, которые были изменены.

Ответ 2

Обновите capistrano и включите в файл развертывания следующее:

load 'deploy/assets'

Ответ 3

Обратите внимание на asset_sync gem, если вы хотите использовать S3. Я пытаюсь заставить мои работать с Rackspace Cloud Files, но с несколькими проблемами.

Ответ 4

Вы можете использовать jammit-s3 gem. Я настроил и использовал его. Он идеален и имеет очень простую конфигурацию.