【问题标题】:Missing `secret_key_base` for 'production' environment, set this value in config/secrets.yml on Ubuntu Server“生产”环境缺少“secret_key_base”,请在 Ubuntu 服务器上的 config/secrets.yml 中设置此值
【发布时间】:2018-05-30 11:34:11
【问题描述】:

所以在 Ubuntu 服务器上,我在日志中得到了这个:

#<RuntimeError: Missing `secret_key_base` for 'production' 
       environment, set this value in `config/secrets.yml`>
      /home/deploy/apps/project/shared/bundle/ruby/2.4.0/gems/railties-5.1.4/lib/rails/application.rb:510:in `validate_secret_key_config!'
      /home/deploy/apps/project/shared/bundle/ruby/2.4.0/gems/railties-5.1.4/lib/rails/application.rb:247:in `env_config'```

我的浏览器:

An unhandled lowlevel error occurred. The application logs may have details.

我的 secrets.yml(在 deploy/apps/project/current/config 和 deploy/apps/project/shared/config 中):

production:
      secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

部署.rb

...
namespace :deploy do
    desc 'Rails Secrets'
    task :secret do
      on roles(:app) do
        execute "export SECRET_KEY_BASE=`bundle exec rake secret`"
      end
    end
    before :finishing,  :secret
    ...
end

我也尝试在/etc/profile 中手动添加SECRET_KEY_BASE。当我输入这个命令时它存在:printenv(因为我手动添加了它),但是当注销root时它不再存在于printenv中。

printenv 命令中不存在 ENV 变量。在我进行部署后 (cap production deploy:initial)。

如何解决此错误?

【问题讨论】:

  • 您是否已将其添加到/etc/profile 作为root 用户?如果不是,您必须将export SECRET_KEY_BASE=&lt;YOUR_SUPER_SECRET&gt; 添加到您的~/.bash_profile(或您使用的任何配置文件)。也许这个要点会对你有所帮助 - gist.github.com/pablosalgadom/4d75f30517edc6230a67 .

标签: ruby-on-rails digital-ocean ubuntu-server rvm-capistrano


【解决方案1】:

您登录的用户似乎与您用于添加密钥库的用户不同。您以 root 身份登录,但我认为您没有使用root 部署或启动服务器,对吧?

如果您正在与名为deploy 的用户一起部署,那么您应该以deploy 身份登录并将环境变量添加到部署的上下文中(例如~/.bashrc)。我不能 100% 确定 /etc/profile 会在这里工作。另外,记得在添加 var 后重启 rails 服务器

【讨论】:

  • 我认为你是对的 - shell 不是交互式的,所以只有 .bashrc 被选中。 Here's a concise blog post 提供更多信息。另请注意,have a dedicated user run the application. 始终是一个好习惯
  • @luiz-e 这就是重启服务器的方式(sudo systemctl restart unicorn),对吧?
  • @luize-e 如果是这样,我的日志中仍然出现同样的错误,即使我已将以下内容添加到 ~/.bashrcexport SECRET_KEY_BASE=&lt;key&gt;
  • 再次,您是否检查了root 和您的deploy 用户? capistrano 使用哪个用户进行部署?
  • @luiz-e 我用deploy用户。
【解决方案2】:

如何解决此错误?

我注意到的第一件事是

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

我怀疑您不需要 ERB 模板调用。

secret_key_base: ENV["SECRET_KEY_BASE"]

在 printenv 命令中不存在 ENV 变量。在我进行部署之后

其次,我想知道你的链中是否有一个新的外壳。如果是这样,那么 shell 集变量将不可用,因为新的分叉 shell 自然没有它。所以,唯一的办法就是把东西设置在例如。 $HOME/.profile 或你的 shell profile

第三,我会选择使用某种辅助 gem 来处理这个问题。有一些例如。 Figaro,这是一篇简单的文章,向您展示how to use it

我也尝试在 /etc/profile 中手动添加 SECRET_KEY_BASE

/etc/profile 添加内容是个坏主意。它用于在用户 shell 上设置系统范围的环境变量。你想要的大概是$HOME/.profile

退出root时

我强烈建议不要在root 下运行东西,因为它破坏了整个 GNU/Linux 安全设置。如果您必须假装以root 运行事物,请使用带有例如的普通用户帐户。 fakeroot.

执行“导出 SECRET_KEY_BASE=bundle exec rake secret

以这种方式处理机密有点笨拙,既不安全也不方便。 可以说目前的黄金标准是Hashicorp's Vault,它也有一个不错的Rails adapter

这种系统在设计时特别考虑了安全性。对你目前的情况来说可能有点矫枉过正,但我​​认为值得一提。

祝你好运,希望这篇文章对你有帮助!

【讨论】:

  • 我尝试了这个解决方案但无济于事:secret_key_base: ENV["SECRET_KEY_BASE"]
  • 是的,您设置的环境变量“在翻译中丢失”,因为在执行上下文中的某处分叉了一个新的 shell。
猜你喜欢
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2019-12-08
  • 2017-05-03
  • 2014-06-23
  • 2016-11-05
相关资源
最近更新 更多