Rails 使用 Heroku 暂存环境加密凭据(使用生产设置)
Rails encrypted credentials with Heroku staging environment (using production setting)
Heroku recommends not using a custom environment called staging
; instead, they suggest using the production
environment but with a different set of ENV
variables. This makes sense ().
但是,我想知道如何将这种做法与 Rails 6 encrypted credentials 功能结合起来。加密凭据 确实 支持多种环境,因此我们可以将 development
和 production
凭据分开;但是,使用 Heroku 的建议意味着 production
凭据将在实际生产服务器和实际登台服务器之间共享。我不想要。
我想要的是 staging
服务器在 production
环境中使用 development
凭据!
保持所有不同的凭证上传和更新(在生产、暂存和我们所有的开发人员之间)是一件麻烦事,加密文件似乎是一个非常需要的改进;我只是无法弄清楚如何进行暂存以使用非生产凭证。
PS:也许可以根据 Heroku 中设置的环境变量覆盖 config.credentials.content_path
per the docs,该变量指示是使用生产还是开发凭据。好奇别人正在做什么或可能会做什么。
覆盖确实是解决方案。这是我的设置。
由于根据 Heroku 的建议将 RAILS_ENV
设置为 production
,我使用了另一个环境变量 PIPE_ENV
并将其设置为管道中的位置,因此 staging
、edge
(用于开发)等
现在 application.rb
,我设置 content_path。
module MyAppName
class Application < Rails::Application
…
if ENV["PIPE_ENV"].present?
Rails.application.config.credentials.content_path = Rails.root.join("config/credentials/#{ENV["PIPE_ENV"]}.yml.enc")
end
end
end
我不喜欢在这里放东西,但是 config/environments/production.rb
使用凭证来设置邮件程序,所以必须提前设置。
此外,不要忘记将 RAILS_MASTER_KEY 设置为相应的环境,因此要进行暂存,请调用
heroku config:set RAILS_MASTER_KEY=your-staging-key -a your-staging-app
当然,your-staging-key
就是config/credentials/staging.key
中的字符串
奖金,对于您的应用程序的其余部分,您可以将其添加到 config/initializer/pipe_env.rb
中,这样您就可以像调用 Rails.env
:
一样调用 Rails.pipe_env
module Rails
class << self
def pipe_env
@_pipe_env = ActiveSupport::StringInquirer.new(ENV["PIPE_ENV"].presence || Rails.env)
end
end
end
Heroku recommends not using a custom environment called staging
; instead, they suggest using the production
environment but with a different set of ENV
variables. This makes sense (
但是,我想知道如何将这种做法与 Rails 6 encrypted credentials 功能结合起来。加密凭据 确实 支持多种环境,因此我们可以将 development
和 production
凭据分开;但是,使用 Heroku 的建议意味着 production
凭据将在实际生产服务器和实际登台服务器之间共享。我不想要。
我想要的是 staging
服务器在 production
环境中使用 development
凭据!
保持所有不同的凭证上传和更新(在生产、暂存和我们所有的开发人员之间)是一件麻烦事,加密文件似乎是一个非常需要的改进;我只是无法弄清楚如何进行暂存以使用非生产凭证。
PS:也许可以根据 Heroku 中设置的环境变量覆盖 config.credentials.content_path
per the docs,该变量指示是使用生产还是开发凭据。好奇别人正在做什么或可能会做什么。
覆盖确实是解决方案。这是我的设置。
由于根据 Heroku 的建议将 RAILS_ENV
设置为 production
,我使用了另一个环境变量 PIPE_ENV
并将其设置为管道中的位置,因此 staging
、edge
(用于开发)等
现在 application.rb
,我设置 content_path。
module MyAppName
class Application < Rails::Application
…
if ENV["PIPE_ENV"].present?
Rails.application.config.credentials.content_path = Rails.root.join("config/credentials/#{ENV["PIPE_ENV"]}.yml.enc")
end
end
end
我不喜欢在这里放东西,但是 config/environments/production.rb
使用凭证来设置邮件程序,所以必须提前设置。
此外,不要忘记将 RAILS_MASTER_KEY 设置为相应的环境,因此要进行暂存,请调用
heroku config:set RAILS_MASTER_KEY=your-staging-key -a your-staging-app
当然,your-staging-key
就是config/credentials/staging.key
奖金,对于您的应用程序的其余部分,您可以将其添加到 config/initializer/pipe_env.rb
中,这样您就可以像调用 Rails.env
:
Rails.pipe_env
module Rails
class << self
def pipe_env
@_pipe_env = ActiveSupport::StringInquirer.new(ENV["PIPE_ENV"].presence || Rails.env)
end
end
end