J'ai créé une application Rails, en utilisant Rails 4.1, à partir de zéro et je suis confronté à un problème étrange que je ne parviens pas à résoudre.
Chaque fois que j'essaye de déployer mon application sur Heroku, j'obtiens une erreur 500:
Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
Le secret.yml
fichier contient la configuration suivante:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Sur Heroku, j'ai configuré la SECRET_KEY_BASE
variable d'environnement " " avec le résultat de la rake secret
commande. Si je lance heroku config
, je peux voir la variable avec le nom et la valeur corrects.
Pourquoi est-ce que j'obtiens toujours cette erreur?
ruby-on-rails
ruby
heroku
ruby-on-rails-4
Paolo Laurenti
la source
la source
secret.yml
ousecrets.yml
?Réponses:
J'ai eu le même problème et je l'ai résolu en créant une variable d'environnement à charger à chaque fois que je me suis connecté au serveur de production, et j'ai créé un mini-guide des étapes pour le configurer:
J'utilisais Rails 4.1 avec Unicorn v4.8.2 et lorsque j'ai essayé de déployer mon application, cela n'a pas démarré correctement et dans le
unicorn.log
fichier, j'ai trouvé ce message d'erreur:Après quelques recherches, j'ai découvert que Rails 4.1 avait changé la façon de gérer le
secret_key
, donc si vous lisez lesecrets.yml
fichier situé sur,exampleRailsProject/config/secrets.yml
vous trouverez quelque chose comme ceci:Cela signifie que Rails vous recommande d'utiliser une variable d'environnement pour le
secret_key_base
dans votre serveur de production. Afin de résoudre cette erreur, vous devez suivre ces étapes pour créer une variable d'environnement pour Linux (dans mon cas Ubuntu) sur votre serveur de production:Dans le terminal de votre serveur de production, exécutez:
Cela renvoie une grande chaîne avec des lettres et des chiffres. Copiez cela, que nous appellerons ce code
GENERATED_CODE
.Connectez-vous à votre serveur
Si vous vous connectez en tant qu'utilisateur root, recherchez ce fichier et modifiez-le:
Allez au bas du fichier en utilisant Shift+ G(«G» majuscule) dans vi.
Écrivez votre variable d'environnement avec le
GENERATED_CODE
, en appuyant sur ipour insérer dans vi. Assurez-vous d'être dans une nouvelle ligne à la fin du fichier:Enregistrez les modifications et fermez le fichier en utilisant Escet puis "
:x
" et Enterpour enregistrer et quitter dans vi.Mais si vous vous connectez en tant qu'utilisateur normal, appelons-le "
example_user
" pour l'essentiel, vous devrez trouver l'un de ces autres fichiers:Ces fichiers sont classés par ordre d'importance, ce qui signifie que si vous avez le premier fichier, vous n'avez pas besoin de modifier les autres. Si vous avez trouvé ces deux fichiers dans votre répertoire
~/.bash_profile
et que~/.profile
vous n'aurez à écrire que dans le premier~/.bash_profile
, car Linux ne lira que celui-ci et l'autre sera ignoré.Ensuite, nous allons au bas du fichier en utilisant à nouveau Shift+ Get écrivons à nouveau la variable d'environnement avec notre
GENERATED_CODE
utilisation i, et assurez-vous d'ajouter une nouvelle ligne à la fin du fichier:Après avoir écrit le code, enregistrez les modifications et fermez le fichier en utilisant à Escnouveau et "
:x
" et Enterpour enregistrer et quitter.Vous pouvez vérifier que notre variable d'environnement est correctement définie sous Linux avec cette commande:
ou avec:
Lorsque vous exécutez cette commande, si tout s'est bien passé, elle vous montrera le
GENERATED_CODE
précédent. Enfin, une fois la configuration terminée, vous devriez pouvoir déployer sans problème votre application Rails avec Unicorn ou un autre outil.Lorsque vous fermez votre shell et que vous vous connectez à nouveau au serveur de production, cette variable d'environnement est définie et prête à l'utiliser.
Et c'est tout! J'espère que ce mini-guide vous aidera à résoudre cette erreur.
Avertissement: Je ne suis pas un gourou de Linux ou de Rails, donc si vous trouvez quelque chose de mal ou une erreur, je serai heureux de le réparer.
la source
Je vais supposer que vous n'avez pas archivé votre
secrets.yml
contrôle de code source (c'est-à-dire qu'il est dans le.gitignore
fichier). Même si ce n'est pas votre situation, c'est ce que beaucoup d'autres personnes qui consultent cette question ont fait parce qu'elles ont leur code exposé sur Github et ne veulent pas que leur clé secrète flotte.S'il n'est pas sous contrôle de code source, Heroku ne le sait pas. Donc Rails cherche
Rails.application.secrets.secret_key_base
et il n'a pas été défini car Rails le définit en vérifiant lesecrets.yml
fichier qui n'existe pas. La solution de contournement simple consiste à accéder à votreconfig/environments/production.rb
fichier et à ajouter la ligne suivante:Cela indique à votre application de définir la clé secrète à l'aide de la variable d'environnement au lieu de la rechercher dans
secrets.yml
. Cela m'aurait fait gagner beaucoup de temps pour le savoir dès le départ.la source
Figaro
etheroku_secrets
ne faites rien à moins que Rails sache que celaSECRET_KEY_BASE
vitENV
. J'ai eu du mal à penser que si la variable de configuration existait sur Heroku, Rails la ramasserait simplement en raison de son existence, mais maintenant, il semble aveuglément évident que Rails aurait besoin de savoir où chercher. Je me suis demandé comment je pouvais avoir du code sur Github sans avoir à me soucier de la base de clé secrète; maintenant je sais.production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Cela ne signifie pas également que la clé secrète réelle n'est pas exposée. Existe-t-il un risque d'exposer les clés de développement et de test dans les secrets.yml validés s'il ne s'agit que de données de départ et de test?Ajoutez
config/secrets.yml
au contrôle de version et déployez à nouveau. Vous devrez peut-être supprimer une ligne de.gitignore
pour pouvoir valider le fichier.J'ai eu exactement le même problème et il s'est avéré que le passe-partout
.gitignore
créé par Github pour mon application Rails était inclusconfig/secrets.yml
.la source
Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]
cela fonctionnerait et supprimerait l'erreur sans ajoutersecrets.yml
à la source.rails new
(produisant, dans ce cas, un Gemfile dont lerails
gem a la version4.2.4
), le fichierconfig/secrets.yml
est généré. Il comprend des clés secrètes prégénérés pour les environnements de développement et de test, et lit le SecretKey pour l'environnement de production d'une variable d'environnement:secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Il me semble qu'il est parfaitement sûr, et en effet utile, de conserver cesecrets.yml
fichier en contrôle de version, à condition que l'on n'y définisse jamais réellement la clé secrète.Cela a fonctionné pour moi.
SSH dans votre serveur de production et
cd
dans votre répertoire actuel, exécutezbundle exec rake secret
ourake secret
, vous obtiendrez une longue chaîne en sortie, copiez cette chaîne.Maintenant, cours
sudo nano /etc/environment
.Coller au bas du fichier
Où
rake secret
trouve la chaîne que vous venez de copier, collez cette chaîne copiée à la place derake secret
.Redémarrez le serveur et testez en exécutant
echo $SECRET_KEY_BASE
.la source
Bien que vous puissiez utiliser des initialiseurs comme les autres réponses, la méthode conventionnelle de Rails 4.1+ consiste à utiliser le
config/secrets.yml
. La raison pour laquelle l'équipe Rails d'introduire cela dépasse le cadre de cette réponse, mais le TL; DR est que celasecret_token.rb
confond la configuration et le code ainsi qu'un risque de sécurité puisque le jeton est archivé dans l'historique de contrôle de source et le seul système qui doit sachez que le jeton secret de production est l'infrastructure de production.Vous devriez ajouter ce fichier à
.gitignore
peu près comme vous n'ajouteriez pas non plusconfig/database.yml
au contrôle de code source.En référençant le propre code de Heroku pour la configuration à
config/database.yml
partirDATABASE_URL
de leur Buildpack pour Ruby , j'ai fini par forger leur dépôt et je l'ai modifié pour créer àconfig/secrets.yml
partir deSECRETS_KEY_BASE
la variable d'environnement.Depuis que cette fonctionnalité a été introduite dans Rails 4.1, j'ai pensé qu'il était approprié de modifier
./lib/language_pack/rails41.rb
et d'ajouter cette fonctionnalité.Ce qui suit est l' extrait du buildpack modifié que j'ai créé dans mon entreprise:
Vous pouvez bien sûr étendre ce code pour ajouter d'autres secrets (par exemple des clés API tierces, etc.) à lire dans votre variable d'environnement:
De cette façon, vous pouvez accéder à ce secret de manière très standard:
Avant de redéployer votre application, assurez-vous de définir d'abord votre variable d'environnement:
Ajoutez ensuite votre buildpack modifié (ou vous êtes plus que bienvenu pour créer un lien vers le mien) à votre application Heroku (voir la documentation de Heroku ) et redéployez votre application.
Le buildpack créera automatiquement votre
config/secrets.yml
variable d'environnement à partir de votre variable d'environnement dans le cadre du processus de construction dyno chaque fois que vous vousgit push
rendrez à Heroku.EDIT: La propre documentation de Heroku suggère de créer
config/secrets.yml
pour lire à partir de la variable d'environnement, mais cela implique que vous devez archiver ce fichier dans le contrôle de code source. Dans mon cas, cela ne fonctionne pas bien car j'ai des secrets codés en dur pour les environnements de développement et de test que je préfère ne pas enregistrer.la source
Vous pouvez exporter les clés secrètes en tant que variables d'environnement sur le
~/.bashrc
ou~/.bash_profile
de votre serveur:Et puis, vous pouvez vous procurer votre
.bashrc
ou.bash_profile
:Ne confiez jamais vos secrets.yml
la source
Dans mon cas, le problème était que ce
config/master.key
n'était pas dans le contrôle de version, et j'avais créé le projet sur un autre ordinateur.Le .gitignore par défaut créé par Rails exclut ce fichier. Comme il est impossible de déployer sans avoir ce fichier, il doit être en contrôle de version, afin de pouvoir être déployé à partir de l'ordinateur de n'importe quel membre de l'équipe.
Solution: supprimez la
config/master.key
ligne de.gitignore
, validez le fichier de l'ordinateur sur lequel le projet a été créé, et maintenant vous pouvezgit pull
sur l'autre ordinateur et déployer à partir de celui-ci.Les gens disent de ne pas confier certains de ces fichiers au contrôle de version, sans offrir une solution alternative. Tant que vous ne travaillez pas sur un projet open source, je ne vois aucune raison de ne pas valider tout ce qui est nécessaire pour exécuter le projet, y compris les informations d'identification.
la source
secrets.yml
fichier, qui a été obsolète pour les dernières versions de Rails. Cette question Stack Overflow elle-même a une tonne de réponses, et ils utilisent presque tous cette ancienne API.Pour rails6, j'étais confronté au même problème, car il me manquait les fichiers suivants, une fois que je les ai ajoutés, le problème est résolu:
Assurez-vous d'avoir ces fichiers. !!!
la source
Ce que j'ai fait: Sur mon serveur de production, je crée un fichier de configuration (confthin.yml) pour Thin (je l'utilise) et j'ajoute les informations suivantes:
Je lance ensuite l'application avec
Travaillez comme un charme et alors pas besoin d'avoir la clé secrète sur le contrôle de version
J'espère que cela pourrait aider, mais je suis sûr que la même chose pourrait être faite avec Unicorn et d'autres.
la source
J'ai un correctif que j'ai utilisé dans une application Rails 4.1 pour me permettre de continuer à utiliser le générateur de clés hérité (et donc la compatibilité de session en amont avec Rails 3), en permettant à secret_key_base d'être vide.
J'ai depuis reformaté le correctif et je l'ai soumis à Rails en tant que demande de tirage
la source
J'ai créé le
config/initializers/secret_key.rb
fichier et je n'ai écrit que la ligne de code suivante:Mais je pense que la solution postée par @Erik Trautman est plus élégante;)
Edit: Oh, et enfin j'ai trouvé ce conseil sur Heroku: https://devcenter.heroku.com/changelog-items/426 :)
Prendre plaisir!
la source
cela fonctionne bien https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 pour l'utilisateur root doit modifier
mais si vous n'êtes pas root, mettez le code de génération dans ce qui suit
la source
Sur Nginx / Passenger / Ruby (2.4) / Rails (5.1.1), rien d'autre ne fonctionnait sauf:
passenger_env_var
dans/etc/nginx/sites-available/default
le bloc serveur.Source: https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var
la source
La réponse Demi Magus a fonctionné pour moi jusqu'à Rails 5.
Sur Apache2 / Passenger / Ruby (2.4) / Rails (5.1.6), j'ai dû mettre
à partir de la réponse Demi Magus dans / etc / apache2 / envvars, car / etc / profile semble être ignoré.
Source: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
la source
J'ai eu le même problème après avoir utilisé le fichier .gitignore de https://github.com/github/gitignore/blob/master/Rails.gitignore
Tout s'est bien passé après avoir commenté les lignes suivantes dans le fichier .gitignore.
la source