ruby-on-rails - with - rails 5 heroku deploy




Como resolver o erro “Missing` secret_key_base` para ambiente de 'produção' ”(Rails 4.1) (9)

Eu criei um aplicativo rails (rails 4.1) do zero e estou enfrentando um problema estranho que não consigo resolver.

Toda vez que tento implantar meu aplicativo no Heroku, recebo um erro 500:

Missing secret_key_base para secret_key_base de 'produção', configure este valor em config/secrets.yml

O arquivo secret.yml contém a seguinte configuração:

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

No Heroku eu configurei uma variável de ambiente "SECRET_KEY_BASE" com o resultado do comando "rake secret". Se eu iniciar "heroku config", posso ver a variável com o nome e valor corretos.

Por que ainda estou recebendo esse erro?

Muito obrigado



Adicione config/secrets.yml ao controle de versão e implante novamente. Você pode precisar remover uma linha de .gitignore para poder confirmar o arquivo.

Eu tive exatamente este mesmo problema e acabei descobrindo que o boilerplate .gitignore Github criado para meu aplicativo Rails incluía config/secrets.yml .


Eu criei o config/initializers/secret_key.rb e escrevi apenas a seguinte linha de código:

Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]

Mas eu acho que a solução postada por @Erik Trautman é mais elegante;)

Edit: Ah, e finalmente encontrei este conselho sobre Heroku: documentation :)

Apreciar!


Eu tenho um patch que eu usei em um aplicativo do Rails 4.1 para me deixar continuar usando o gerador de chaves legado (e, portanto, a compatibilidade com sessões anteriores com o Rails 3), permitindo que o secret_key_base fique em branco.

Rails::Application.class_eval do
  # the key_generator will then use ActiveSupport::LegacyKeyGenerator.new(config.secret_token)
  fail "I'm sorry, Dave, there's no :validate_secret_key_config!" unless instance_method(:validate_secret_key_config!)
  def validate_secret_key_config! #:nodoc:
    config.secret_token = secrets.secret_token
    if config.secret_token.blank?
      raise "Missing `secret_token` for '#{Rails.env}' environment, set this value in `config/secrets.yml`"
    end 
  end 
end

Desde então, reformatei o patch e enviei-o para o Rails como um Pedido Pull


Eu tive o mesmo problema e resolvi criando uma variável de ambiente para ser carregada toda vez que eu logasse no servidor de produção e fiz um mini guia dos passos para configurá-lo:

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

Eu estava usando o Rails 4.1 com Unicorn v4.8.2, quando tentei implantar meu aplicativo, ele não foi iniciado corretamente e no arquivo unicorn.log, encontrei esta mensagem de erro:

app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)

Depois de algumas pesquisas eu descobri que o Rails 4.1 mudou a maneira de gerenciar o secret_key, então se você ler o arquivo secrets.yml localizado em exampleRailsProject/config/secrets.yml você encontrará algo assim:

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

Isto significa que o Rails recomenda que você use uma variável de ambiente para o secret_key_base no seu servidor de produção, para resolver este erro você deve seguir estes passos para criar uma variável de ambiente para Linux (no meu caso Ubuntu) no seu servidor de produção:

  1. No terminal do seu servidor de produção, execute o próximo comando:

    $ RAILS_ENV=production rake secret

    Isso retorna uma string grande com letras e números, copie isso (nos referiremos a esse código como GENERATED_CODE).

  2. Entre para o seu servidor

    • Se você logar como usuário root, encontre este arquivo e edite-o:

      $ vi /etc/profile

      Vá para a parte inferior do arquivo ("SHIFT + G" para maiúscula G em VI)

      Escreva sua variável de ambiente com o GENERATED_CODE (pressione a tecla "i" para escrever no VI), certifique-se de estar em uma nova linha no final do arquivo:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      Salve as alterações e feche o arquivo (pressionamos a tecla "ESC" e depois escrevemos ": x" e "ENTER" para salvar e sair em VI).

    • Mas se você logar como usuário normal, vamos chamá-lo de "example_user" para essa essência, você precisará encontrar um desses outros arquivos:

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

      Esses arquivos estão em ordem de importância, o que significa que, se você tiver o primeiro arquivo, não precisará escrever nos outros. Portanto, se você encontrou esses 2 arquivos em seu diretório ~/.bash_profile e ~/.profile você apenas terá que escrever no primeiro ~/.bash_profile , porque o Linux lerá apenas este eo outro será ignorado.

      Em seguida, vamos para o final do arquivo ("SHIFT + G" para a letra G em VI).

      E vamos escrever nossa variável de ambiente com o nosso GENERATED_CODE (pressione a tecla "i" para escrever no VI), certifique-se de estar em uma nova linha no final do arquivo:

      $ export SECRET_KEY_BASE=GENERATED_CODE

      Tendo escrito o código, salve as alterações e feche o arquivo (pressionamos a tecla "ESC" e depois escrevemos ": x" e "ENTER" para salvar e sair no VI).

  3. Você pode verificar se nossa variável de ambiente está configurada corretamente no Linux com este comando:

    $ printenv | grep SECRET_KEY_BASE

    ou com:

    $ echo $SECRET_KEY_BASE

    Quando você executar este comando, se tudo correr bem, ele mostrará o GENERATED_CODE de antes. Finalmente, com toda a configuração feita, você poderá implantar sem problemas seu aplicativo Rails com o Unicorn ou outro.

Quando você fechar o terminal do shell e efetuar login novamente no servidor de produção, você terá essa variável de ambiente configurada e pronta para usá-la.

E é isso!! Espero que este mini-guia ajude você a resolver esse erro.

Disclaimer: Eu não sou um guru do Linux ou Rails, então se você encontrar algo errado ou algum erro, eu ficarei feliz em consertar!


Eu vou assumir que você não tem seu secrets.yml verificado no controle de origem (ou seja, ele está no arquivo .gitignore ). Mesmo que essa não seja a sua situação, é o que muitas outras pessoas vendo essa pergunta fizeram porque têm seu código exposto no Github e não querem que sua chave secreta fique flutuando.

Se não estiver no controle de origem, Heroku não sabe sobre isso. Então o Rails está procurando por Rails.application.secrets.secret_key_base e ele não foi configurado porque o Rails o configura verificando o arquivo secrets.yml que não existe. A solução simples é entrar em seu config/environments/production.rb e adicionar a seguinte linha:

Rails.application.configure do
    ...
    config.secret_key_base = ENV["SECRET_KEY_BASE"]
    ...
end

Isso informa ao seu aplicativo para definir a chave secreta usando a variável de ambiente em vez de procurá-la em secrets.yml . Teria me poupado muito tempo para saber disso na frente.



O que eu fiz: No meu servidor de produção, eu crio um arquivo de configuração (confthin.yml) para Thin (estou usando) e adiciono as seguintes informações:

environment: production
user: www-data
group: www-data
SECRET_KEY_BASE: mysecretkeyproduction

Eu inicio o aplicativo com

thin start -C /whereeveristhefieonprod/configthin.yml

Funciona como um encanto e, em seguida, não há necessidade de ter a chave secreta no controle de versão

Espero que possa ajudar, mas tenho certeza que a mesma coisa poderia ser feita com o Unicorn e outros.








ruby-on-rails-4