14
  • Używam Rails 3.2 aplikację
  • stworzyłem dystrybucję CloudFront z pochodzenia S3
  • już zmienić config.action_controller.asset_host do mojego zasobu CloudFront
  • używam capistrano

Chcę wiedzieć, jak przesyłać swoje skompilowane aktywa CloudFront każdym razem wdrożyćRails Jak przesłać aktywa skompilowane do CloudFront

Odpowiedz

18

Wiadro s3 nie jest potrzebne, ponieważ Amazon Cloudfront obsługuje teraz "niestandardowe pochodzenie". Kiedyś trzeba było podać wiadro s3 jako źródło, ale teraz możesz wskazać swoją dystrybucję w chmurze w twojej aplikacji railsowej.

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

Tak, po utworzeniu dystrybucji, który jest skierowany na swojej publicznie dostępnej aplikacji można ustawić hosta aktywów w odpowiednim pliku konfiguracyjnym np production.rb i wyruszasz na wyścigi.

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

Oto pół przyzwoity artykuł na temat jak skonfigurować rzeczy:

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

Nie należy mylić z bitem o konfigurowaniu recprds CNAME dla subdomeny pochodzenia. Jest to istotne tylko wtedy, gdy chcesz używać własnej subdomeny zamiast amazońskich.

+1

masz na myśli katalog publiczny? – eveevans

+8

Sposób działania początków niestandardowych to Cloudfront działający jako proxy dla Twojej statycznej zawartości. Skonfiguruj Railsy tak, aby wyświetlały statyczną treść z adresu URL w chmurze, ale niczego nie kopiujesz. Następnie, gdy użytkownik zażąda statycznej zawartości z chmury, w chmurze mówi "Nie mam tego pliku, dostanę go z aplikacji", pobiera plik z Twojej witryny, a następnie udostępnia go. Od tego momentu wszystkie żądania dotyczące tego statycznego elementu pochodzą z chmury bez przeszkadzania Twojej aplikacji. –

+0

to jest niesamowite! Dziękuję za wyjaśnienie. – chourobin

14

Po zainstalowaniu gem aws-s3, można dodać to na tym koniec swojej recepturze 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 

Korzystanie wyzwalacz tak:

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

Potrzebny będzie również, aby uruchomić Kompilacja w pewnym momencie w swojej recepturze z:

load 'deploy/assets' 

Wynik: na koniec kompilacji aktywów, wszystkie aktywa zamiar zostać przesunięta na S3, a będziesz mógł uzyskać do nich dostęp z chmury.

Następnie należy zaktualizować plik config/environment/production.rb, aby wskazać adres URL CDN.

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

Dziękuję keyz, to świetne rozwiązanie, ale mam pewne wątpliwości, co stanie się z zasobami, kiedy ponownie wdrożę, mam na myśli, Czy będę miał problemy z zasobami pamięci podręcznej lub nagłówkami wygasania ważności? – eveevans

+0

Zasoby są odcisków palców w produkcji (do nazwy dodano hasz md5), dzięki czemu wszystkie wersje zasobów można przechowywać w tym samym folderze. Magia rurociągu aktywów. Zapobiega to problemowi z buforowaniem podczas aktualizacji: stare wersje są nadal aktualne, nowe są nadal dostępne. –

+0

Powinieneś przeczytać pełny dokument dotyczący potoku aktywów: http://guides.rubyonrails.org/asset_pipeline.html –

3

Istnieje wielki klejnot Ruby, który obsługuje to, o nazwie AssetSync. Jeśli połączysz go z turbo-sprockets, możesz upewnić się, że tylko nowe lub zaktualizowane zasoby są kopiowane podczas wdrażania.

+0

Dzięki, spróbuję – eveevans

Powiązane problemy