phi*_*e_b 6 ruby-on-rails heroku
如何在两个生产和暂存 Rails 应用程序中使用production.yml.enc和staging.yml.enc凭证文件,而该应用程序只有常规development、test和production环境?
我正在使用 Heroku 并在这个问题中引用它。但这并不是该供应商特有的。
一个应用程序通常会部署多次。一个实例用作生产,而另一个实例是预演应用程序,预计将投入生产。Rails 促进了这种模式,因为创建新环境很容易。
然而,Heroku 建议不要这样做,有充分的理由。例如,人们可能会忍不住if Rails.env.production?到处放一些东西,为一些“但它在舞台上有效!?”铺平道路。周五晚上。最好拥有一个单一的生产环境,并使用不同的参数集来实际区分各个阶段(例如,不同的 AWS S3 存储桶名称、不同的 API 密钥等)。为了实现这一点,Heroku 的建议是依赖环境变量。
自 Rails 5.2 及更高版本的 Rails 6 起,可以通过config/credentials. 人们通常希望存储从一个环境更改为另一个环境的所有变量,而不是使用混乱的环境变量。由于单个RAILS_MASTER_KEY环境变量包含用于解密凭证文件的密钥,因此可以在 Heroku 中使用此机制。
但这些部件不太合适。我们如何拥有单一production环境,而凭证文件是针对每个环境的?
application.rb这可以通过暂存凭证文件和密钥以及基于环境变量的切换来实现:
创建并填充临时凭证文件和密钥EDITOR=vi rails credentials:edit --environment staging。
在 中application.rb,添加:
# Introduce the environment variable RAILS_CREDENTIALS_ENVIRONMENT to specify a custom
# environment name of which to use the credentials file. Specifically aimed to use in staging,
# where the environment is set to "production", but we need to use the "staging" environment variables.
# This environment variable is also used to select the corresponding key file or -if that does not exist-
# the corresponding environment variable.
if ENV['RAILS_CREDENTIALS_ENVIRONMENT'].present?
new_filename_no_ext = Rails.root.join 'config', 'credentials', ENV['RAILS_CREDENTIALS_ENVIRONMENT']
config.credentials.content_path = "#{new_filename_no_ext}.yml.enc"
if File.exist? "#{new_filename_no_ext}.key"
config.credentials.key_path = "#{new_filename_no_ext}.key"
end
end
Run Code Online (Sandbox Code Playgroud)
根据情况将环境变量设置RAILS_CREDENTIALS_ENVIRONMENT为production或。staging例如,Heroku 通过以下方式执行此操作:
heroku config:set -a theapp-staging RAILS_CREDENTIALS_ENVIRONMENT=staging
Run Code Online (Sandbox Code Playgroud)
如果在登台或生产时您希望将密钥存储在环境变量而不是密钥文件中,则只需将密钥分配给环境RAILS_MASTER_KEY变量即可。如文档所述,这优先于文件中存储的密钥。请注意,在您的开发计算机上,您不希望拥有一RAILS_MASTER_KEY组凭证,否则所有环境的凭证文件仍然获得相同的密钥,因此每个需要访问(例如)仅开发凭证的人都可以访问。
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |