简体   繁体   English

在rails生产中缺少secret_key_base

[英]Missing secret_key_base in rails production

I don't understand why my secret_key_base is not found. 我不明白为什么找不到我的secret_key_base。 When I start my app in production I get this message on web browser : Missing 'secret_key_base' for 'production' environment, set this value in 'config/secrets.yml' 当我在生产中启动我的应用程序时,我在Web浏览器上收到此消息: Missing 'secret_key_base' for 'production' environment, set this value in 'config/secrets.yml'

My config/secret.yml looks like this : 我的config/secret.yml看起来像这样:

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

When I replace <%= ENV["SECRET_KEY_BASE"] %> with the key generated it works, otherwise, it is not recommended... 当我用生成的密钥替换<%= ENV["SECRET_KEY_BASE"] %> ,它会起作用,否则,不推荐...

So I put my key in /etc/profile & ~/.bashrc & ~/.rvm/environment/ruby-2.1.5 as follow : 所以我将我的密钥放在/etc/profile~/.bashrc~/.rvm/environment/ruby-2.1.5 ,如下所示:

export SECRET_KEY_BASE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

When I start a rails console in production mode I can see my key : 当我在生产模式下启动rails控制台时,我可以看到我的密钥:

rails c production
Loading production environment (Rails 4.1.6)
2.1.5 :001 > ENV["SECRET_KEY_BASE"]
 => "XXXXXXXXXXXXXXXXXXXXX"

I don't get why it is not working knowing all of that. 我不知道为什么它不知道所有这一切。 Am I missing something obvious ? 我错过了一些明显的东西吗


Complete error log : 完整的错误日志:

ERROR RuntimeError: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
        /home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb:462:in `validate_secret_key_config!'
        /home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb:195:in `env_config'
        /home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/engine.rb:510:in `call'
        /home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb:144:in `call'
        /home/xxx/.rvm/gems/ruby-2.1.5/gems/rack-1.5.2/lib/rack/lock.rb:17:in `call'
        /home/xxx/.rvm/gems/ruby-2.1.5/gems/rack-1.5.2/lib/rack/content_length.rb:14:in `call'
        /home/xxx/.rvm/gems/ruby-2.1.5/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:in `service'
        /home/xxx/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service'
        /home/xxx/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run'
        /home/xxx/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread'

EDIT 1 : 编辑1:

I took a look at ~/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb and I did some debug trace using puts . 我看了~/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb ,我使用puts做了一些调试跟踪。 It looks like my ENV variable is nil for Ruby in this file but also in config/secret.yml when the file is parsed. 看起来我的ENV变量在此文件中对于Ruby是nil ,在解析文件时也在config/secret.yml

Here are the log I put on the file during the parsing process : 以下是我在解析过程中放在文件中的日志:

secrets = ActiveSupport::OrderedOptions.new
yaml = config.paths["config/secrets"].first
if File.exist?(yaml)
  puts "FILE EXIST !"
  puts ENV["SECRET_KEY_BASE"]
  require "erb"
  all_secrets = YAML.load(ERB.new(IO.read(yaml)).result) || {}
  puts all_secrets.inspect
  env_secrets = all_secrets[Rails.env]
  puts env_secrets.inspect
  secrets.merge!(env_secrets.symbolize_keys) if env_secrets
  puts secrets.inspect
end

And here is the result when I start my server using rvmsudo rails s -e "production" -p 80 这是我使用rvmsudo rails s -e“production”-p 80启动服务器时的结果

FILE EXIST !
                <-------------- (nil)
{"development"=>{"secret_key_base"=>"OK"}, "test"=>{"secret_key_base"=>"OK"}, "production"=>{"secret_key_base"=>nil}}
{"secret_key_base"=>nil}
{:secret_key_base=>nil}

It looks like rvmsudo doesn't pass env variable, I will take a look at it... 看起来rvmsudo没有传递env变量,我会看看它...

My supposition on EDIT #1 was true. 我对编辑#1的假设是正确的。 The issue was that rvmsudo pass environment variables under somes conditions that can be found on the grep command here : 问题是rvmsudo在某些条件下传递环境变量,这些条件可以在grep命令中找到:

https://github.com/rvm/rvm/blob/dff3eeac883ce6314c021f3d00730bcd5a628e3e/binscripts/rvmsudo#L46 https://github.com/rvm/rvm/blob/dff3eeac883ce6314c021f3d00730bcd5a628e3e/binscripts/rvmsudo#L46

So I change my environment variable name to : http_SECRET_KEY_BASE to try and it worked ! 所以我将我的环境变量名称更改为: http_SECRET_KEY_BASE尝试并且它有效!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Rails在生产中缺少SECRET_KEY_BASE - Rails missing SECRET_KEY_BASE in production rails 中缺少生产 secret_key_base - Missing production secret_key_base in rails Rails,在使用unicorn和nginx的Ubuntu上缺少“生产”的“ secret_key_base” - Rails, Missing `secret_key_base` for 'production' on Ubuntu with unicorn and nginx ruby on rails:heroku:“生产”环境缺少“secret_key_base” - ruby on rails: heroku: Missing `secret_key_base` for 'production' environment Rails:如何修复“生产环境中缺少 secret_key_base” - Rails: How to fix “Missing secret_key_base for 'production' environment” SECRET_KEY_BASE 缺少生产错误 - SECRET_KEY_BASE missing error on production 缺少&#39;secret_token`和`secret_key_base`用于&#39;生产&#39;环境 - Missing `secret_token` and `secret_key_base` for 'production' environment Ubuntu 18.04 服务器(Rails 6.0)上的“生产”环境缺少“secret_key_base”,尝试了多个主题 - Missing `secret_key_base` for 'production' environment on Ubuntu 18.04 server (Rails 6.0), multiple topics tried 如何解决错误“‘生产’环境缺少‘secret_key_base’”(Rails 4.1) - How to solve error “Missing `secret_key_base` for 'production' environment” (Rails 4.1) “缺少&#39;secret_key_base`为&#39;生产&#39;环境”Heroku上的错误 - “Missing `secret_key_base` for 'production' environment” error on Heroku
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM