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

У нас есть приложение 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 ]

14 голосов
/ 20 сентября 2011

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

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

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

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

Создание нового дистрибутива CloudFront

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

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

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

9 голосов
/ 20 сентября 2011

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

load 'deploy/assets'
2 голосов
/ 20 января 2012

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

0 голосов
/ 11 февраля 2012

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

...