rails secret_key_base未在生产中被识别

Bil*_*son 8 ruby rake ruby-on-rails

所以我正在尝试在生产中部署我的rails应用程序.当我进入页面时,我收到500错误.当我转到我的错误日志时,我收到以下错误:

Exception RuntimeError in Rack application object (Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`) 
Run Code Online (Sandbox Code Playgroud)

我正在运行Rails 4.1,我的config/secrets.yml看起来像这样:

    development:
      secret_key_base: <development key>        
    test:
      secret_key_base: <test key>

    # Do not keep production secrets in the repository,
    # instead read values from the environment.
    production:
      secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Run Code Online (Sandbox Code Playgroud)

我运行rake secret获取密钥并将导出放入我的bash_profile并获取它.我运行了rake资产:预编译成功.然而,我仍然一直在犯这个错误.有任何想法吗?

更新:我试图更新提供的错误消息,以提供更好的信息....并且消息没有更新.然后我尝试将密钥直接添加到yml文件,而不是使用环境变量,仍然没有骰子.我在hostmonster上运行,所以我无法重新启动服务器.....但有些东西告诉我需要做什么...

更新2:彻夜难眠后,这个问题似乎不再是问题.它一定是某种缓存.现在我的问题是它试图使用我几天前为我的数据库更改的旧配置.如果我弄清楚如何使缓存无效,我将在此处发布并将其标记为答案.如果其他人知道该怎么做,请告诉我,我会将其标记为答案.我使用HostMonster作为我的托管,并按照他们在他们的网站上的步骤来托管我的rails应用程序.

Dem*_*gus 6

我有同样的问题,我解决了创建一个环境变量,每次我登录到生产服务器时加载,并做了一个迷你指南,由你自己配置它的步骤:

所以我使用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(你需要为你的项目名称替换"exampleRailsProject"),你会发现这样的事情:

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Run Code Online (Sandbox Code Playgroud)

这意味着rails建议您在我们的生产服务器中为secret_key_base使用环境变量,因此为了解决此错误,您需要按照以下步骤为我们创建一个linux环境变量(在我的例子中是Ubuntu)生产服务器:

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

$ RAILS_ENV=production rake secret
Run Code Online (Sandbox Code Playgroud)

这将给出一个带字母和数字的大字符串,这就是你需要的,所以复制它(我们将该代码称为GENERATED_CODE).

2.1-现在,如果我们以root用户身份登录我们的服务器,我们需要找到该文件并打开它:

$ vi /etc/profile
Run Code Online (Sandbox Code Playgroud)

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

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

export SECRET_KEY_BASE=GENERATED_CODE
Run Code Online (Sandbox Code Playgroud)

编写代码后,我们保存更改并关闭文件(我们按"ESC"键然后写入":x"和"ENTER"键进行保存并退出VI)

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

$ vi ~/.bash_profile
$ vi ~/.bash_login
$ vi ~/.profile
Run Code Online (Sandbox Code Playgroud)

这些文件按重要性顺序排列,这意味着如果您有第一个文件,则不需要写入其他文件.因此,如果您在目录"〜/ .bash_profile"和"〜/ .profile"中找到这2个文件,您只需要在第一个"〜/ .bash_profile"中写入,因为linux只会读取此文件和其他文件将被忽略.

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

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

export SECRET_KEY_BASE=GENERATED_CODE
Run Code Online (Sandbox Code Playgroud)

编写代码后,我们保存更改并关闭文件(我们按"ESC"键然后写入":x"和"ENTER"键进行保存并退出VI)

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

$ printenv | grep SECRET_KEY_BASE
Run Code Online (Sandbox Code Playgroud)

或者:

$ echo $SECRET_KEY_BASE
Run Code Online (Sandbox Code Playgroud)

执行此命令时,如果一切正常,它将显示我们之前生成的GENERATED_CODE.最后完成所有配置后,您可以使用Unicorn或其他方式部署没有问题的Rails应用程序.

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

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


Mih*_*kov 5

  1. 您需要重新启动服务器,因为在YourAppName::Application.initialize!调用后config/environment.rb您无法更改您的设置.
  2. 检查你的yml标记,可能有一些错误
  3. 你的config/initializers/secret_token.rb可能有问题

问题不在于ENV伪哈希.如果在ENV中没有这样的密钥,secret_key_base将是nil.