【问题标题】:Working Capistrano recipe for uploading precompiled Rails 3.1 assets to Amazon S3用于将预编译的 Rails 3.1 资产上传到 Amazon S3 的 Capistrano 方法
【发布时间】:2011-11-14 11:43:02
【问题描述】:

我们有一个 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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 capistrano asset-pipeline


    【解决方案1】:

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

    在 S3 上托管资产并使用 config.action_controller.asset_host 指令的主要好处包括(其中包括):

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

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

    创建新的 CloudFront 分配

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

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

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

    【讨论】:

    • +1 好答案。您能否详细说明或指出“如果您的网站通过 SSL 提供服务,您将需要使用 x12whx1751nfir.cloudfront.net”的任何链接?谢谢!
    • 当您设置 CloudFront 分配时,将创建一个随机主机名,例如 x12whx1751nfir.cloudfront.net。您可以选择附加自定义 CNAME dns 记录,例如 cdn.mydomain.com。如果您在网站上使用 SSL,则所有资产都必须通过 SSL 提供,否则用户将收到混合内容警告。 CloudFront 不支持自定义 SSL 证书,因此您经常使用支持 HTTP 和 HTTPS 的 x12whx1751nfir.cloudfront.net 主机名。如果您不使用 SSL,则可以使用自定义 CNAME 记录,例如 cdn.mydomain.com。我希望这会有所帮助。
    • 所以基本上你是说对于我的 ssl 内容我应该参考他们“ht tps://x12whx1751nfir.cloudfront.net/assets/whatever.jpg”?
    • 当您将 CloudFront 设置为资产主机时,您需要在您的 config/environments/production.rb 文件中配置 config.action_controller.asset_host 指令。如果您在生产中使用 SSL,它应该看起来像:config.action_controller.asset_host = "https://x12whx1751nfir.cloudfront.net"。如果您不使用 SSL,则可以使用相同的主机名,或者您可以使用自定义 CNAME,例如:config.action_controller.asset_host = "http://cdn.mydomain.com",如果您有多个 CNAME 记录,甚至可以使用 config.action_controller.asset_host = "http://cdn%d.mydomain.com"
    【解决方案2】:

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

    load 'deploy/assets'
    

    【讨论】:

    • 据我了解,这只是处理 precompile - 在我上面的示例中,RAILS_ENV=production bundle exec rake assets:precompile 是多余的。也许我错了?如果是这样,我很想知道那条小线是如何自动对资产进行身份验证并将资产上传到 S3 存储桶的?!?
    • 哦,这是一个没有完全阅读问题的情况。不能使用云端自动镜像域上的资产吗?
    【解决方案3】:

    如果您想使用 S3,请查看 asset_sync gem。我正在尝试让我的工作与 Rackspace Cloud Files 合作,但遇到了一些问题。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 2016-03-22
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多