如何使用Ruby on Rails 4.1.0beta1管理密钥和heroku?

iTa*_*ake 7 ruby-on-rails heroku

随着secrets.yml文件的发布,我删除了对Figaro的依赖并将我的所有密钥移到secrets.yml并将该文件添加到.gitignore.

但是当我试图推送到Heroku时,Heroku表示他们需要在我的仓库中使用该文件来部署网站.这是有道理的,但如果我可以避免它,我不希望我的密钥在git中.

使用Figaro,我会运行一个rake任务,将密钥部署到heroku作为env变量,并将application.yml保存在.gitignore中.显然,我不能再这样做了.那我该怎么处理呢?

Eri*_*man 20

秘密不是环境变量问题的完全解决方案,它不是像费加罗那样的直接替代品.将Secrets视为一个额外的界面,您现在应该在您的应用程序和更广泛的环境变量世界之间使用.这就是为什么你现在应该通过使用Rails.application.secrets.your_variable而不是来调用变量ENV["your_variable"].

secrets.yml文件本身就是一个接口,它不是为了包含实际的秘密(它没有很好地命名).您可以看到这一点,因为即使在文档的示例中,Secrets也会为任何敏感值(例如SECRET_KEY_BASE值)导入环境变量,并自动将其检入源代码管理中.

因此,不要试图将Secrets破解成某种全流程环境变量管理解决方案,而是顺其自然:

  1. 拉出任何敏感的东西secrets.yml.
  2. 检查secrets.yml源控制,就像他们默认你一样.
  3. 对于所有敏感值,将它们从正常环境变量导入到秘密ERB(例如some_var: <%= ENV["some_var"] %>)
  4. 像往常一样管理那些ENV变量,例如使用Figaro gem.
  5. 像往常一样将ENV变量发送到Heroku,例如使用Figaro gem的rake任务.

关键是,无论你如何管理你的ENV变量 - 无论是手动,使用Figaro,.env文件,等等...... secrets.yml只是一个将这些ENV变量转换为你的Rails应用程序的界面.

虽然它增加了额外的抽象步骤和一些额外的工作,但使用这种接口方法有一些优点.

无论你是否相信它在概念上是一个好主意或不使用秘密,它将为你节省很多头痛,只需顺其自然.

PS.如果您确实选择破解它,请小心heroku_secrets宝石.在撰写本文时,它before_initialize在启动顺序中运行,因此您的ENV变量将不可用于config/environments/目录中的任何配置文件(这是您通常将它们用于Amazon S3密钥之类的东西).


小智 7

Figaro任务的secrets.yml的等价物由heroku_secrets gem提供,来自https://github.com/alexpeattie/heroku_secrets:

gem 'heroku_secrets', github: 'alexpeattie/heroku_secrets'
Run Code Online (Sandbox Code Playgroud)

这让你跑

rake heroku:secrets RAILS_ENV=production
Run Code Online (Sandbox Code Playgroud)

使secretoku.yml的内容可用作heroku作为环境变量.

  • 如果你将secretts.yml的内容提供给heroku,那么你是否也将它们保存在secrets.yml文件中?你把secretts.yml上传到github吗?如果你使用那个gem,那个gem手柄是否会将secrets.yml文件隐藏在github上暴露给public? (2认同)

use*_*821 2

请参阅此链接了解 Heroku 设置

如果你想像这样在本地使用上运行

KEY=xyz OTHER_KEY=123 轨道