Ruby on rails 分段应用程序与生产应用程序的不同S3存储桶

Ruby on rails 分段应用程序与生产应用程序的不同S3存储桶,ruby-on-rails,ruby-on-rails-3,amazon-s3,Ruby On Rails,Ruby On Rails 3,Amazon S3,我有一个Rails应用程序,它使用AmazonS3存储回形针附件。Mydatabase.yml文件为开发、测试和生产指定了不同的S3存储桶 我在Heroku上有两个应用程序——一个生产应用程序和一个“登台应用程序”,用于在平台发布前测试代码 当前的系统有一个重要的缺陷——它使用相同的S3存储桶进行暂存和生产。我如何设置我的系统,使其使用不同的存储桶,这主要取决于我是编写git push production master还是git push staging master?set config:a

我有一个Rails应用程序,它使用AmazonS3存储回形针附件。My
database.yml
文件为开发、测试和生产指定了不同的S3存储桶

我在Heroku上有两个应用程序——一个生产应用程序和一个“登台应用程序”,用于在平台发布前测试代码


当前的系统有一个重要的缺陷——它使用相同的S3存储桶进行暂存和生产。我如何设置我的系统,使其使用不同的存储桶,这主要取决于我是编写
git push production master
还是
git push staging master

set config:add RACK_ENV=staging on your staging box,然后在代码中根据环境指定存储桶。例如:

if Rails.env.production?
    has_attached_file :photo, 
    :styles => ...,
    :path => ...,
    :storage => :s3,
    :bucket => 'your_prod_bucket',
    :s3_credentials => {
      :access_key_id => ENV['S3_KEY'],
      :secret_access_key => ENV['S3_SECRET']
    }
  else
    has_attached_file :photo, 
    :styles => ...,
    :path => ...,
    :storage => :s3,
    :bucket => 'your_staging_bucket',
    :s3_credentials => {
      :access_key_id => ENV['S3_KEY'],
      :secret_access_key => ENV['S3_SECRET']
    }

  end
这篇heroku文章似乎还建议,您可以通过使用不同的s3凭证进行登台和生产来实现这一点。我猜你也必须在亚马逊方面做一些配置。无论如何,看看它是否有帮助。

Heroku允许您通过应用程序中的每个dyno/进程开始使用的持久性环境变量来配置任何您喜欢的内容。同一应用程序的暂存版本和生产版本之间不共享环境变量。好好利用这一点

has_attached_file :photo, 
  :styles => ...,
  :path => ...,
  :storage => :s3,
  :bucket => ENV['S3_BUCKET'], # <--- over here
  :s3_credentials => {
    :access_key_id => ENV['S3_KEY'],
    :secret_access_key => ENV['S3_SECRET']
  }

请注意,应用程序的每个实例都有一个
RACK\u ENV=production
。不要使用Rails环境来区分应用程序的实例。相反,您的应用程序应该期望使用环境变量来配置特定于实例的方面。

如何编写曲别针配置?Apnea,您在谈论什么文件?在您的模型中,如何将s3配置传递给曲别针?@APNIADIVING-在每个有附件的模型中,我有一行
has_attached_file:whatever,:storage=>:s3,:s3_credentials=>“#{::Rails.root.to_s}/config/s3.yml”,:path=>“/whatever/:style/:id/:normalized_file_name”
。我会将凭证存储在config/environments/中,并避免可能分散在代码中的条件逻辑。是的,我在“staging”实例中设置了
RACK\u ENV=production
。这是因为,在Heroku上,您可以对所有配置使用环境变量。在这方面,您不需要Rails环境的帮助。在您的
production.rb
中,您当然可以根据环境变量的存在、不存在或值设置属性,这是您在Heroku“staging”环境中应该做的。感谢您提供了这个非常有用的答案!我的问题是,当我尝试使用RACK_ENV=development和RAILS_ENV=development来更改环境时,我不断收到错误,上面写着“Error R10(Boot timeout)->Web进程在启动后60秒内绑定到$PORT失败”,这是为什么?
# Configure the "staging" instance
$ heroku config:add \
    RACK_ENV=production \
    S3_KEY=my-staging-key \
    S3_SECRET=my-staging-secret \
    S3_BUCKET=my-staging-bucket \
    --app my-staging-app-name

# Configure the "production" instance
$ heroku config:add \
    RACK_ENV=production \
    S3_KEY=my-production-key \
    S3_SECRET=my-production-secret \
    S3_BUCKET=my-production-bucket \
    --app my-production-app-name