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

问题描述 投票:18回答:5

所以我试图让我的rails应用程序部署在生产模式,但我收到错误:缺少secret_tokensecret_key_base的'生产'环境,在config/secrets.yml中设置这些值

我的secrets.yml文件是预期的:

development:
  secret_key_base: xxxxxxx

test:
  secret_key_base: xxxxxxx

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

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

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

ruby-on-rails deployment production-environment secret-key
5个回答
23
投票

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

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

14
投票

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

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

至于快速修复尝试这个:

export SECRET_KEY_BASE=YOUR SECRET BASE

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

命令:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

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

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


6
投票

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

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

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

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

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

“应用程序错误:缺少'production'环境的secret_key_base,在config / secrets.yml(RuntimeError)中设置此值”

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

Do not keep production secrets in the repository,

instead read values from the environment. production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> This means that 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这些文件按重要性排序,这意味着如果你有第一个文件,那么你就不需要写其他文件了。因此,如果您在目录“〜/ .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。最后完成所有配置后,您应该可以使用Unicorn或其他方式部署没有问题的Rails应用程序。

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

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

免责声明:我不是Linux或Rails大师,所以如果您发现错误或任何错误,我将很乐意解决它!


4
投票

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

至于使用的变量ENV["SECRET_KEY_BASE"],这是一个环境变量来自Rails运行的环境(不要与Rails“环境”混淆,如developmenttestproduction)。这些环境变量来自shell。正如JensD的帖子中所提到的,您可以临时设置此环境变量:

export SECRET_TOKEN=YOUR SECRET TOKEN
export SECRET_KEY_TOKEN=YOUR SECRET BASE

要生成新的密钥令牌,请在命令行中使用rake secret命令。

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

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


0
投票

现在(rails 6)rails为你在SECRET_KEY_BASE中生成一个秘密密钥库。

在生产环境中,最好的是将Rails.application.secret_key_base作为en env变量,它将被rails选中。

你可以查看qazxswpoi。

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

© www.soinside.com 2019 - 2024. All rights reserved.