将Rails 4应用程序升级到Rails 5.2,对管理秘密变量的新主密钥和凭据方法感到困惑。在谷歌上做了相当多的搜索,但找不到答案。
我的理解是,在地方发展中,
- 主密钥将在config/master.key上生成,不会提交到git repo。
- 它用于加密config/credentials.yml.enc中的秘密变量。
- 我可以通过 EDITOR=vim 轨道添加或更新机密变量 凭据:编辑
因此,在本地开发中,我将数据库密码添加到config/credentials.yml.enc中,并提交到git repo中。(注意:这是我的本地数据库密码。
但问题有以下两种情况:
- 另一个开发人员签出代码,并尝试在他的本地环境中运行。它将失败,因为他没有主密钥。即使我可以通过其他一些方法将主密钥共享给他,它仍然假设他的本地数据库密码与我的相同,这通常不是事实。对他来说,更改秘密变量值并再次提交是没有意义的。那么它将如何在多开发人员协作中工作呢?
- 在生产部署方面,它变得更加重要。生产环境中的机密变量应与本地开发环境不同。那么如何在部署过程中更改秘密变量值呢?例如,如何自动化 EDITOR=vim rails 凭据:编辑,就像通过一些 shell 脚本一样?
我觉得这两个问题都应该是幼稚的,这些都是典型的场景,一定是考虑过的,但真的让我很困惑......请帮我理解,谢谢!
我不相信您可以在加密凭据中引用环境变量。因此,请将
database.yml
文件保留为使用 ENV 而不是开发标题下的加密凭据。您可以使用 CONSTANT (如 ENCRYPTED_CREDENTIALS
(在 application.rb
中为每个环境分配凭据。然后,在生产标题下的database.yml
中使用ENCRYPTED_CREDENTIALS
。这两个文件加上您的加密凭据应如下所示(为简洁起见,已缩短(。请注意加密凭据如何仅使用生产database.yml
因为开发标题未使用加密凭据:
config/application.rb
ENCRYPTED_CREDENTIALS = Rails.application.credentials[Rails.env.to_s.to_sym]
config/database.yml
development:
username: <%= ENV["DATABASE_USER"] %>
production:
username: ENCRYPTED_CREDENTIALS[:database_user]
rails credentials:show
production:
database_user: some_username