如何解决错误"缺少'secret_key_base`为'生产'环境"(Rails 4.1)

Pao*_*nti 160 ruby ruby-on-rails heroku ruby-on-rails-4

我从头开始创建了一个rails应用程序(rails 4.1),我遇到了一个我无法解决的奇怪问题.

每次我尝试在Heroku上部署我的应用程序时,都会收到错误500:

缺少secret_key_base"生产"环境,请设置此值config/secrets.yml

secret.yml文件包含以下配置:

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Run Code Online (Sandbox Code Playgroud)

在Heroku上,我已经使用"rake secret"命令的结果配置了一个环境变量"SECRET_KEY_BASE".如果我启动"heroku config",我可以看到具有正确名称和值的变量.

为什么我仍然会收到此错误?

非常感谢

Dem*_*gus 201

我遇到了同样的问题,我通过创建一个环境变量来解决它,每次登录到生产服务器时都会加载它并制作一个配置它的步骤的迷你指南:

https://gist.github.com/pablosalgadom/4d75f30517edc6230a67

我正在使用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文件,你会发现这样的东西:

# 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. 登录您的服务器

    • 如果以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).

    • 但是,如果您以普通用户身份登录,请将此名称称为"example_user",您需要找到以下其中一个文件:

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

      这些文件按重要性顺序排列,这意味着如果您有第一个文件,则不需要写入其他文件.因此,如果您在目录中找到了这两个文件,~/.bash_profile并且~/.profile您只需要在第一个文件中写入~/.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终端并再次登录到生产服务器时,您将设置此环境变量并准备使用它.

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

免责声明:我不是Linux或Rails大师,所以如果您发现错误或任何错误,我将很乐意解决它!

  • 看来,Rails没有看到环境变量SECRET_KEY_BASE.printenv显示它,如果我检查ENV,rails c production也显示它.但是,当我重新启动Unicorn时,我没有任何效果.现在有效的唯一方法是将其直接粘贴到secrets.yml (9认同)

Eri*_*man 81

我将假设您没有secrets.yml检入源控件(即它在.gitignore文件中).即使这不是你的情况,也是许多观看这个问题的人所做的事情,因为他们的代码暴露在Github上并且不希望他们的密钥浮动.

如果它不在源代码管理中,Heroku不知道它.因此Rails正在寻找Rails.application.secrets.secret_key_base并且尚未设置,因为Rails通过检查secrets.yml不存在的文件来设置它.简单的解决方法是进入您的config/environments/production.rb文件并添加以下行:

Rails.application.configure do
    ...
    config.secret_key_base = ENV["SECRET_KEY_BASE"]
    ...
end
Run Code Online (Sandbox Code Playgroud)

这告诉您的应用程序使用环境变量设置密钥而不是在其中查找secrets.yml.这样可以节省我很多时间来预先了解这一点.

  • 这是最好的答案.除非Rails知道`SECRET_KEY_BASE`存在于`ENV`中,否则`Figaro`和`heroku_secrets`都不会做任何事情.我一直在努力思考,如果配置变量存在于Heroku上,Rails会因为它存在而接受它,但现在看起来很明显Rails需要知道在哪里看.我一直想知道如何在Github上拥有代码,而不必担心秘密密钥基础的东西; 现在我知道了. (14认同)
  • 如果你为你的项目使用github和heroku,似乎是最好的选择. (2认同)

dan*_*des 55

添加config/secrets.yml到版本控制并再次部署.您可能需要删除一行,.gitignore以便您可以提交该文件.

我有这个完全相同的问题,结果发现.gitignore我的Rails应用程序包含的样板Github config/secrets.yml.

  • config/secrets.yml永远不应该在repo中你可以做.yml.sample并用假数据填充它但是为了安全起见,永远不要在repos中使用.yml (137认同)
  • @ user3379926:当我使用`rails new`生成一个新的Rails应用程序时(在这种情况下,生成`rails` gem的版本为`4.2.4`的Gemfile),生成文件`config/secrets.yml` .它包括用于开发和测试环境的预生成密钥,并从环境变量中读取生产环境的密钥:`secret_key_base:<%= ENV ["SECRET_KEY_BASE"]%>`.在我看来,在版本控制中保留这个`secrets.yml`文件是非常安全的,而且确实很有用,只要一个人从未在那里实际定义密钥. (11认同)
  • @ user3379926,在Heroku上的Rails应用程序的上下文中,您无法选择哪些文件包含在版本控制中,哪些文件不包含在版本控制中.Rails 4.1期望秘密配置存在,否则应用程序将无法运行.如果您有办法解决上述问题中提出的问题而不诉诸于在Git中提交secrets.yml文件,请通过提供该建议来帮助改进此主题. (9认同)
  • @danielricecodes您可以在初始化程序中手动设置值.像`Rails.application.config.secret_key_base = ENV ["SECRET_KEY_BASE"]`这样的东西可以工作并删除错误而不向源添加`secrets.yml`. (9认同)
  • 尝试使用ENV (3认同)
  • @jasonleonhard为什么?如果你正在从env vars中读取密钥,那有什么大不了的?没有秘密暴露. (2认同)

小智 12

这对我有用.

SSH进入您的生产服务器并cd进入当前目录,运行bundle exec rake secret或者rake secret,您将获得一个长字符串作为输出,复制该字符串.

现在跑sudo nano /etc/environment.

粘贴到文件的底部

export SECRET_KEY_BASE=rake secret
ruby -e 'p ENV["SECRET_KEY_BASE"]'
Run Code Online (Sandbox Code Playgroud)

rake secret您刚刚复制的字符串在哪里,粘贴复制的字符串代替rake secret.

重启服务器并运行测试echo $SECRET_KEY_BASE.