Creé una aplicación Rails, usando Rails 4.1, desde cero y me enfrento a un extraño problema que no puedo resolver.
Cada vez que intento implementar mi aplicación en Heroku me sale un error 500:
Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
El secret.yml
archivo contiene la siguiente configuración:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
En Heroku configuré la " SECRET_KEY_BASE
" variable de entorno con el resultado del rake secret
comando. Si inicio heroku config
, puedo ver la variable con el nombre y el valor correctos.
¿Por qué sigo recibiendo este error?
ruby-on-rails
ruby
heroku
ruby-on-rails-4
Paolo Laurenti
fuente
fuente
secret.yml
osecrets.yml
?Respuestas:
Tuve el mismo problema y lo resolví creando una variable de entorno para cargar cada vez que iniciaba sesión en el servidor de producción, e hice una mini guía de los pasos para configurarlo:
Estaba usando Rails 4.1 con Unicorn v4.8.2 y cuando intenté implementar mi aplicación no se inició correctamente y en el
unicorn.log
archivo encontré este mensaje de error:Después de investigar un poco, descubrí que Rails 4.1 cambió la forma de administrar
secret_key
elsecrets.yml
archivo , así que si lees el archivo ubicado enexampleRailsProject/config/secrets.yml
este, encontrarás algo como esto:Esto significa que Rails le recomienda utilizar una variable de entorno para
secret_key_base
en su servidor de producción. Para resolver este error, debe seguir estos pasos para crear una variable de entorno para Linux (en mi caso Ubuntu) en su servidor de producción:En la terminal de su servidor de producción ejecute:
Esto devuelve una cadena grande con letras y números. Copie eso, al que nos referiremos como código
GENERATED_CODE
.Inicie sesión en su servidor
Si inicia sesión como usuario root, busque este archivo y edítelo:
Vaya al final del archivo usando Shift+ G("G" mayúscula) en vi.
Escriba su variable de entorno con
GENERATED_CODE
, presionando ipara insertar en vi. Asegúrese de estar en una nueva línea al final del archivo:Guarde los cambios y cierre el archivo usando Escy luego "
:x
" y Enterpara guardar y salir en vi.Pero si inicia sesión como usuario normal, llamémoslo "
example_user
" por esta esencia, necesitará encontrar uno de estos otros archivos:Estos archivos están en orden de importancia, lo que significa que si tiene el primer archivo, entonces no necesitaría editar los otros. Si encontró estos dos archivos en su directorio
~/.bash_profile
y~/.profile
solo tendrá que escribir en el primero~/.bash_profile
, porque Linux leerá solo este y el otro será ignorado.Luego vamos al final del archivo usando Shift+ Gnuevamente y escribimos la variable de entorno con nuestro
GENERATED_CODE
uso inuevamente, y asegúrese de agregar una nueva línea al final del archivo:Después de escribir el código, guarde los cambios y cierre el archivo usando Esc"
:x
" nuevamente y Enterpara guardar y salir.Puede verificar que nuestra variable de entorno esté configurada correctamente en Linux con este comando:
o con:
Cuando ejecutas este comando, si todo salió bien, te mostrará el
GENERATED_CODE
de antes. Finalmente, con toda la configuración realizada, debería poder implementar sin problemas su aplicación Rails con Unicorn u otra herramienta.Cuando cierre su shell e inicie sesión nuevamente en el servidor de producción, tendrá esta variable de entorno configurada y lista para usarla.
¡Y eso es! Espero que esta mini-guía te ayude a resolver este error.
Descargo de responsabilidad: no soy un gurú de Linux o Rails, por lo que si encuentra algo mal o algún error, me complacerá solucionarlo.
fuente
Asumiré que no ha
secrets.yml
verificado su control de origen (es decir, está en el.gitignore
archivo). Incluso si esta no es su situación, es lo que muchas otras personas que vieron esta pregunta han hecho porque tienen su código expuesto en Github y no quieren que su clave secreta flote.Si no está en el control de la fuente, Heroku no lo sabe. Así que Rails está buscando
Rails.application.secrets.secret_key_base
y no se ha configurado porque Rails lo configura al verificar elsecrets.yml
archivo que no existe. La solución simple es ir a suconfig/environments/production.rb
archivo y agregar la siguiente línea:Esto le dice a su aplicación que establezca la clave secreta utilizando la variable de entorno en lugar de buscarla
secrets.yml
. Me habría ahorrado mucho tiempo saber esto por adelantado.fuente
Figaro
yheroku_secrets
no hagas nada a menos que Rails sepa queSECRET_KEY_BASE
vive allíENV
. He estado luchando con esto pensando que si la var de configuración existiera en Heroku, Rails la recogería solo en virtud de su existencia, pero ahora parece cegadoramente obvio que Rails necesitaría saber dónde buscar. Me he estado preguntando cómo puedo tener código en Github sin tener que preocuparme por la base secreta; ahora sé.production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
? ¿No significa eso también que la clave secreta real no está expuesta? ¿Existe el riesgo de exponer claves de desarrollo y prueba en secrets.yml comprometidos si todo es solo semilla y datos de prueba?Agregar
config/secrets.yml
al control de versiones e implementar nuevamente. Es posible que deba eliminar una línea.gitignore
para poder confirmar el archivo.Tuve exactamente el mismo problema y resultó que
.gitignore
incluía el repetitivo que Github creó para mi aplicación Railsconfig/secrets.yml
.fuente
Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]
funcionaría y eliminaría el error sin agregarlosecrets.yml
a la fuente.rails new
(produciendo, en este caso, un Gemfile cuyarails
gema tiene la versión4.2.4
),config/secrets.yml
se genera el archivo . Incluye pregenerated claves secretas para los entornos de desarrollo y pruebas, y lee el secretkey para el entorno de producción de una variable de entorno:secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Me parece que es perfectamente seguro, y de hecho útil, mantener estesecrets.yml
archivo en control de versiones, siempre que uno nunca defina la clave secreta allí.Esto funcionó para mí.
SSH en su servidor de producción y
cd
en su directorio actual, ejecutebundle exec rake secret
orake secret
, obtendrá una cadena larga como salida, copie esa cadena.Ahora corre
sudo nano /etc/environment
.Pegar al final del archivo
¿Dónde
rake secret
está la cadena que acaba de copiar? Pegue esa cadena copiada en lugar derake secret
.Reinicie el servidor y pruebe ejecutando
echo $SECRET_KEY_BASE
.fuente
Si bien puede usar inicializadores como las otras respuestas, la forma convencional de Rails 4.1+ es usar el
config/secrets.yml
. La razón para que el equipo de Rails presente esto está más allá del alcance de esta respuesta, pero el TL; DR es quesecret_token.rb
combina la configuración y el código, además de ser un riesgo de seguridad, ya que el token se registra en el historial de control de fuente y el único sistema que necesita Conocer el token secreto de producción es la infraestructura de producción.Debería agregar este archivo
.gitignore
como tampoco lo haríaconfig/database.yml
con el control de origen.Haciendo referencia al propio código de Heroku para configurar
config/database.yml
desdeDATABASE_URL
su Buildpack para Ruby , terminé bifurcando su repositorio y lo modifiqué para crearconfig/secrets.yml
desdeSECRETS_KEY_BASE
la variable de entorno.Dado que esta característica se introdujo en Rails 4.1, sentí que era apropiado editar
./lib/language_pack/rails41.rb
y agregar esta funcionalidad.El siguiente es el fragmento del paquete de compilación modificado que creé en mi empresa:
Por supuesto, puede extender este código para agregar otros secretos (por ejemplo, claves API de terceros, etc.) para que se lean de su variable de entorno:
De esta manera, puede acceder a este secreto de una manera muy estándar:
Antes de volver a implementar su aplicación, asegúrese de configurar primero su variable de entorno:
A continuación, agregue su paquete de compilación modificado (o sea más que bienvenido a vincular el mío) a su aplicación Heroku (consulte la documentación de Heroku ) y vuelva a implementar su aplicación.
El paquete de compilación creará automáticamente su
config/secrets.yml
variable de entorno como parte del proceso de compilación de dinamómetro cada vez que vayagit push
a Heroku.EDITAR: la propia documentación de Heroku sugiere crear
config/secrets.yml
para leer desde la variable de entorno, pero esto implica que debe verificar este archivo en el control de origen. En mi caso, esto no funciona bien ya que tengo secretos codificados para entornos de desarrollo y prueba que prefiero no registrar.fuente
Puede exportar las claves secretas como variables de entorno en
~/.bashrc
o~/.bash_profile
de su servidor:Y luego, puede obtener su
.bashrc
o.bash_profile
:Nunca cometas tus secretos.yml
fuente
En mi caso, el problema era que
config/master.key
no estaba en el control de versiones, y había creado el proyecto en una computadora diferente.El .gitignore predeterminado que crea Rails excluye este archivo. Dado que es imposible implementar sin tener este archivo, debe estar en control de versiones, para poder implementar desde la computadora de cualquier miembro del equipo.
Solución: elimine la
config/master.key
línea.gitignore
, confirme el archivo de la computadora donde se creó el proyecto, y ahora puedegit pull
hacerlo en la otra computadora e implementarlo.La gente dice que no debe comprometer algunos de estos archivos al control de versiones, sin ofrecer una solución alternativa. Mientras no esté trabajando en un proyecto de código abierto, no veo ninguna razón para no comprometer todo lo necesario para ejecutar el proyecto, incluidas las credenciales.
fuente
secrets.yml
archivo antiguo , que ha quedado en desuso en las últimas versiones de Rails. Esta pregunta de Stack Overflow tiene muchas respuestas, y casi todas usan esta antigua API.Para rails6, estaba enfrentando el mismo problema, ya que me faltaban los siguientes archivos, una vez que los agregué, el problema se resolvió:
Asegúrate de tener estos archivos. !!!
fuente
Lo que hice: en mi servidor de producción, creo un archivo de configuración (confthin.yml) para Thin (lo estoy usando) y agrego la siguiente información:
Luego inicio la aplicación con
Trabaja como un encanto y luego no es necesario tener la clave secreta en el control de versiones
Espero que pueda ayudar, pero estoy seguro de que lo mismo podría hacerse con Unicorn y otros.
fuente
Tengo un parche que he usado en una aplicación Rails 4.1 para permitirme continuar usando el generador de claves heredado (y, por lo tanto, la compatibilidad de la sesión con Rails 3), permitiendo que secret_key_base esté en blanco.
Desde que reformateé el parche, lo envié a Rails como una solicitud de extracción
fuente
Creé el
config/initializers/secret_key.rb
archivo y escribí solo la siguiente línea de código:Pero creo que la solución publicada por @Erik Trautman es más elegante;)
Editar: Ah, y finalmente encontré este consejo sobre Heroku: https://devcenter.heroku.com/changelog-items/426 :)
¡Disfrutar!
fuente
esto funciona bien https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 para el usuario root debe editar
pero si usted no root debe poner el código de generación en el siguiente
fuente
En Nginx / Passenger / Ruby (2.4) / Rails (5.1.1) nada más funcionó excepto:
passenger_env_var
en/etc/nginx/sites-available/default
el bloque del servidor.Fuente: https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var
fuente
La respuesta de Demi Magus funcionó para mí hasta Rails 5.
En Apache2 / Passenger / Ruby (2.4) / Rails (5.1.6), tuve que poner
de la respuesta de Demi Magus en / etc / apache2 / envvars, la causa / etc / profile parece ignorarse.
Fuente: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
fuente
Tuve el mismo problema después de usar el archivo .gitignore de https://github.com/github/gitignore/blob/master/Rails.gitignore
Todo salió bien después de comentar las siguientes líneas en el archivo .gitignore.
fuente