我有一个使用Amazon S3存储Paperclip附件的Rails应用程序。我的database.yml
文件为开发,测试和生产指定了不同的S3存储桶。
我在Heroku上有两个应用程序 - 一个生产应用程序和一个'临时应用程序',用于在平台预启动时测试代码。
当前系统存在一个重要缺陷 - 它使用相同的S3存储桶进行分段和生产。如何设置我的系统以便它使用不同的存储桶,具体取决于我是写git push production master
还是git push staging master
?
答案 0 :(得分:12)
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']
}
然后:
# 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
请注意,您的应用程序的每个实例都有一个RACK_ENV=production
。不要使用Rails环境来区分应用程序的实例。相反,您的应用程序应该期望使用环境变量来配置特定于实例的方面。
答案 1 :(得分:1)
设置配置:在您的暂存框中添加RACK_ENV =暂存,然后在您的代码中,您可以根据环境指定存储桶。例如:
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凭据进行分段和制作来实现这一目的。我猜你也必须在亚马逊方面做一些配置。无论如何,看看它是否有帮助。 http://devcenter.heroku.com/articles/config-vars