2011-08-25 17 views
7

我有一個使用Amazon S3存儲回形針附件的Rails應用程序。我的database.yml文件爲開發,測試和生產指定了不同的S3存儲桶。不同的S3存儲區用於暫存應用程序與生產應用程序

我在Heroku上有兩個應用程序 - 一個生產應用程序和一個「暫存應用程序」,用於在平臺預啓動時測試代碼。

目前的系統有一個重要的缺陷 - 它使用相同的S3存儲桶進行分期和生產。我如何設置我的系統,以便使用不同的存儲桶,主要取決於我是寫git push production master還是git push staging master

+0

你如何寫回形針conf? – apneadiving

+0

呼吸暫停,你在說什麼文件? – sscirrus

+0

在你的模型中,你如何將你的s3配置傳遞給回形針? – apneadiving

回答

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環境來區分應用程序的實例。相反,您的應用程序應該期望使用環境變量來配置特定於實例的方面。

+0

是的,我在「暫存」實例中設置了'RACK_ENV = production'。這是因爲,在Heroku上,您可以使用環境變量來進行所有配置。這不需要Rails環境的幫助。在您的'production.rb'中,您當然可以根據環境變量的存在,缺失或值來設置屬性,這是您在Heroku「暫存」環境中應該執行的操作。 – yfeldblum

+0

感謝這個超級有用的答案!我的問題是,當我嘗試通過使用RACK_ENV = development和RAILS_ENV = development來更改環境時,我一直在收到錯誤消息,說錯誤R10(引導超時) - > Web進程無法在啓動後的60秒內綁定到$ PORT'這是爲什麼? –

1

設置配置:在暫存箱中添加RACK_ENV = staging,然後在您的代碼中,您可以根據環境指定存儲桶。例如:

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

+3

我會將憑據存儲在config/environments /中,並避免可能分散在整個代碼中的條件邏輯。 – d11wtq

相關問題