首页 > 解决方案 > 如何在 Heroku 上的 Rails 6 应用程序上设置 RAILS_PRODUCTION_KEY 配置变量

问题描述

我创建了一个新的 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`

但是,这不起作用,并且在设置RAILS_MASTER_KEY为生产密钥后我能够使其工作

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

如何让 HerokuRAILS_PRODUCTION_KEY在 Rails 6 应用程序中识别?

标签: herokuruby-on-rails-6

解决方案


我也很难弄清楚这个问题。(这不是Heroku 特有的问题。)

底线:命名的环境变量RAILS_PRODUCTION_KEY(或任何其他 Rails 环境风格的变量名)不是一个东西——Rails 不注意它。

从 Rails 6 凭据功能的(弱,IMO)Rails 文档中,我错误地假设生产密钥(在RAILS_PRODUCTION_KEYenv 变量或中config/credentials/production.key)将解密config/credentials/production.yml.enc,主密钥(在RAILS_MASTER_KEYenv 变量或中config/master.key)将解密config/credentials.yml.enc并且给定密钥 inconfig/credentials/production.yml.enc的值将覆盖该密钥 in 的值config/credentials.yml.enc。事实并非如此。

这就是它的实际工作方式:

  1. Rails 6 使用单个密钥来解密单个加密的机密文件。
  2. 解密密钥config/master.key的默认位置是,秘密文件的默认位置是config/credentials.yml.enc.
  3. 如果RAILS_MASTER_KEY定义了环境变量,Rails 将从环境变量中读取解密密钥,而不是config/master.key.
  4. 在给定的 Rails 环境(//etc.)中运行时production,如果(例如, )development中存在对应的 secrets 文件,那么 Rails 将只使用secrets 文件,并且使用对应的解密密钥(例如, )进行解密它。config/credentialsconfig/credentials/production.yml.encconfig/credentials/production.key
  5. 如果RAILS_MASTER_KEY定义了环境变量,Rails 将从环境变量中读取解密密钥,而不是从解密密钥文件中读取。注意:无论 Rails 环境如何,覆盖解密密钥文件的环境变量始终 RAILS_MASTER_KEY是.

推荐阅读