Rails生产环境 - 如何设置密钥基础?

27

因此,我正试图让我的Rails应用程序以生产模式部署,但我遇到了错误:在“production”环境中缺少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"] %>

即使在使用谷歌和做了研究后,我仍然不知道如何处理生产秘钥基础。大多数信息都假定我拥有一定的背景知识,但事实是我是个新手。

有人能否向我解释如何设置我的秘钥并在生产模式下让它正常工作?


6个回答

33

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

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

如何使用这个并且我可以把它放在哪里? - Ravi Thummar
9
或者现在使用 rails secret - localhostdotdev
@localhostdotdev 我使用的是 Rails 7.0.x,但 rails secret 命令无法正常工作。 - wruckie
温馨提示:请勿从上面的答案中复制随机值。按照说明生成您自己的值 :-) - Peter Ehrlich

18

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

你可以使用像capistrano这样的脚本,在应用程序运行之前自动设置这些变量。

至于快速修复,请尝试以下操作:

export SECRET_KEY_BASE=YOUR SECRET BASE

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

命令:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

如果你的值弹出来了,那么这些在生产服务器上已经设置了。

同时最好使用 ENV.fetch(SECRET_KEY),因为这会在应用程序尝试启动之前引发异常。


我的秘密令牌应该是什么?我使用了 $rake secret 命令生成了一个密钥,但基础部分怎么办? - nvrpicurnose
4
rake secret命令创建一个安全的密钥字符串,可用作TOKENBASE。Rails只需要这些以正常运行并在幕后执行一些安全操作。 - Jens
最新的Rails不再需要secret_token,只需要secret_key_base - Franklin Yu
谢谢提醒,我正在更新原始答案。 - Jens

6
这个回答对我很有帮助。他向您指示如何在生产环境中配置 secrets.yml 文件以及如何从环境中读取它:
原始链接: https://dev59.com/2GAg5IYBdhLWcg3wyNdv#26172408 我遇到了同样的问题,并通过创建一个环境变量来解决它,每次登录到生产服务器时都会加载它,并制作了一份简要指南来配置它:
我使用的是Rails 4.1和Unicorn v4.8.2,当我尝试部署我的应用程序时,它没有正确启动,在unicorn.log文件中我发现了这个错误消息:
"app error: Missing secret_key_base for 'production' environment, set this value in config/secrets.yml (RuntimeError)"
经过一些研究,我发现Rails 4.1改变了管理secret_key的方式,因此如果你读取位于[exampleRailsProject]/config/secrets.yml的secrets.yml文件,你会发现像这样的内容:
不要将生产密钥保存在存储库中, 而是从环境中读取值。 production: 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中按"SHIFT + G"键)
使用GENERATED_CODE编写您的环境变量(VI中按"i"键编写),确保在文件末尾的新行中:
export SECRET_KEY_BASE=GENERATED_CODE 保存更改并关闭文件(我们按"ESC"键然后在VI中写":x"和"ENTER"键保存和退出)
2.2 但是如果您以普通用户(example_user)身份登录,则需要找到其他文件之一: $ vi ~/.bash_profile $ vi ~/.bash_login $ vi ~/.profile 这些文件按重要性排序,这意味着如果您有第一个文件,则不需要在其他文件中写入。因此,如果您在目录"~/.bash_profile"和"~/.profile"中找到了这两个文件,则只需在第一个文件"~/.bash_profile"中写入即可,因为Linux将仅读取此文件,而其他文件将被忽略。
然后我们到文件底部(在VI中按"SHIFT + G"键)
我们将使用GENERATED_CODE编写我们的环境变量(VI中按"i"键编写),确保在文件末尾的新行中:
export SECRET_KEY_BASE=GENERATED_CODE 写完代码后,保存更改并关闭文件(我们按"ESC"键然后在VI中写":x"和"ENTER"键保存和退出)
3.- 您可以使用以下命令验证我们的环境变量是否正确设置在Linux中: $ printenv | grep SECRET_KEY_BASE 或者用: $ echo $SECRET_KEY_BASE 当您执行此命令时,如果一切正常,则会显示前面的GENERATED_CODE。最后,在完成所有配置后,您应该能够使用Unicorn或其他方式无问题地部署Rails应用程序。
当你关闭你的shell终端并再次登录到生产服务器时,你将拥有这个环境变量,并准备好使用它。
就是这样!!我希望这个小指南能帮助你解决这个错误。
免责声明:我不是Linux或Rails大师,所以如果您发现任何错误或错误,我将很乐意修复它!

6
现在(Rails 6)、Rails 会为您在 `tmp/development_secret.txt` 中生成一个密钥。
在生产环境中,最好将 `SECRET_KEY_BASE` 设置为环境变量,Rails 将自动获取它。
您可以使用 `Rails.application.secret_key_base` 来验证。
应该会给您提供一长串由数字和字符组成的字符串,范围从 'a' 到 'f',长度为 128 (十六进制编码的字符串)。

5
正如您所看到的,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命令。然而,这是临时的解决方案,不是最终解决方案。对于最终解决方案,请查看这篇文章,其中在最后部分有一个快速实现dotenv以加载配置秘密的小提示。请记住,如果您使用版本控制,请务必将.env文件排除在检查之外!设置dotenv需要一些工作,但我强烈建议使用它来代替手动配置这些环境变量。

1
有没有逐步教程可以指导如何将Rails应用程序推向生产环境?我无法拼凑所有这些碎片,因为我缺乏必要的背景知识。 - nvrpicurnose
您可以尝试来自DigitalOcean的此教程:https://www.digitalocean.com/community/tutorials/how-to-automate-ruby-on-rails-application-deployments-using-capistrano - Jens
1
@nvrpicurnose 哈哈,学习的方法就是一遍又一遍地做,直到变得更容易。我已经反复启动和关闭服务器很长时间了,直到最终掌握它。需要花费很多小时和大量教程才能真正掌握它。至少对我来说,没有人真正帮助我,只能自己坚持下去,然后就会变得更容易。查看一下我尝试部署的这个演示应用程序的自述文件,可能会有所帮助 https://github.com/adiakritos/sw-checkin - Nick Res

0

首先:

生产环境创建秘密基础密钥

RAILS_ENV=production rake secret

或者在新的Rails中:

RAILS_ENV=production rails secret

示例输出:

c0da499ce973f787c1feaa43182a70b53ad8f23a46a7d0f64e92f858e8c4e441f67ef6907b99b934c9c57511dc33c705ee57201afacf6177dd73c9f6bceeacfb

第二:

你可以按名称设置为ENV,例如PROD_SECRET_KEY_BASE

export PROD_SECRET_KEY_BASE=ef6907b99b934c9c57511dc33c705ee57201afacf6177dd73c9f6bceeacfb

或者保存到〜/ .zshrc (或更改为〜/ .bashrc ):

echo 'export PROD_SECRET_KEY_BASE=ef6907b99b934c9c57511dc33c705ee57201afacf6177dd73c9f6bceeacfb' >> ~/.zshrc

并且在从 ENV 中通过名称 PROD_SECRET_KEY_BASE 获取值之后:

ENV['PROD_SECRET_KEY_BASE']
=> "ef6907b99b934c9c57511dc33c705ee57201afacf6177dd73c9f6bceeacfb"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接