rails secret_key_base未在生产中被识别

时间:2014-04-10 05:27:49

标签: ruby-on-rails ruby rake

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

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

我正在运行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"] %>

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

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

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

2 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,每次登录到生产服务器并使a mini guide of the steps由您自己配置时,我解决了创建环境变量的问题:

所以我在使用Rails 4.1和Unicorn v4.8.2时,当我尝试部署我的应用程序时,它无法正常启动并进入unicorn.log文件,我发现此错误消息:

  

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

经过一番研究后我发现Rails 4.1改变了管理secret_key的方式,所以如果我们读取位于secrets.yml的{​​{1}}文件(你需要为项目名称替换“exampleRailsProject”)你会发现这样的东西:

exampleRailsProject/config/secrets.yml

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

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

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

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

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

$ RAILS_ENV=production rake secret

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

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

$ vi /etc/profile

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

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

export SECRET_KEY_BASE=GENERATED_CODE

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

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

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

$ vi ~/.bash_profile
$ vi ~/.bash_login
$ vi ~/.profile

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

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

export SECRET_KEY_BASE=GENERATED_CODE

或与:

$ printenv | grep SECRET_KEY_BASE

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

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

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

答案 1 :(得分:5)

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

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