17

我们有一个 Rails 3.1 应用程序,允许用户将照片上传到 Amazon S3。由于我们在生产中使用 S3,我想自动(打开cap deploy)也将预编译的资产(application.js 和 application.css 和图像)上传到我们的 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

4 回答 4

14

虽然这并不能直接回答在部署时将资产上传到 S3 的问题,但我认为以下方法可能会解决您的目标并且实现起来更简单一些。

在 S3 上托管资产和使用该config.action_controller.asset_host指令的主要好处包括(除其他外):

  • 允许额外同时下载资产
  • 提供来自无 cookie 域的资产

您可以使用CloudFront CDN来获得相同的好处,而不是使用 s3 。新的 Rails 资产管道与 CloudFront 配合得非常好。以下是我目前在生产中使用的步骤:

创建新的 CloudFront 分配

  1. 交付方式应为下载
  2. 选择自定义来源并将其指向您的网络服务器
  3. 对于分发详细信息,您可以添加其他 CNAME 记录,例如cdn01.mydomain.com等。
  4. 默认根对象可以留空

如果您的站点是通过 SSL 提供的,您将需要使用x12whx1751nfir.cloudfront.net样式主机名,因为自定义证书尚不可用,因为它们与 ELB 一样,并且您的用户将看到证书主机名不匹配错误。如果您不使用 SSL,则可以使用默认主机名或提供的任何 CNAME。

设置完成后,将从您的服务器获取初始对象请求并将其放置在 CloudFront 中。资产管道生成的摘要指纹将处理您仅发送已更改资产的要求。

于 2011-09-20T05:12:21.617 回答
9

更新 capistrano 并在部署文件中包含以下内容

load 'deploy/assets'
于 2011-09-19T22:53:59.920 回答
2

如果您想使用 S3,请查看asset_sync gem。我试图让我的工作与Rackspace Cloud Files,但有一些问题。

于 2012-01-20T00:01:18.503 回答
0

您可以使用jammit-s3 gem。我配置并使用它。它非常完美,配置非常简单。

于 2012-02-11T19:33:31.720 回答