Proporcionar de forma segura la contraseña de la base de datos en una aplicación Rails

Como sabe, DEBE proporcionar el nombre de la base de datos, el nombre de usuario y la contraseña correctos para la base de datos en el archivo config / database.yml, o su aplicación Rails se negará a trabajar.

En la configuración predeterminada, su contraseña está en texto sin formato en el archivo config / database.yml. Si su aplicación está en un repository gratuito de GitHub, entonces su contraseña es información pública. Esta no es una opción viable para una aplicación seria. (Está bien para un ejercicio de tutoría, siempre que no utilice esta contraseña para nada más).

Tengo una solución que me ha funcionado hasta ahora, pero me pregunto si hay algo mejor. Puede ver mi ejemplo desplegado en https://github.com/jhsu802701/bsf .

Lo que hago es configurar el archivo config / database.yml para proporcionar el nombre de usuario y la contraseña para el entorno de desarrollo programáticamente. Para el entorno de desarrollo, agrego comandos al script config / database.yml para adquirir el nombre de usuario del entorno de desarrollo (que es mi nombre de usuario habitual para la configuración de Debian Linux que uso) y una contraseña en blanco. (Le doy a mi nombre de usuario los privilegios de superusuario de Postgres). Para el entorno de producción, agrego un comando en el script de implementación que adquiere el nombre de usuario y la contraseña de otros archivos de mi cuenta y escribe esta información en el archivo config / database.yml.

¿Hay una solución mejor?

¿Hay una gem de Ruby que cubre esto? Si no, estoy pensando en crear uno.

La forma en que Heroku lo hace, y una gran mayoría de otras tiendas de Rails son con variables ENV.

Exporta dos variables a tu entorno,

export POSTGRES_USERNAME='username' export POSTGRES_PASSWORD='password' 

Luego en tu archivo database.yml puedes hacer

 username: <%= ENV['POSTGRES_USERNAME'] %> password: <%= ENV['POSTGRES_PASSWORD'] %> 

Así es como lo hago funcionar:

En terminal / cmd:

 heroku config:set YOUR_DATABASE_PASSWORD=passywordy 

Luego, en el archivo /config/database.yml;

 production: <<: *default password: <%= ENV['YOUR_DATABASE_PASSWORD'] %> 

(esta área de contraseña se genera automáticamente cuando usé rails new my_app -d postgresql)

En otra cosa que no sea heroku, exporte sus variables al entorno del sistema (linux) escribiendo bash export KEY=value Luego puede llamarlo en Rails por ENV['KEY']

p.ej
en bash
export CMS_DATABASE_PASSWORD=MySecurePassword
en secrets.yml:
password: <%= ENV['CMS_DATABASE_PASSWORD'] %>

Al establecer las variables de entorno como se describe en las publicaciones existentes arriba, solo persistirán las variables de entorno durante la sesión de shell actual.

Para establecer las variables de entorno de forma permanente, las instrucciones de export deben agregarse a su archivo de configuración de shell. (Luego ejecute source ~/.bashrc para aplicar los cambios a su sesión actual)

TL; DR: si está utilizando BASH, agregue las instrucciones de export a ~/.bashrc.

Si bien lo anterior debería ser suficiente (si usa BASH en las distribuciones de Linux más populares), identificar con certeza qué archivo de configuración actualizar para su shell puede ser bastante complicado. La siguiente publicación explica los motivos y proporciona orientación sobre qué archivo de configuración editar.

https://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables