Ruta de navegación
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
- Tener WSL2 con Debian (da un poco igual Debian que Ubuntu) (instalación)
- Docker Desktop instalado y funcionando (instalación)
- Git (instalación WSL)
- Composer (instalación WSL)
- DDEV instalados (instalación WSL)
Montar proyecto con composer
Desde WSL
# 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.
➜ 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
.
➜ 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
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:
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
:
$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
.
➜ 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.