Rails Как загрузить предварительно скомпилированные активы в Cloudfront

  • Я использую приложение Rails 3.2
  • Я создал дистрибутив Cloudfront с Начало S3
  • Я уже меняю config.action_controller.asset_host на мой облачный актив
  • Я использую capistrano

Я хочу знать, как загружать мои предварительно скомпилированные ресурсы в Cloudfront каждый раз, когда я развертываю

Ответы

Ответ 1

Нет необходимости в ведро s3, так как Amazon Cloudfront теперь поддерживает "пользовательское происхождение". Раньше считалось, что вам нужно указать ведро s3 в качестве источника, но теперь вы можете указать свой облачный дистрибутив в своем приложении rails.

http://aws.typepad.com/aws/2010/11/amazon-cloudfront-support-for-custom-origins.html

Итак, после создания дистрибутива, который указан в вашем общедоступном приложении, вы устанавливаете свой ресурс в соответствующем файле конфигурации, например. production.rb, и вы отправились на гонки.

config.action_controller.asset_host = "url of your cloudfront distribution"

Вот половина достойной статьи о том, как настроить вещи:

http://ryantownsend.co.uk/post/13126016608/cloudfront-cdn-on-rails

Не путайте с битом о настройке CNAME-recprds для поддомена происхождения. Это актуально только в том случае, если вы хотите использовать свой собственный поддомен вместо амазонок.

Ответ 2

После установки драгоценного камня aws-s3 вы можете добавить это в конце вашего рецепта capistrano:

set :cdn_user, "KEY ID" # This is called "CDN KEY API" for AWS
set :cdn_api_key, "YOUR KEY SECRET"
set :cdn_container, "bucket name"

namespace :assets do
    task :to_cdn do
      require 'aws/s3'
      AWS::S3::Base.establish_connection!(:access_key_id => cdn_user, :secret_access_key => cdn_api_key )
      assets_dir = "#{shared_path}/assets"
      Dir.glob(assets_dir + "/**/*").each do |file|
        if !File.directory?(file)
          cdn_filename = file.gsub(assets_dir,"assets")
          AWS::S3::S3Object.store(cdn_filename, open(file) , cdn_container)
        end
      end
    end
end

С помощью триггера:

after "deploy:assets:precompile", "assets:to_cdn"

Вам также потребуется запустить компиляцию в определенный момент в вашем рецепте с помощью:

load 'deploy/assets'

Результат: в конце вашей компиляции активов все ваши активы будут помещены на S3, и вы сможете получить к ним доступ из облачной инфраструктуры.

Затем вам необходимо обновить конфигурацию /environment/production.rb, чтобы указать URL вашего CDN.

config.action_controller.asset_host = "http://assets.example.com"

Ответ 3

Там большой камень Ruby, который обрабатывает это, называется AssetSync. Если вы объедините его с turbo-sprockets, вы можете убедиться, что при развертывании копируются только новые или обновленные активы.