secrets.yml环境变量在Rails 4.1.4中不起作用

时间:2014-09-06 14:08:35

标签: ruby-on-rails

我正在部署Rails应用程序。
当我在secrets.yml文件中有secret_key_base:<%= ENV["SECRET_KEY_BASE"] %>时,我在nginx日志文件中找不到secret_key_base的错误。
我在控制台中使用rake secret生成了秘密,并将其放在〜/ .bashrc 中作为
导出SECRET_KEY_BASE="secret" 在控制台中,我运行echo $SECRET_KEY_BASE并将密码复制到 secrets.yml ,用秘密替换<%= ENV["SECRET_KEY_BASE"] %>。 然后一切正常,应用程序在生产环境中运行良好 我宁愿不保密秘密。我不知道如何纠正这个或我做错了什么 有没有人有任何建议?

3 个答案:

答案 0 :(得分:3)

如果您使用乘客,请添加

passenger_set_cgi_param SECRET_KEY_BASE "yoursecret";

到相关部分的nginx配置。 See this section in the passenger user guide.

答案 1 :(得分:0)

在生产中〜/ .bashrc可能无法读取 - 例如,您以不同的用户身份运行,nginx在启动之前可能无法读取〜/ .bashrc,等等。Lots of people遇到此问题。

一种常见的方法是处理环境配置,如Rails处理数据库配置。使用每个环境的设置创建config / 某些 .yml文件,然后在config / initializers / 某些 .rb初始化程序中读取该yaml并使用特定环境的值。 rails_configfigaro宝石可自动执行此方法。我经常只是在没有宝石的情况下完成它,因为它并不是非常困难。与database.yml一样,关键是你永远不想将它检查到源代码控制中 - 使用.gitignore和git。

如果您希望坚持使用环境变量设置密钥库,那么您的工作方式取决于生产计算机,以及如何配置和部署代码。使用Heroku,只需弹出Heroku控制台并进行设置即可。对于其他情况,您可以使用Chef / Puppet / Ansible之类的东西来设置服务器的环境变量。另一种方法是使用Capistrano推送该信息。

答案 2 :(得分:-1)

您可以将秘密基地放在/config/initializes/secret_token.rb中:

SampleApp::Application.config.secret_key_base = 'Your_Base_here'

编辑: 在许多情况下,这是不鼓励的,因此请编辑.env文件并设置密钥库:

SECRET_KEY_BASE=Your_base_here

并将你的secrets.yml带回:

<%= ENV["SECRET_KEY_BASE"] %>

您也可以使用/config/initializes/secret_token.rb:

SampleApp::Application.config.secret_token = ENV['SECRET_TOKEN']

哪个会给你相同的结果,更安全。 如果你打算把它推到Heroku:

heroku config:set SECRET_KEY_BASE=$SECRET_KEY_BASE