Rails Production - 如何设置密钥基础?

时间:2015-03-21 19:50:38

标签: ruby-on-rails deployment production-environment secret-key

所以我试图让我的rails应用程序在生产模式下部署,但是我收到错误:在'生产'环境中缺少secret_tokensecret_key_base,请在{{1}中设置这些值}

我的secrets.yml文件符合预期:

config/secrets.yml

但即使在google和研究之后,我也不知道如何处理生产密钥库。那里的大部分信息都假设我有一定的背景知识,但事实是我是一个菜鸟。

有人可以向我解释如何设置我的密钥并使其在生产模式下工作吗?

5 个答案:

答案 0 :(得分:23)

您可以使用以下命令生成密钥

$ irb
>> require 'securerandom'
=> true
>> SecureRandom.hex(64)
=> "3fe397575565365108556c3e5549f139e8078a8ec8fd2675a83de96289b30550a266ac04488d7086322efbe573738e7b3ae005b2e3d9afd718aa337fa5e329cf"
>> exit

答案 1 :(得分:14)

您获得的错误只表明服务器上没有正确设置secret_key_base的环境变量。

您可以使用各种脚本,如capistrano,在运行应用程序之前自动完成设置这些脚本的过程。

至于快速修复,试试这个:

export SECRET_KEY_BASE=YOUR SECRET BASE

验证环境变量并检查是否已设置这些变量。

命令:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

如果弹出您的值,则会在生产服务器上设置这些值。

最佳做法是使用ENV.fetch(SECRET_KEY),因为这会在应用尝试启动之前引发异常。

答案 2 :(得分:6)

这个答案对我帮助很大。他指出如何在生产中配置secrets.yml文件以及如何从环境中读取它:

原始链接: https://stackoverflow.com/a/26172408/4962760

  

我遇到了同样的问题,我通过创建环境解决了这个问题   每次登录到生产时加载的变量   服务器并制作了配置步骤的迷你指南:

     

https://gist.github.com/pablosalgadom/4d75f30517edc6230a67

     

当我尝试部署我的时,我正在使用Rails 4.1和Unicorn v4.8.2   应用程序没有正确启动,在unicorn.log文件中我发现了这个   错误讯息:

     

“应用程序错误:缺少'生产'环境的secret_key_base,设置   config / secrets.yml(RuntimeError)中的这个值“

     

经过一番研究后,我发现Rails 4.1改变了方向   管理secret_key,所以如果你读了位于的secrets.yml文件   [exampleRailsProject] /config/secrets.yml你会发现类似的东西   这样:

     

不要将生产机密保留在存储库中,

     

而是从环境中读取值。生产:secret_key_base:<%= ENV [“SECRET_KEY_BASE”]%>这意味着rails

     

建议您为secret_key_base使用环境变量   在您的生产服务器中,为了解决此错误,您应该这样做   按照以下步骤为Linux创建一个环境变量(在我的   案例Ubuntu)在您的生产服务器中:

     

1.-在生产服务器的终端中执行下一个命令:

     

$ RAILS_ENV = production rake secret这将返回一个大字符串   字母和数字,复制(我们将该代码称为   GENERATED_CODE)。

     

2.1-以root用户身份登录到您的服务器,找到该文件并进行编辑:$ vi / etc / profile

     

转到文件的底部(VI中的大写字母G的“SHIFT + G”)

     

使用GENERATED_CODE编写环境变量(按“i”键   要写入VI),请确保在文件末尾的新行中:

     

export SECRET_KEY_BASE = GENERATED_CODE保存更改并关闭   文件(我们按“ESC”键,然后写“:x”和“ENTER”键进行保存   并退出VI)

     

2.2但是如果你以普通用户身份登录,我们称之为example_user这个要点,你需要找到其他一个文件:

     

$ vi~ / .bash_profile $ vi~ / .bash_login $ vi~ / .profile这些文件   按顺序排列,这意味着如果你有第一个   文件,然后你不需要写其他人。所以,如果你找到了   这2个文件在您的目录“〜/ .bash_profile”和“〜/ .profile”中   只需写入第一个“〜/ .bash_profile”,因为   Linux将只读取这一个,而另一个将被忽略。

     

然后我们转到文件的底部(VI中的大写字母G的“SHIFT + G”)

     

我们将使用GENERATED_CODE编写环境变量   (按“i”键在VI中写入),请务必在最后一行换行   文件:

     

export SECRET_KEY_BASE = GENERATED_CODE编写代码后,保存   更改并关闭文件(我们按“ESC”键然后写“:x”   和“ENTER”键保存并退出VI)

     

3.-您可以使用以下命令验证我们的环境变量是否在Linux中正确设置:

     

$ printenv | grep SECRET_KEY_BASE或者:

     

$ echo $ SECRET_KEY_BASE执行此命令时,如果一切   好了,它会显示之前的GENERATED_CODE。最后用   完成的所有配置应该能够在没有的情况下部署   你的Rails应用程序与Unicorn或其他人的问题。

     

关闭shell终端并再次登录到生产环境时   服务器,您将设置此环境变量并准备使用   它

     

就是这样!!我希望这个迷你指南可以帮助您解决此错误。

     

免责声明:我不是Linux或Rails大师,所以如果你找到了什么   错误或任何错误我很乐意解决它!

答案 3 :(得分:4)

正如您所看到的,developmenttest环境存在硬编码值,但production的环境值来自变量。首先,为什么这样?这是一项安全功能。这样,如果您将此文件检入版本控制(例如git或svn),developmenttest值将被共享,这很好,但是production一个(将是{1}}在一个真实的网站上使用)是不是,所以没有人可以看到来源获得这个秘密。

对于使用的变量ENV["SECRET_KEY_BASE"],这是一个来自Rails运行环境的环境变量(不要与Rails"环境"混淆,例如{{1} },developmenttest)。这些环境变量来自shell。如JensD帖子中所述,您可以使用以下内容临时设置此环境变量:

production

要生成新的密钥令牌,请在命令行中使用export SECRET_TOKEN=YOUR SECRET TOKEN export SECRET_KEY_TOKEN=YOUR SECRET BASE 命令。

然而,这是暂时的,而不是一个好的最终解决方案。要获得最终解决方案,请查看this article,它在实施dotenv时快速接近加载配置机密。请记住,如果您使用版本控制,请务必排除rake secret文件的签入!

设置dotenv需要一些工作,但我强烈推荐它尝试手动配置这些环境变量。

答案 4 :(得分:0)

如今(第6条)导轨在tmp/development_secret.txt中为您生成了一个秘密密钥库。

在生产环境中,最好的方法是将SECRET_KEY_BASE作为en env变量,它将被轨道所吸收。

您可以使用Rails.application.secret_key_base进行检查。

应该给您一个长字符串,从'a'到'f'(128个字符的十六进制编码字符串)