Migrando Nuestro Sitio Drupal a Servidor de Tests

Drupal Gears

Muchos de vosotros os habréis visto en la tesitura de tener que exportar un sitio web basado en Drupal a una máquina de desarrollo local para poder probar nuevos módulos, hacer cambios drásticos o simplemente porque no podemos parar nuestro servidor en producción bajo ningún contexto.

La documentación oficial de Drupal debe ser la guía a seguir, pero resulta demasiado genérica y no tiene en cuenta algunos casos particulares. Para ello en este post, voy a describir el proceso de migrar una web Drupal 8 instalada en un dominio real con HTTPS activo, a un servidor local de pruebas sin HTTPS instalado en un directorio de localhost. En este link podéis encontrar la documentación oficial que os servirá como guía: https://www.drupal.org/docs/7/backing-up-and-migrating-a-site/migrating-a-site

Tareas en el servidor a migrar

Poner la web en modo mantenimiento

Con este paso evitaremos que nadie más pueda acceder a nuestra web, además de evitar cualquier modificación involuntaria de la base de datos o de la caché. Para ello accederemos a Configuración->Desarrollo->Modo Mantenimiento y desactivaremos la página.

Borra la caché de Drupal

Este paso es estrictamente necesario si queremos que al iniciar la web en un dominio con URL diferentes funcione ya que esta estará llena con contenido propio del alojamiento actual. El acceso a limpiar la cache lo encontramos en Configuración->Desarrollo->Rendimiento.

En el caso que el borrado no funcione por alguna razón os describiré cómo eliminar el contenido de la caché manualmente una vez exportada la base de datos en el nuevo servidor más adelante.

Crear una copia de seguridad de la Base de Datos.

Si la web está alojada en un servicio de Hosting, deberiais tener acceso a realizar un volcado desde vuestro panel de usuario CPanel, Plesk, phpMyAdmin u otros. El proceso de exportación no es propósito de este post, con lo que os lo dejaré a vosotros.

Una vez realizado el volcado de la base de datos, descargadlo a vuestro equipo de trabajo.

Copia del contenido de la Web

Del mismo modo que la base de datos, la forma más rápida de hacer una copia del contenido sería ir a nuestro panel de control del dominio (CPanel, Plesk, otros), ir al explorador de archivos, seleccionar el directorio raíz que contiene la web (probablemente htdocs), comprimirlo y descargarlo.

Preparando el equipo local

En este caso nuestro equipo local tendría una configuración de Apache por defecto sin ningún virtualhost, con lo que la url de acceso a nuestra nueva web de pruebas sería del formato http://localhost/test.

En una instalación por defecto de Linux Ubuntu 18.04 (En otras distribuciones no debe ser muy diferente) apache instala en servicio en /var/www/html. Como queremos instalar nuestra web en la raíz crearemos un nuevo directorio /var/www/html/test meteremos la copia de la web.

Restaurando la base de datos en local

La manera más sencilla de importar un volcado de MySql es mediante un gestor de base de datos como phyMyAdmin aunque para ser honesto encuentro phpMyAdmin demasiado recargado y normalmente uso un cliente mucho más simple que me permite realizar todas las operaciones básicas rápidamente. Este gestor es Adminer y consiste en un único fichero php que se puede dejar caer en el nuestro document root y a funcionar. Además también soporta otras bases de datos a parte de MySql y tal vez sea el mejor gestor para SQLite. Se puede descargar aqui: https://www.adminer.org/

Adminer Login

1 - Crear una base de datos vacía.

Nos logueamos en Adminer y vamos a crear una base de datos llamada "drupal_db". Tened en cuenta que el nombre de la base de datos no tiene porque coincidir con el nombre original, ya que después editaremos en fichero Drupal "settings.php" para realizar los ajustes necesarios para configurar la cadena de conexión local y otros valores necesarios. El juego de caracteres (collation) sí lo tenemos que respetar según la base de datos original, ya que sino podríamos ver caracteres extraños en los textos.

Adminer Create BD

2 - Importar el volcado de la base de datos.

Adminer nos ofrece 3 opciones para realizar la importación.

  1. Utilizar el volcado en texto plano con formato *.sql (fichero < 2MB)
  2. Utilizar el volcado comprimido en *.tar.gz (fichero < 2 MB)
  3. Renombrar nuestro volcado a "adminer.sql" (sin comprimir) y ponerlo en el mismo directorio que adminer.php en el document root.

La única opción válida aquí es la tercera ya que un volcado de Drupal básico estará por encima de los 5MB.

Adminer Import

El proceso de importación tardará unos segundos tras pulsar "Run file". Una vez terminado ya podemos pasar al siguiente punto.

Copiar la web en el directorio destino.

Descomprimiremos nuestra copia de seguridad de los ficheros de la web, y copiaremos el contenido (sin en directorio htdocs o html) en el directorio que ya habíamos creado anteriormente "/var/www/html/test".

Adaptando la configuración a localhost

Este punto depende de la configuración que haya en el servidor remoto y de la configuración de vuestro servidor local. En este caso tenemos 2 configuraciones que cambiar de "settings.php" y una del ".htaccess" ya que queremos revertir los siguientes cambios:

1 - Pasar de un dominio real tipo www.midominio.com a un dominio local (sin dominio) -> /localhost/test

En Drupal 8, la manera estándar de cambiar la URL base del dominio es en el fichero "misitio/sites/default/settings.php" que contiene la configuración de Drupal. Por motivos de seguridad la variable $base_url fue eliminada en favor de "$settings['trusted_host_patterns']" que establece un filtro mediante expresiones regulares de urls, que se pueden utilizar para acceder al sitio y de esta manera prevenir ataques de cabecera http.

Para un dominio real se aconseja añadir el dominio con y sin www:


$settings['trusted_host_patterns'] = [
   '^midominio\.com$',
   '^www\.midominio\.com$',
];

Para un dominio local poner solo localhost (sin el directorio donde se halla la aplicación):


$settings['trusted_host_patterns'] = [
   '^localhost$',
];

2 - Cambiar la configuración de la base de datos.

La cadena de conexión a la base de datos también se encuentra en "settings.php". Editar los valores en caso que sean diferentes.


$databases['default']['default'] = array (
  'database' => 'drupal_db',
  'username' => 'usuario',
  'password' => 'password',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

3 - Eliminar la configuración https del dominio real para funcionar con http simple.

Si tenemos SSL habilitado en el servidor, eliminaremos / comentaremos las líneas que permiten la redirección de HTTP a HTTPS en el fichero .htaccess


# RewriteCond %{HTTPS} off
# RewriteCond %{HTTP:X-Forwarded-Proto} !https
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Problemática

Si todo ha ido bien, ahora deberíais abrir /localhost/test y ver vuestra página corriendo en local en modo mantenimiento, pero no siempre funciona todo a la primera. Aquí os describo los problemas que yo me he encontrado:

1 - Borrado de la caché Drupal 8. Si vuestra página no funciona y no podéis entrar al backoffice, la primera opción es eliminar manualmente la caché de la base de datos, para ello, bastará con ejecutar los siguientes comandos en vuestro administrador en mi caso Adminer.


TRUNCATE cache_config;
TRUNCATE cache_container;
TRUNCATE cache_data;
TRUNCATE cache_default;
TRUNCATE cache_discovery;
TRUNCATE cache_dynamic_page_cache;
TRUNCATE cache_entity;
TRUNCATE cache_menu;
TRUNCATE cache_render;
TRUNCATE cache_toolbar;

2 - Permisos de "/var/www/html/test"

Por defecto "/var/www/html" tendrá usuario "root" y grupo "root", con lo que si hemos copiado los fichero usando sudo, habrán heredado el usuario y grupo.

Drupal tiene una función para optimizar y comprimir los ficheros *.css y *.js, que son reescritos periódicamente, y si el grupo www-data que ejecuta apache no tiene permisos de escritura Drupal fallará al cargar los estilos y javascript. Por lo que yo aconsejo cambiar el grupo por defecto a www-data.


cd /var/www/html
sudo chgrp -R www-data test

Conclusión

Si seguís con problemas, y al menos podéis entrar en backoffice, os recomiendo aumentar el nivel de depuración de los mensajes de error que muestra Drupal desde Configuracion->Desarrollo->Registro y Errores. De esta manera seguro que dais con el problema.

Recordad que si realizáis la operación contraria de subir un Drupal local a un servidor deberéis realizar los cambios al revés.

Espero que este post os sea de ayuda.

Un saludo.

Etiquetas