Creación de un multisitio en Drupal 8

Enviado por Juan el Mié, 13/07/2016 - 15:50
Lego construction blocks

Drupal tiene la capacidad de montar diferentes sitios en una misma instancia de Drupal. ¿Cuándo utilizar esta característica? Es conveniente para cuando tenemos sitios que van a compartir características muy similares. Por ejemplo, si tenemos varios sitios donde pensemos integrar funcionalidades similares o que utilicen el mismo tema gráfico, podría resultar conveniente integrarlos como parte de un multisitio. La ventaja es que, si tenemos que actualizar el core o un módulo de Drupal, sólo actualizamos una instancia de los mismos archivos.

Para esta prueba simularé dar de alta dos sitios a partir de mi sitio padre: uno para HATR Project y otro para un blog al que llamaré Dev Notes.

Primero, habrá que crear una base de datos por cada sitio que queramos integrar en el multisitio. Yo utilizaré el mismo usuario de la base de datos para cada una de las nuevas bases en MySQL:

CREATE USER hatr@localhost IDENTIFIED BY 'contraseña1234';
CREATE USER devnotes@localhost IDENTIFIED BY 'contraseña5678';
CREATE DATABASE hatr;
CREATE DATABASE devnotes;
GRANT ALL PRIVILEGES ON hatr.* TO hatr@localhost;
GRANT ALL PRIVILEGES ON devnotes.* TO devnotes@localhost;

Los sitios se van a dar de alta en el archivo /sites/sites.php. Este archivo debe tener el mismo formato que el example.sites.php que está en esa misma carpeta, por lo cual podemos hacer una copia para utilizarla como base:

cp example.sites.php sites.php

Añado las siguientes líneas a mi sites.php:

$sites = array(
// HATR Project
'85.hatr.capablanca.dev' => 'hatr',
// Dev Notes
'85.devnotes.capablanca.dev' => 'devnotes',
);

El formato de la llave de cada uno de estos elementos del arreglo es como sigue: númerodepuerto.dominio.carpeta. Ojo, que como yo pienso poner mi sitio disponible en la raíz, no pongo la parte de la carpeta al final de la cadena. Es decir, quiero acceder a mi sitio como http://hatr.capablanca.dev:85 y no como http://capablanca.dev/hatr.

El valor que se le asigna a cada elemento corresponde al nombre de la carpeta que guardará la configuración de cada sitio, por lo que después hay que ir a la carpeta /sites del Drupal y crear otros dos directorios, uno para cada sitio. Quedarán entonces /sites/hatr y /sites/devnotes en mi caso:

mkdir hatr
mkdir devnotes

Ahora hay que copiar los archivos de configuración default en cada una de estas carpetas. Desde la carpeta /sites/default ejecuto lo siguiente:

cp default.settings.php ../hatr/settings.php
cp default.settings.php ../devnotes/settings.php
cp default.services.yml ../hatr/services.yaml
cp default.services.yml ../devnotes/services.yaml

También hay que crear la carpeta de archivos y la carpeta de traducciones para cada uno de los sitios:

mkdir devnotes/files
mkdir devnotes/files/translations

Estas carpetas deberían tener permisos de escritura para poder llevar a cabo la instalación de Drupal. La parte que sigue, es apuntar el subdominio en Apache para que abra cada sitio por separado. Creo un nuevo archivo en /etc/apache2/sites-available/hatr.conf con la siguiente configuración:

<VirtualHost *:85>
    ServerName hatr.capablanca.dev
    ServerAlias hatr.capablanca.dev
    ServerAdmin newjuan@gmail.com
    DocumentRoot /var/www/jdeleon/

    ErrorLog ${APACHE_LOG_DIR}/hatr-error.log
    CustomLog ${APACHE_LOG_DIR}/hatr-access.log combined
</VirtualHost>

Es decir, el directorio de cada sitio hijo debe apuntar a la ubicación del sitio padre, no a la carpeta que creamos en /sites. Se debe replicar lo mismo con un archivo .conf para el otro sub-sitio, es decir en mi caso, devnotes. Después de esto activo el sitio y reinicio para que surtan efecto los cambios con:

sudo a2ensite hatr
sudo a2ensite devnotes
sudo service apache2 restart

Los tutoriales que había revisado dicen que hasta este punto es necesario y a mí seguía sin abrirme el sitio en http://hatr.capablanca.dev:85. El detalle estaba que me faltaba dar de alta la IP de la máquina virtual también con los subdominios en el archivo de hosts de mi computadora local, ya que con el host del dominio padre no era suficiente.

Así que ejecuté lo siguiente en la terminal de la Mac:

sudo nano /etc/hosts

Y agregué las líneas que faltaban:

192.168.50.90 capablanca.dev
192.168.50.90 hatr.capablanca.dev
192.168.50.90 devnotes.capablanca.dev

Y voilà! Al abrir http://hatr.capablanca.dev:85 en mi navegador ya aparece el asistente para instalar el nuevo sitio.