Utilización de Lando para desarrollar en local proyectos Drupal

Llevo varios años trabajando como desarrollador web PHP y Drupal. Recientemente he cambiado de empresa y me ocupo del mantenimiento de un parque de unas 30 webs desarrolladas en Drupal.

Cuando recibo un ticket de mantenimiento, es necesario poder lanzar el proyecto rápidamente en local para poder corregir los problemas. Para ello utilizamos una máquina virtual Ubuntu con VMWare y Lando.

Para lanzar un proyecto Drupal con Lando, basta con utilizar un fichero de configuración llamado lando.yml como el que os muestro a continuación:

name: mi-blog-drupal
recipe: drupal10
config:
  php: "8.2"
  via: nginx
  webroot: web
  database: mariadb:10.6
  xdebug: true
  drush: "*"
  conf:
    php: config/php.ini
proxy:
  mailhog:
    - mail.mi-blog-drupal.lndo.site
  pma:
    - pma.mi-blog-drupal.lndo.site
services:
  appserver_nginx:
    scanner:
      okCodes:
        - 302
  appserver:
    overrides:
      environment:
        # Support debugging CLI with Xdebug.
        PHP_IDE_CONFIG: "serverName=appserver"
        #XDEBUG_SESSION_START: lando
  # Interception des emails
  mailhog:
    type: mailhog
    hogfrom:
      - appserver
    portforward: true
  # PhpMyAdmin
  pma:
    type: phpmyadmin
    hosts:
      - database
tooling:
  drush:
    service: appserver

A continuación, hay que lanzar:

lando start

y para instalar un proyecto Drupal, si queréis comenzar de cero:

lando composer create-project drupal/recommended-project .

A continuación, gracias a Lando, podéis usar las siguientes urls:

Nosotros utilizamos un fichero de configuración para la base de datos de Drupal como el siguiente:

<?php

if (getenv('LANDO') === 'ON') {
  $lando_info = json_decode(getenv('LANDO_INFO'), TRUE);
  $settings['trusted_host_patterns'] = ['.*'];
  $settings['hash_salt'] = md5(getenv('LANDO_HOST_IP'));
  $databases['default']['default'] = [
    'driver' => 'mysql',
    'database' => $lando_info['database']['creds']['database'],
    'username' => $lando_info['database']['creds']['user'],
    'password' => $lando_info['database']['creds']['password'],
    'host' => $lando_info['database']['internal_connection']['host'],
    'port' => $lando_info['database']['internal_connection']['port'],
  ];
}

$config['system.logging']['error_level'] = 'verbose';

$settings['tmp'] = '/tmp';
$config['locale.settings']['translation']['path'] = 'sites/default/files/translations';
$settings['file_private_path'] = '../private';

$config['system.performance']['css']['preprocess'] = FALSE;
$config['system.performance']['js']['preprocess'] = FALSE;

$settings['mailer_sendmail_commands'] = [
  '/usr/local/bin/mhsendmail -t --smtp-addr=mailhog:1025',
];

En este fichero de configuración podéis observar que las credenciales de acceso a la base de datos se recuperan mediante una variable de entorno proporcionada por Lando (LANDO_INFO).

Los comandos básicos de Lando son:

  • lando start : lanza los contenedores docker existentes, o los nuevos si es la primera vez
  • lando stop : para los contenedores
  • lando destroy : destruye los contenedores, el contenido de la base de datos se perderá
  • lando rebuild : reconstruye los contenedores, útil cuando se cambia de version de PHP o se añaden otras opciones al fichero lando.yml. No se pierden los datos de la base de datos salvo si se cambia su versión.
  • lando poweroff : apaga todos los contenedores docker de todos los proyectos

Junto con VSCode, Lando permite utilizar fácilmente la extensión PHP xdebug, tanto en modo web como en el CLI. Espero que esta introducción minimalista a Lando y Drupal os anime a probarlo. Desde hace unos años la comunidad de Drupal ha desarrollado una herramienta similar y alternativa a Lando, llamada ddev. Se parece mucho a Lando, pero de momento no he encontrado nada que no pueda hacer con Lando, así que todavía no he cambiado.

Para terminar con alegría, os dejo con esta famosa canción de Chayanne, Bailando Bachata: https://www.youtube.com/watch?v=y5NSAQ_cDAA