我们有一个 Rails 3.1 应用程序,允许用户将照片上传到 Amazon S3。由于我们在生产中使用 S3,我想自动(在 cap deploy
上)还将预编译的 Assets (application.js 和 application.css 和图像)上传到我们的 S3 存储桶,在那里它们将被提供。很简单。
超越设置config.action_controller.asset_host = "http://assets.example.com"
简而言之,我正在为 Capistrano 寻找一些可行的“食谱”示例 但似乎找不到任何现代(兼容 3.1 Assets 管道)的。我们已成功预编译 Assets ,但如何将它们移至 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
最佳答案
虽然这并不能直接回答在部署时将 Assets 上传到 S3 的问题,但我认为以下方法可能会解决您的目标并且实现起来更简单一些。
在 S3 上托管 Assets 和使用 config.action_controller.asset_host
的主要好处指令包括(除其他外):
除了使用 s3,您可以使用 CloudFront CDN以获得相同的 yield 。新的 Rails Assets 管道与 CloudFront 配合得非常好。以下是我目前在生产中使用的步骤:
创建新的 CloudFront 分配
cdn01.mydomain.com
等如果您的网站是通过 SSL 提供的,您将需要使用
x12whx1751nfir.cloudfront.net
样式主机名作为自定义证书尚不可用,因为它们与 ELB 一样,您的用户将看到证书主机名不匹配错误。如果您不使用 SSL,则可以使用默认主机名或提供的任何 CNAME。设置完成后,将从您的服务器获取初始对象请求并将其放置在 CloudFront 中。 Assets 管道生成的摘要指纹将处理您仅发送已更改 Assets 的要求。
关于ruby-on-rails - 将预编译的 Rails 3.1 Assets 上传到 Amazon S3 的工作 Capistrano 配方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373838/