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

nvr*_*ose 19 deployment ruby-on-rails production-environment secret-key

所以我试图让我的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"] %>
Run Code Online (Sandbox Code Playgroud)

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

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

Tar*_*thi 25

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

$ irb
>> require 'securerandom'
=> true
>> SecureRandom.hex(64)
=> "3fe397575565365108556c3e5549f139e8078a8ec8fd2675a83de96289b30550a266ac04488d7086322efbe573738e7b3ae005b2e3d9afd718aa337fa5e329cf"
>> exit
Run Code Online (Sandbox Code Playgroud)

  • 或者现在使用`rails secret` (5认同)

Jen*_*rgh 15

您获得的错误仅表示secret_key_base未在服务器上正确设置环境变量.

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

至于快速修复尝试这个:

export SECRET_KEY_BASE=YOUR SECRET BASE
Run Code Online (Sandbox Code Playgroud)

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

命令:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

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

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

  • `rake secret`创建一个安全的密钥字符串,用作'TOKEN`和`BASE`.Rails只需要这些就能正常运行并在幕后做一些安全工作. (3认同)

mat*_*ado 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文件,你会发现这样的东西:

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

而是从环境中读取值.生产:secret_key_base:<%= ENV ["SECRET_KEY_BASE"]%>这意味着铁路

建议您在生产服务器中为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"中找到这2个文件,您只需要在第一个"〜/ .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大师,所以如果您发现错误或任何错误,我将很乐意解决它!


loc*_*dev 6

tmp/development_secret.txt现在(rails 6)rails 会为您生成一个秘密密钥库。

在生产环境中,最好是使用SECRET_KEY_BASEen env 变量,它将被 Rails 拾取。

你可以检查一下Rails.application.secret_key_base

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


Red*_*ett 5

如您所见,developmentandtest环境有一个硬编码值,但 forproduction来自变量。首先,为什么要这样?这是一个安全功能。这样,如果您将此文件签入版本控制(例如 git 或 svn),则developmenttest值将被共享,这很好,但是production(将在真实网站上使用的那个)不是,因此没有人可以查看来源以获取该秘密。

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

export SECRET_TOKEN=YOUR SECRET TOKEN
export SECRET_KEY_TOKEN=YOUR SECRET BASE
Run Code Online (Sandbox Code Playgroud)

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

然而,这是暂时的,并不是一个好的最终解决方案。对于最终的解决方案,请查看这篇文章该文章接近尾声,介绍了如何实现dotenv以加载配置机密。请记住,如果您使用版本控制,请务必将您的.env文件排除在检入之外!

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