所以我试图让我的rails应用程序在生产模式下部署,但是我收到错误:在'生产'环境中缺少secret_token
和secret_key_base
,请在{{1}中设置这些值}
我的secrets.yml文件符合预期:
config/secrets.yml
但即使在google和研究之后,我也不知道如何处理生产密钥库。那里的大部分信息都假设我有一定的背景知识,但事实是我是一个菜鸟。
有人可以向我解释如何设置我的密钥并使其在生产模式下工作吗?
答案 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)
正如您所看到的,development
和test
环境存在硬编码值,但production
的环境值来自变量。首先,为什么这样?这是一项安全功能。这样,如果您将此文件检入版本控制(例如git或svn),development
和test
值将被共享,这很好,但是production
一个(将是{1}}在一个真实的网站上使用)是不是,所以没有人可以看到来源获得这个秘密。
对于使用的变量ENV["SECRET_KEY_BASE"]
,这是一个来自Rails运行环境的环境变量(不要与Rails"环境"混淆,例如{{1} },development
和test
)。这些环境变量来自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个字符的十六进制编码字符串)