Criei um aplicativo Rails, usando o Rails 4.1, do zero e estou enfrentando um problema estranho que não consigo resolver.
Sempre que tento implantar meu aplicativo no Heroku, recebo um erro 500:
Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
O secret.yml
arquivo contém a seguinte configuração:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
No Heroku, configurei a SECRET_KEY_BASE
variável de ambiente " " com o resultado do rake secret
comando. Se eu iniciar heroku config
, posso ver a variável com o nome e o valor corretos.
Por que ainda estou recebendo esse erro?
ruby-on-rails
ruby
heroku
ruby-on-rails-4
Paolo Laurenti
fonte
fonte
secret.yml
ousecrets.yml
?Respostas:
Eu tive o mesmo problema e o resolvi criando uma variável de ambiente a ser carregada toda vez que eu fazia login no servidor de produção e fazia um mini-guia das etapas para configurá-lo:
Eu estava usando o Rails 4.1 com Unicorn v4.8.2 e quando tentei implantar meu aplicativo, ele não foi iniciado corretamente e no
unicorn.log
arquivo encontrei esta mensagem de erro:Após algumas pesquisas, descobri que o Rails 4.1 mudou a maneira de gerenciar o
secret_key
, portanto, se você ler osecrets.yml
arquivo localizado em,exampleRailsProject/config/secrets.yml
encontrará algo parecido com isto:Isso significa que o Rails recomenda o uso de uma variável de ambiente
secret_key_base
no servidor de produção. Para resolver esse erro, você deve seguir estas etapas para criar uma variável de ambiente para Linux (no meu caso, Ubuntu) em seu servidor de produção:No terminal do seu servidor de produção, execute:
Isso retorna uma string grande com letras e números. Copie isso, ao qual nos referiremos a esse código como
GENERATED_CODE
.Entre no seu servidor
Se você fizer login como usuário root, encontre este arquivo e edite-o:
Vá para a parte inferior do arquivo usando Shift+G (capital "G") no vi.
Escreva sua variável de ambiente com
GENERATED_CODE
, pressionando ipara inserir no vi. Certifique-se de estar em uma nova linha no final do arquivo:Salve as alterações e feche o arquivo usando Esce "
:x
" e Enterpara salvar e sair no vi.Mas se você logar como usuário normal, vamos chamá-lo "
example_user
" para esta essência, você precisará encontrar um desses outros arquivos:Esses arquivos estão em ordem de importância, o que significa que, se você tiver o primeiro arquivo, não precisará editar os outros. Se você encontrou esses dois arquivos em seu diretório
~/.bash_profile
e~/.profile
só precisará escrever no primeiro~/.bash_profile
, porque o Linux lerá apenas este e o outro será ignorado.Em seguida, vamos para a parte inferior do arquivo usando Shift+ Gnovamente e escrevemos a variável de ambiente
GENERATED_CODE
usando inovamente, e certifique-se de adicionar uma nova linha no final do arquivo:Após escrever o código, salve as alterações e feche o arquivo usando Esc"
:x
" novamente e Enterpara salvar e sair.Você pode verificar se nossa variável de ambiente está configurada corretamente no Linux com este comando:
ou com:
Quando você executa este comando, se tudo der certo, ele mostrará o que foi mostrado
GENERATED_CODE
antes. Finalmente, com toda a configuração concluída, você poderá implantar, sem problemas, seu aplicativo Rails com o Unicorn ou alguma outra ferramenta.Ao fechar seu 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 o ajude a resolver esse erro.
Isenção de responsabilidade: Eu não sou um guru do Linux ou Rails, portanto, se você encontrar algo errado ou algum erro, terei o maior prazer em corrigi-lo.
fonte
Eu vou assumir que você não tem seu
secrets.yml
check-in no controle de origem (ou seja, está no.gitignore
arquivo). Mesmo que essa não seja a sua situação, é o que muitas outras pessoas que visualizam essa pergunta fizeram porque têm o código exposto no Github e não querem que sua chave secreta flutue.Se não estiver no controle de origem, o Heroku não sabe disso. Portanto, o Rails está procurando
Rails.application.secrets.secret_key_base
e não foi definido porque o Rails o define verificando osecrets.yml
arquivo que não existe. A solução simples é entrar no seuconfig/environments/production.rb
arquivo e adicionar a seguinte linha:Isso diz ao seu aplicativo para definir a chave secreta usando a variável de ambiente em vez de procurá-la
secrets.yml
. Teria me poupado muito tempo para saber disso com antecedência.fonte
Figaro
eheroku_secrets
não faça nada a menos que o Rails saiba queSECRET_KEY_BASE
viveENV
. Eu tenho lutado com esse pensamento de que, se a var de configuração existisse no Heroku, o Rails iria buscá-lo apenas em virtude de existir, mas agora parece óbvio que o Rails precisaria saber para onde procurar. Fiquei me perguntando como posso ter código no Github sem ter que me preocupar com a coisa básica da chave secreta; agora eu sei.production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
? Isso também não significa que a chave secreta real não está exposta. Existe risco de expor as chaves de desenvolvimento e teste em segredos comprometidos.yml se forem apenas dados de semente e teste?Adicione
config/secrets.yml
ao controle de versão e implante novamente. Pode ser necessário remover uma linha de.gitignore
para poder confirmar o arquivo.Eu tive exatamente o mesmo problema e acabou que o clichê
.gitignore
criado pelo Github para o meu aplicativo Rails foi incluídoconfig/secrets.yml
.fonte
Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]
iria funcionar e remover o erro sem adicionarsecrets.yml
à fonte.rails new
(produzindo, neste caso, um Gemfile cujarails
gema possui a versão4.2.4
), o arquivoconfig/secrets.yml
é gerado. Ele inclui pregenerated chaves secretas para os ambientes de desenvolvimento e teste, e lê o secretkey para o ambiente de produção a partir de uma variável de ambiente:secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Parece-me que é perfeitamente seguro, e de fato útil, manter essesecrets.yml
arquivo no controle de versão, desde que nunca se defina a chave secreta.Isso funcionou para mim.
SSH no servidor de produção e
cd
no diretório atual, executebundle exec rake secret
ourake secret
, você obterá uma sequência longa como saída, copie essa sequência.Agora corra
sudo nano /etc/environment
.Cole na parte inferior do arquivo
Onde
rake secret
está a sequência que você acabou de copiar, cole essa sequência no lugar derake secret
.Reinicie o servidor e teste executando
echo $SECRET_KEY_BASE
.fonte
Embora você possa usar inicializadores como as outras respostas, a maneira convencional do Rails 4.1+ é usar o
config/secrets.yml
. A razão para a equipe do Rails introduzir isso está além do escopo desta resposta, mas o TL; DR é quesecret_token.rb
confunde configuração e código, além de ser um risco à segurança, pois o token é verificado no histórico de controle de origem e o único sistema que precisa ser implementado. conhecer o token secreto de produção é a infraestrutura de produção.Você deve adicionar esse arquivo da
.gitignore
mesma forma que não adicionariaconfig/database.yml
ao controle de origem.Referenciando próprio código de Heroku para configurar
config/database.yml
a partirDATABASE_URL
em sua Buildpack para Ruby , acabei bifurcação sua repo e modificado para criarconfig/secrets.yml
a partir deSECRETS_KEY_BASE
variável de ambiente.Desde que esse recurso foi introduzido no Rails 4.1, achei apropriado editar
./lib/language_pack/rails41.rb
e adicionar essa funcionalidade.A seguir, o snippet do buildpack modificado que criei na minha empresa:
Obviamente, você pode estender esse código para adicionar outros segredos (por exemplo, chaves de API de terceiros, etc.) para serem lidos em sua variável de ambiente:
Dessa forma, você pode acessar esse segredo de uma maneira muito padrão:
Antes de reimplementar seu aplicativo, defina sua variável de ambiente primeiro:
Em seguida, adicione seu pacote de compilação modificado (ou você poderá adicionar um link ao meu) no seu aplicativo Heroku (consulte a documentação do Heroku ) e reimplemente seu aplicativo.
O buildpack criará automaticamente sua
config/secrets.yml
variável de ambiente como parte do processo de construção do dyno toda vez que vocêgit push
acessar o Heroku.EDIT: A própria documentação do Heroku sugere criar
config/secrets.yml
para ler a variável de ambiente, mas isso implica que você deve verificar esse arquivo no controle de origem. No meu caso, isso não funciona bem, pois tenho segredos codificados para ambientes de desenvolvimento e teste que prefiro não fazer check-in.fonte
Você pode exportar as chaves secretas para como variáveis de ambiente no
~/.bashrc
ou~/.bash_profile
do seu servidor:E então, você pode obter seu
.bashrc
ou.bash_profile
:Nunca cometa seus segredos.yml
fonte
No meu caso, o problema era que
config/master.key
não estava no controle de versão e eu havia criado o projeto em um computador diferente.O .gitignore padrão que o Rails cria exclui esse arquivo. Como é impossível implantar sem ter esse arquivo, ele precisa estar no controle de versão para poder implantar no computador de qualquer membro da equipe.
Solução: remova a
config/master.key
linha.gitignore
, confirme o arquivo no computador em que o projeto foi criado e agora você podegit pull
no outro computador e implantar a partir dele.As pessoas estão dizendo para não confirmar alguns desses arquivos no controle de versão, sem oferecer uma solução alternativa. Desde que você não esteja trabalhando em um projeto de código aberto, não vejo razão para não comprometer tudo o que é necessário para executar o projeto, incluindo credenciais.
fonte
secrets.yml
arquivo antigo , que foi preterida nas últimas versões do Rails. Essa questão do Stack Overflow em si tem muitas respostas, e quase todas elas usam essa API antiga.Para o rails6, eu estava enfrentando o mesmo problema, pois estava faltando os seguintes arquivos, depois que os adicionei, o problema foi resolvido:
Verifique se você possui esses arquivos. !!!
fonte
O que fiz: No meu servidor de produção, crio um arquivo de configuração (confthin.yml) para o Thin (estou usando-o) e adiciono as seguintes informações:
Em seguida, inicio o aplicativo com
Funciona como um encanto e não precisa ter a chave secreta no controle de versão
Espero que ajude, mas tenho certeza de que o mesmo pode ser feito com o Unicorn e outros.
fonte
Eu tenho um patch que usei em um aplicativo Rails 4.1 para permitir que eu continue usando o gerador de chaves herdado (e, portanto, a compatibilidade de sessões com o Rails 3), permitindo que a secret_key_base fique em branco.
Desde que reformatei o patch, o enviei ao Rails como uma solicitação de recebimento
fonte
Eu criei o
config/initializers/secret_key.rb
arquivo e escrevi apenas a seguinte linha de código:Mas acho que essa solução postada por @Erik Trautman é mais elegante;)
Edit: Ah, e finalmente encontrei este conselho no Heroku: https://devcenter.heroku.com/changelog-items/426 :)
Aproveitar!
fonte
isso funciona bem https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 para o usuário root deve editar
mas se você não é root, deve colocar o código de geração no seguinte
fonte
No Nginx / Passenger / Ruby (2.4) / Rails (5.1.1), nada mais funcionou, exceto:
passenger_env_var
no/etc/nginx/sites-available/default
bloco do servidor.Fonte: https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var
fonte
A resposta Demi Magus funcionou para mim até o Rails 5.
No Apache2 / Passenger / Ruby (2.4) / Rails (5.1.6), eu tive que colocar
da resposta do Demi Magus em / etc / apache2 / envvars, a causa / etc / profile parece ser ignorada.
Fonte: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
fonte
Eu tive o mesmo problema depois de usar o arquivo .gitignore em https://github.com/github/gitignore/blob/master/Rails.gitignore
Tudo deu certo depois que comentei as seguintes linhas no arquivo .gitignore.
fonte