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 功能结合起来。加密凭据 确实 支持多种环境,因此我们可以将 developmentproduction 凭据分开;但是,使用 Heroku 的建议意味着 production 凭据将在实际生产服务器和实际登台服务器之间共享。我不想要。

我想要的是 staging 服务器在 production 环境中使用 development 凭据!

保持所有不同的凭证上传和更新(在生产、暂存和我们所有的开发人员之间)是一件麻烦事,加密文件似乎是一个非常需要的改进;我只是无法弄清楚如何进行暂存以使用非生产凭证。


PS:也许可以根据 Heroku 中设置的环境变量覆盖 config.credentials.content_path per the docs,该变量指示是使用生产还是开发凭据。好奇别人正在做什么或可能会做什么。

覆盖确实是解决方案。这是我的设置。

由于根据 Heroku 的建议将 RAILS_ENV 设置为 production,我使用了另一个环境变量 PIPE_ENV 并将其设置为管道中的位置,因此 stagingedge(用于开发)等

现在 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