带有 Heroku 登台环境的 Rails 加密凭证(使用生产设置)

tho*_*mad 4 ruby-on-rails credentials heroku ruby-on-rails-6

Heroku建议 不要使用名为staging;的自定义环境。相反,他们建议使用production环境但使用一组不同的ENV变量。这是有道理的(见这个问题)。

但是,我想知道如何将这种做法与Rails 6 加密凭据功能集成。加密凭证确实支持多种环境,因此我们可以将我们的凭证developmentproduction凭证分开;但是,使用 Heroku 的建议意味着production凭据将在实际生产服务器和实际登台服务器之间共享。我不想要的。

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

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


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

Nyc*_*cen 11

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

由于RAILS_ENV设置为production根据 Heroku 的建议,我使用另一个我调用的环境变量,该变量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
Run Code Online (Sandbox Code Playgroud)

我不喜欢在这里config/environments/production.rb放东西,而是使用凭据来设置邮件程序,因此必须提前设置。

另外,不要忘记将 RAILS_MASTER_KEY 设置为相应的环境,因此对于暂存您调用

heroku config:set RAILS_MASTER_KEY=your-staging-key -a your-staging-app
Run Code Online (Sandbox Code Playgroud)

当然,your-staging-key是字符串中的config/credentials/staging.key

奖励,对于您的应用程序的其余部分,您可以添加它,config/initializer/pipe_env.rb以便您可以Rails.pipe_env像调用一样调用Rails.env

module Rails
  class << self
    def pipe_env
      @_pipe_env = ActiveSupport::StringInquirer.new(ENV["PIPE_ENV"].presence || Rails.env)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)