我们有一个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
答案 0 :(得分:14)
虽然这并没有直接回答在部署时将资产上传到S3的问题,但我认为以下方法可能会解决您的目标并且实施起来更简单。
在S3上托管资产并使用config.action_controller.asset_host
指令的主要好处包括(其中包括):
您可以使用CloudFront CDN来获得相同的好处,而不是使用s3。新的rails资产管道与CloudFront非常匹配。以下是我目前在制作中使用的步骤:
创建新的CloudFront分配
cdn01.mydomain.com
等。如果您的站点是通过SSL提供的,则需要使用x12whx1751nfir.cloudfront.net
样式主机名,因为自定义证书不可用,因为它们与ELB一起使用,您的用户将看到证书主机名不匹配错误。如果您不使用SSL,则可以使用默认主机名或任何产生的CNAME。
设置完成后,将从您的服务器获取初始对象请求并将其置于CloudFront中。资产管道生成的摘要指纹将处理您仅发送已更改资产的要求。
答案 1 :(得分:9)
更新capistrano并在部署文件中包含以下内容
load 'deploy/assets'
答案 2 :(得分:2)
如果您想使用S3,请查看asset_sync gem。我试图让我与Rackspace Cloud Files合作,但遇到一些问题。
答案 3 :(得分:0)
您可以使用jammit-s3 gem。我配置并使用它。它非常完美,配置非常简单。