在公共云和PaaS环境中运行时,应用程序需要在生产中保护许多秘密。常见的一个是mysql用户和密码的database.yml条目,但也可以有其他条目。你的谷歌应用程序秘密,Facebook应用程序秘密,...列表继续。没有明确的方法来保护这些基本配置参数。你不要想把它们放在一个文件中,因为无法保证谁有权访问它。
在Heroku中,您可以通过环境变量指定内容。在Cloudbees(Java PaaS)中,您可以将它们指定为Java System属性。 Heroku和Cloudbees都有一个命令行实用程序来上传这些配置参数,但是不支持在开发和生产中轻松完成这项工作。
问题是如何配置参数,以便您可以在开发中轻松开发,但不能在开发中使用生产秘密
理想情况下,有一个宝石可以在ruby和jruby环境和PaaS中工作,这将允许我在开发中具有开发设置但从ENV
或java.lang.System.getProperty
。
##
# file: config/secure_config.yml
development:
db:
user_id: 'dev_mysql_user'
password: 'my_dev_pwd'
google:
app_id: 'xxxxx' # this is the secret for the dev app so it can be visible
app_secret: 'xxxxx'
# ...
production:
db:
user_id: <%= get_secure_config %>
password: <%= get_secure_config %>
google:
app_id: <%= get_secure_config %>
app_secret: <%= get_secure_config %>
在Ruby或jRuby的情况下,get_secure_config帮助程序从ENV
或java.lang.System.getProperty
获取值。最后,您可以根据需要在您的应用中使用它们。例如,在database.yml或设计代码中使用google进行身份验证。
# config/database.yml
# ...
production:
adapter: mysql2
username: <%= SecureConfig.db.user_id %>
password: <%= SecureConfig.db.password %>
然后为了额外的酷,gem还应该给我一个可执行文件,允许我将配置推送到我的PaaS
~/work/myproject> bundle exec secure_config -push_to_heroku
或
~/work/myproject> bundle exec secure_config -push_to_cloudbees
答案 0 :(得分:3)
结帐Figaro。它几乎就是你所追求的。
您将敏感数据放在git-ignored YAML文件中,然后在ENV
中将其提供给应用程序。它还提供了一个rake任务,用于使用变量配置Heroku实例。
答案 1 :(得分:2)
正如Daniel Wright所说,费加罗上面很棒!它为轨道上的红宝石做了我需要的一切。我还需要通过Cloudbees PaaS服务的JVM系统属性在JRuby上获得对rails和属性的相同支持。我有forked Figaro并进行了这些扩展,并向laserlemon / Figaro发送了拉取请求。同时你可以在你的gem文件中使用git指令来拉它。
gem 'figaro', '0.4.2', :git => "git://github.com/RedMicaInc/figaro.git"
主要差异记录如下
效果很好。
有一些类似的解决方案,以及许多本土尝试。大多数命名空间配置在Config
(或类似)命名空间下。这很好,但是已经有了一个描述应用程序环境的地方...... ENV
!
ENV
是一组简单的字符串键/值对,它非常适合应用程序配置。
然后,这些配置参数也可用作FigaroSettings
对象的属性。因此,如果您有一个名为MY_PROP
的属性,则可以使用FigaroSettings.my_prop
或FigaroSettings.MY_PROP
对于基于JRUBY
的应用程序,存储在JVM系统属性中的属性也以类似的方式提供。例如,如果您有一个名为MY_JAVA_PROP
的属性,则可以FigaroSettings.MY_JAVA_PROP
访问它。 Java属性区分大小写。
作为一个额外的好处,这正是Heroku或Cloudbees上的应用的配置方式。因此,如果您使用ENV
配置Rails应用程序,则已经设置为部署到Heroku。对于Cloudbees,您可以使用ENV
FigaroSettings.<property>
或JVM属性
Cloudbees以类似的方式提供应用configuration。
通常,要配置可通过JVM系统属性访问的应用程序参数,可以使用cloudbees
sdk从命令行执行以下操作:
cloudbees config:set -a <my_app> PUSHER_APP_ID=8926
cloudbees config:set -a <my_app> PUSHER_KEY=0463644d89a340ff1132
cloudbees config:set -a <my_app> PUSHER_SECRET=0eadfd9847769f94367b
但费加罗提供了一项耙子任务!跑吧:
rake figaro:cloudbees
您可以选择传递Cloudbees应用程序的名称:
rake figaro:cloudbees[my-awesome-app]
如果您只想查看使用的命令,可以运行rake figaro:heroku_test