Moviendo configuraciones entre ambientes

4 minutos

Debido a que muchas configuraciones de tu sitio hacen parte de su funcionalidad es necesario saber como moverlas entre ambientes y especialmente evitar sobreescribir la base de datos una vez tu sitio está publicado, así que te voy a contar lo básico y también algunas recomendaciones que te pueden ayudar en el proceso.

Definir una carpeta para que Drupal almacene tus configuraciones

Antes de poder exportar e importar configuraciones debemos definir la carpeta de destino para todos los archivos de configuración.

En nuestro famoso archivo settings.php busca la línea que contiene 'config_sync_directory' y define una carpeta, en mi caso suelo usar '../config', así que esta carpeta la creo como hermana de web y vendor. Así debe quedar:

$settings['config_sync_directory'] = '../config';

Los comandos de Drush que necesitaras:

drush cex

Este es el comando que debes usar desde tu ambiente local para exportar todos los cambios que has hecho.

drush cim

Este comando importará todas las configuraciones.

Algunas recomendaciones

  • Desde el primer commit es importante exportes la configuración y la agregues a tu repositorio.
  • En muchos casos no subirás tu sitio a ambientes de pruebas o productivos hasta no tener funcionando algunas cosas, así que la primera vez que vas a llevar esa configuración podrías cargar una copia de tu base de datos local o usar el comando de instalación de Drush con el parámetro existing-config.
    drush si --account-name=nombre_de_usuario --account-pass=contraseña --existing-config -y
    El comando anterior instala Drupal con el usuario y la contraseña dados, pero lo más importante con toda la configuración que has exportado.
  • Ten por costumbre exportar tu configuración y revisar que están los cambios que necesitas cuando vas a agregar nueva funcionalidad a tu sitio.
  • Como parte de tu sistema de integración continua agrega el comando para importar configuraciones, en algunos casos más de una vez, esto porque debido a la interdependencia de algunas configuraciones se cambia su orden de importación y esto puede producir que algunas no se importen a la primera.
  • Cuando trabajas en equipo asegúrate de importar la configuración antes de comenzar a trabajar en algo nuevo, esto evitará que tu ambiente local se quede muy atrás en los cambios y al momento de exportar genere configuraciones que vuelven para atrás el trabajo de alguien más.

Ignorando algunos módulos

Hay módulos que no queremos tener activos en ambientes de pruebas o producción, un ejemplo es el módulo devel que solo lo usamos para desarrollo, en ese caso Drupal nos permite evitar que estos sean exportados usando una opción en nuestro archivo settings.local.php,  pero primero aclaremos como se usa ese archivo.

En la carpeta web/sites encontrarás un archivo llamado example.settings.local.php este archivo necesitas moverlo dentro de la carpeta web/sites/default con el nombre settings.local.php y agregar las siguientes líneas al final del archivo settings.php

if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
  include $app_root . '/' . $site_path . '/settings.local.php';
}

Esto hace que Drupal reconozca las configuraciones que hay en tu archivo settings.local.php, una vez hecho esto al final de dicho archivo encontraras comentado algo como esto:

# $settings['config_exclude_modules'] = ['devel', 'stage_file_proxy'];

Descomenta esa línea y deja los módulos que quieres ignorar, esto no solo ignorará si están activos sino también toda la configuración que viene con ellos.

Algunas estrategias para manejar información protegida

Aunque muchos módulos no guardan información sensible en la configuración, seguramente tendrás situaciones en las que quieres evitar que un dato sea expuesto dentro de un archivo de tu repositorio, algo como un nombre de usuario, una API Key, etc.

Las siguientes son algunas estrategias que puedes usar:

Un archivo con esas configuraciones

Podemos crear un archivo secrets.settings.php y ubicarlo en un lugar inaccesible públicamente en nuestro servidor, el contenido de este archivo deben ser las configuraciones que quieres mantener protegidas, por ejemplo:

// Credenciales protegidas.
$config['mi_modulo.settings']['api_username'] = 'mi usuario';
$config['mi_modulo.settings']['api_password'] = 'Mi Contraseña';

y en el archivo settings.php al final agregamos estas líneas:

if (file_exists('/ruta-al-archivo/secrets.settings.php')) {
  include '/ruta-al-archivo/secrets.settings.php';
}

Variables de Entorno

Otra forma de hacerlo es usando variables de entorno para estas configuraciones directamente en el archivo settings.php como muestro a continuación:

// Credenciales protegidas.
$config['mi_modulo.settings']['api_username'] = getenv('NOMBRE_PROTEGIDO');
$config['mi_modulo.settings']['api_password'] = getenv('CONTRASENA_PROTEGIDA');

Conclusión

Aunque no fui al detalle de otras situaciones que se pueden presentar, este artículo te da un punto de partida y algunas recomendaciones para gestionar la configuración de tu sitio entre ambientes.

Jidrone Drupal Developer
J. Ivan Duarte
Drupal Senior Developer

Share