如何在Heroku上的Rails 6应用程序中设置RAILS_PRODUCTION_KEY配置变量

12

我创建了一个新的Rails 6应用程序,并且由于它支持多环境凭据,我正在尝试使用RAILS_PRODUCTION_KEY配置变量并删除默认的RAILS_MASTER_KEY

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

然而,这并不起作用。我成功将其设置为生产密钥后,使其工作。

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

我该如何让Heroku在Rails 6应用程序中识别RAILS_PRODUCTION_KEY


1
我认为你已经自己发现了解决方案:只需通过将生产密钥分配给主密钥来欺骗Heroku使用生产密钥。或者你需要在Heroku上同时拥有两个密钥吗? - Dennis Hackethal
不是的,这只是为了满足我的强迫症而将生产密钥变量命名为RAILS_PRODUCTION_KEY,但这也可以正常工作。 - vince
1个回答

28
我也在努力解决这个问题。(它并不是Heroku特有的问题。)
底线是:名为RAILS_PRODUCTION_KEY的环境变量(或其他Rails环境相关的变量名)不起作用——Rails不会注意它。
从(Rails6凭证功能的)文档中我误以为生产密钥(无论是在RAILS_PRODUCTION_KEY环境变量还是config/credentials/production.key中)会解密config/credentials/production.yml.enc,主密钥(无论是在RAILS_MASTER_KEY环境变量还是config/master.key中)将解密config/credentials.yml.enc,并且config/credentials/production.yml.enc中给定secrets key的值将覆盖config/credentials.yml.enc中该key的值。事实并非如此。
以下是实际情况: 1. Rails 6使用一个密钥来解密单个加密的secrets文件。 2. 解密密钥的默认位置为config/master.key,secrets文件的默认位置为config/credentials.yml.enc。
  • 如果定义了环境变量RAILS_MASTER_KEY,Rails 将从环境变量中读取解密密钥,而不是从config/master.key中读取。
  • 当运行于给定的 Rails 环境(如 production/development/等)时,如果在config/credentials目录下存在对应的秘密文件(如 config/credentials/production.yml.enc),则 Rails 只使用该秘密文件以及对应的解密密钥(如 config/credentials/production.key)来进行解密。
  • 如果定义了环境变量RAILS_MASTER_KEY,Rails将从环境变量中读取解密密钥,而不是从解密密钥文件中读取。注意:无论运行于何种 Rails 环境,覆盖解密密钥文件的环境变量始终为RAILS_MASTER_KEY

  • 1
    这就是答案。我也曾认为它应该按照你的想法工作,因为我觉得在开发和生产中使用不同的密钥将会是一个管理噩梦,因为我希望从开发中复制所有内容并覆盖一些生产中的内容...我的头已经晕了。 - Joe Sak
    这个答案终于解决了我的问题,还有这个 https://dev59.com/Srroa4cB1Zd3GeqPkW8F#66092950。 - csebryam
    哦,谢谢!我刚刚花了几个小时试图弄清楚为什么 RAILS_PRODUCTION_KEY 没有起作用。 - Ben

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接