如何在Heroku上的RAILS 6应用程序上设置RAILS_PRODUCTION_KEY config var

如何在Heroku上的RAILS 6应用程序上设置RAILS_PRODUCTION_KEY config var,heroku,ruby-on-rails-6,Heroku,Ruby On Rails 6,我创建了一个新的Rails 6应用程序,因为它支持多环境凭据,所以我尝试使用Rails\u PRODUCTION\u键config变量并删除默认的Rails\u MASTER\u键 heroku config:unset RAILS_MASTER_KEY heroku config:set RAILS_PRODUCTION_KEY=`cat config/credentials/production.key` 但是,这不起作用,在将RAILS\u MASTER\u KEY设置为生产密钥后,我

我创建了一个新的Rails 6应用程序,因为它支持多环境凭据,所以我尝试使用
Rails\u PRODUCTION\u键
config变量并删除默认的
Rails\u MASTER\u键

heroku config:unset RAILS_MASTER_KEY 
heroku config:set RAILS_PRODUCTION_KEY=`cat config/credentials/production.key`
但是,这不起作用,在将
RAILS\u MASTER\u KEY
设置为生产密钥后,我能够让它工作

heroku config:unset RAILS_PRODUCTION_KEY
heroku config:set RAILS_MASTER_KEY=`cat config/credentials/production.key`

如何让Heroku在RAILS 6应用程序中识别RAILS的生产密钥?

我也在努力解决这个问题。(这不是一个特定于Heroku的问题。)

一句话:名为
RAILS\u PRODUCTION\u KEY
(或任何其他RAILS环境变量名)的环境变量不是一件事,RAILS不会注意它

从Rails 6凭据特性的(弱,IMO)Rails文档中,我错误地假设生产密钥(在
Rails\u production\u key
env变量中或
config/credentials/production.key
)将解密主密钥
config/credentials/production.yml.enc
)(在
RAILS\u MASTER\u KEY
env变量或
config/MASTER.KEY
中)将解密
config/credentials.yml.enc
config/credentials/production.yml.enc
中给定密钥的值将覆盖
config/credentials.yml.enc
中该密钥的值。情况并非如此

这就是它的实际工作原理:

  • Rails 6使用单个密钥来解密单个加密的机密文件
  • 解密密钥的默认位置是
    config/master.key
    ,机密文件的默认位置是
    config/credentials.yml.enc
  • 如果定义了
    RAILS\u MASTER\u KEY
    的环境变量,RAILS将从环境变量而不是从
    config/MASTER.KEY
    读取解密密钥
  • 在给定的Rails环境(
    production
    /
    development
    /等)中运行时,如果在
    config/credentials
    中存在相应的机密文件(例如,
    config/credentials/production.yml.enc
    ),Rails将只使用该机密文件,并使用相应的解密密钥(例如,
    config/credentials/production.key
    仅对其进行解密
  • 如果定义了
    RAILS\u MASTER\u KEY
    的环境变量,RAILS将从环境变量而不是从解密密钥文件读取解密密钥。注意:无论RAILS环境如何,覆盖解密密钥文件的环境变量始终是
    RAILS\u MASTER\u KEY

  • 我想你自己已经发现了解决方案:简单地通过将生产密钥分配给主密钥来欺骗Heroku使用生产密钥。或者你需要在Heroku上同时拥有两个密钥吗?不,只是为了满足我的OCD要求,将生产密钥var命名为RAILS\u production\u key,但这很好。这就是答案。我还认为它按照你的想法工作,这就是它应该如何工作的原因,因为我觉得在开发和生产中尝试使用不同的关键点将是一场噩梦,因为我想复制开发中的所有内容,并覆盖生产中的某些内容…我的脑袋一直在转这个答案最终为我解决了这个问题,