Desarrollo Drupal local rápido con DDEV

Contenido del artículo

    ¿Cuántas veces has querido arrancar un proyecto Drupal sin dolores de cabeza? Si usas Windows, te lo pongo fácil: DDEV + WSL + Composer + Drupal 11. En este artículo te enseño cómo montar un entorno local profesional en minutos, con los módulos y temas que uso en producción.

    Requesitos previos

    Montar proyecto con composer

    Desde WSL

    # bash
    # creamos directorio
    mkdir ejemplo_ruralbytes
    cd ejemplo_ruralbytes
    # empezamos entorno ddev
    ddev config --project-type=php --docroot=web
    ddev composer create "drupal/recommended-project:^11" . 

    Proyecto "creado" falta configurarlo

    Una vez ejecutados los comandos anteriores, ya tendremos Drupal descargado en el directorio del proyecto. Ahora toca conectar este proyecto con el entorno DDEV. Lo bueno es que DDEV se encarga de la mayoría de los ajustes necesarios: crea su propia configuración para que todo funcione sin tocar directamente los archivos de Drupal.

    # bash
    ➜ ejemplo_ruralbytes ddev config
    You are reconfiguring the project at /home/elk/desarrollo/ruralbytes_blog/ejemplo_ruralbytes.
    The existing configuration will be updated and replaced.
    Project name (ejemplo-ruralbytes):
    The docroot is the directory from which your site is served.
    This is a relative path from your project root at /home/usuario/desarrollo/ruralbytes_blog/ejemplo_ruralbytes
    Leave docroot empty (hit <RETURN>) to use the location shown in parentheses.
    Or specify a custom path if your index.php is in a different directory.
    Or use '.' (a dot) to explicitly set it to the project root.
    Docroot Location (web):
    Found a drupal11 codebase at /home/usuario/desarrollo/ruralbytes_blog/ejemplo_ruralbytes/web.
    Project Type [backdrop, cakephp, craftcms, drupal, drupal6, drupal7, drupal8, drupal9, drupal10, drupal11, generic, laravel, magento, magento2, php, shopware6, silverstripe, symfony, typo3, wordpress] (php): drupal11
    No settings.php file exists, creating one
    Configuration complete. You may now run 'ddev start'.

    Por si te has perdido el wizard te va haciendo las preguntas pertinentes que son:

    • Project name (ejemplo-ruralbytes): <enter>
    • Docroot Location (web): <enter>
    • Project Type [backdrop, cakephp, craftcms, drupal, drupal6, drupal7, drupal8, drupal9, drupal10, drupal11, generic, laravel, magento, magento2, php, shopware6, silverstripe, symfony, typo3, wordpress] (php): drupal11

    Con esto ddev habrá hecho lo necesario para que el entorno que monto en docker sea usado por el Drupal. Si eres una persona curiosa como yo, te muestro las diferencias clave antes y después de ejecutar ddev config.

    # bash
    ➜ ejemplo_ruralbytes diff /tmp/estado_antes.txt /tmp/estado_despues.txt
    1035a1036
    > 0b830fbaedf196122173e753f21f1f12 ./.ddev/config.yaml
    7912d7912
    < 58888db74975853258cce03e5011d889 ./.ddev/config.yaml
    14098a14099
    > 9e95bdea58de1b22fd0eb4cea5016a4d ./web/sites/default/.gitignore
    18744a18746
    > d32eea68c9b43052688a3423d7bc1009 ./web/sites/default/settings.ddev.php
    21778a21781
    > f3e4b3aa77606130799e53e3f3c0dbe4 ./web/sites/default/settings.php

    Archivos de configuración ddev

    Y ya que estamos vamos a mirar que es lo que hizo el ddev config.

    Creación del archivo .ddev/config.yaml

    # yaml
    name: ejemplo-ruralbytes
    type: drupal11
    docroot: web
    php_version: "8.3"
    webserver_type: nginx-fpm
    xdebug_enabled: false
    additional_hostnames: []
    additional_fqdns: []
    database: type: mariadb version: "10.11"
    use_dns_when_possible: true
    composer_version: "2"
    web_environment: []
    corepack_enable: false

    Por supuesto este archivo tiene también listadas todas las opciones. Es una especie de docker-compose simplificado y adaptado a Drupal, con control sobre versiones de PHP, MariaDB, servidor web y otros servicios.

    El ./web/sites/default/.gitignore simplemente evita subir al repo los archivos settings.ddev.php y drushrc.php.

    En el settings.php se incluye esta linea, que es muy interesante:

    # php
    if (getenv('IS_DDEV_PROJECT') == 'true' && file_exists(__DIR__ . '/settings.ddev.php')) { include __DIR__ . '/settings.ddev.php';
    }

    Básicamente indica que si existe el archivo de configuración de settings.ddev.php en el directorio especifico y hay una variable de entorno IS_DDEV_PROJECT carga la configuración. Esto permite separar claramente la configuración del entorno local respecto a producción, algo muy útil para mantener entornos limpios y coherentes.

    Por último crea el archivo ./web/sites/default/settings.ddev.php:

    # php
    $host = "db";
    $port = 3306;
    $driver = "mysql";
    $databases['default']['default']['database'] = "db";
    $databases['default']['default']['username'] = "db";
    $databases['default']['default']['password'] = "db";
    $databases['default']['default']['host'] = $host;
    $databases['default']['default']['port'] = $port;
    $databases['default']['default']['driver'] = $driver;
    $settings['hash_salt'] = '5d8d5d6b6243cea4354f529682fa97ccc79ab0de726886f27a4d1f3382ac7fe2';
    // This will prevent Drupal from setting read-only permissions on sites/default.
    $settings['skip_permissions_hardening'] = TRUE;
    // This will ensure the site can only be accessed through the intended host
    // names. Additional host patterns can be added for custom configurations.
    $settings['trusted_host_patterns'] = ['.*'];
    // Set $settings['config_sync_directory'] if not set in settings.php.
    if (empty($settings['config_sync_directory'])) { $settings['config_sync_directory'] = 'sites/default/files/sync';
    }
    // Override drupal/symfony_mailer default config to use Mailpit.
    $config['symfony_mailer.settings']['default_transport'] = 'sendmail';
    $config['symfony_mailer.mailer_transport.sendmail']['plugin'] = 'smtp';
    $config['symfony_mailer.mailer_transport.sendmail']['configuration']['user'] = '';
    $config['symfony_mailer.mailer_transport.sendmail']['configuration']['pass'] = '';
    $config['symfony_mailer.mailer_transport.sendmail']['configuration']['host'] = 'localhost';
    $config['symfony_mailer.mailer_transport.sendmail']['configuration']['port'] = '1025';
    // Enable verbose logging for errors.
    // https://www.drupal.org/forum/support/post-installation/2018-07-18/enable-drupal-8-backend-errorlogdebugging-mode
    $config['system.logging']['error_level'] = 'verbose';

    Dependerá un poco pero el archivo por defecto se encarga de configurar la base de datos local, el sync directory y redirige los correos que salen de Drupal a mailpit (incluido en ddev).

    Arrancar el proyecto

    Si todo esto está correcto, lo ultimo que te queda es arrancar el proyecto con ddev start.

    # bash
    ➜ ejemplo_ruralbytes ddev start
    Starting ejemplo-ruralbytes...
    Building project images....
    Project images built in 2s. Container ddev-ejemplo-ruralbytes-db Recreate Container ddev-ejemplo-ruralbytes-web Recreate Container ddev-ejemplo-ruralbytes-db Recreated Container ddev-ejemplo-ruralbytes-web Recreated Container ddev-ejemplo-ruralbytes-web Started Container ddev-ejemplo-ruralbytes-db Started
    Waiting for containers to become ready: [web db]
    Starting ddev-router if necessary...
    Successfully started ejemplo-ruralbytes
    Your project can be reached at https://ejemplo-ruralbytes.ddev.site
    See 'ddev describe' for alternate URLs.

    Instalación de Drupal 11

    Si todo fue correcto, y visitas la url que te propone el start https://ejemplo-ruralbytes.ddev.site te saldrá un aviso de certificado. Este paso puede ser algo delicado en Windows, y lo veremos más a fondo en un próximo artículo y este arrancará la instalación de Drupal.

    Los pasos del asistente (wizard) son sencillos, y no tendrás que configurar manualmente la base de datos: DDEV se encarga de todo automáticamente. Con esto, ya tienes un Drupal listo para trabajar en tu entorno local de forma rápida y sin complicaciones.

    En próximos artículos veremos cómo mejorar aún más este entorno con configuraciones avanzadas de DDEV y algunos trucos útiles para sacarle más partido a Drupal desde el primer día.

    Contenido del artículo
      Sobre el autor
      Miguel Ángel

      Técnico de sistemas y desarrollador web especializado en soluciones digitales para entornos rurales.

      Trabajo sin intermediarios para ayudarte con tus servidores, redes y automatizaciones de forma clara y directa.