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

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

За пределами настройки config.action_controller.asset_host = "http://assets.example.com"

Короче говоря, я ищу несколько примеров рабочего "рецепта" для Capistrano, но, похоже, не могу найти ни одного современного (совместимого с конвейером активов 3.1). Мы успешно прекомпилируем активы, но как перенести их на 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

4 ответа

Решение

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

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

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

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

Создать новый дистрибутив CloudFront

  1. Способ доставки должен быть Скачать
  2. Выберите Custom Origin и укажите его на своем веб-сервере
  3. Для подробностей распространения вы можете добавить дополнительные записи CNAME, такие как cdn01.mydomain.com и т.п.
  4. Корневой объект по умолчанию можно оставить пустым

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

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

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

load 'deploy/assets'

Проверьте драгоценный камень asset_sync, если вы хотите использовать S3. Я пытаюсь заставить мою работать с Rackspace Cloud Files, но у меня есть несколько проблем.

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

Другие вопросы по тегам