Instalación Local De Un Cms Php

Esta tarea consiste en instalar un CMS de tecnología PHP en un servidor local. Los pasos que tendrás que dar los siguientes:

Tarea 1: Instalación de un servidor LAMP

He creado una máquina virtual utilizando Vagrant y VirtualBox, mediante el siguiente fichero VagrantFile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

 config.vm.define :servidor1 do |servidor1|
  servidor1.vm.box = "debian/buster64"
  servidor1.vm.network "private_network", ip: "192.168.30.15"
 end

end

Una vez tenemos la máquina lista, vamos a instalar el servidor LAMP, que hace referencia a:

Antes de nada voy a preparar la máquina para la instalación, voy a actualizar los paquetes instalados, ya que la box que estoy utilizando no es de la última versión de Debian.

apt update && apt upgrade -y && apt autoremove -y

El primer paso sería instalar nuestro gestor de base de datos, MySQL, por tanto, lo instalamos:

apt install mariadb-server mariadb-client -y

Una vez lo hemos instalado, vamos a configurar una serie de opciones con el comando mysql_secure_installation. Vamos a especificarle una contraseña de root, vamos a eliminar los usuarios anónimos, vamos a desactivar el acceso remoto a la base de datos, en resumen, vamos a restablecer la base de datos, con nuestras preferencias:

root@buster:/home/vagrant# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Procedemos a instalar el servidor web Apache, que lo vamos a instalar con este comando:

apt install apache2 apache2-utils -y

Y vamos a habilitar su servicio en cada inicio del sistema con:

systemctl enable apache2

Nos quedaría por instalar el servidor PHP, para ello:

apt install php libapache2-mod-php php-mysql -y

También he instalado las librerías php de Apache y MySQL, para que todos los sistemas puedan funcionar de manera conjunta.

Activamos el módulo de PHP de Apache.

a2enmod php7.3

Y por último introducimos la siguiente línea en forma de script PHP, que lo único que hace es crear un fichero llamado phpinfo.php dentro del directorio /var/www/html, en el que escribe <?php phpinfo(); ?>.

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/phpinfo.php

Hemos terminado de montar nuestro servidor LAMP.

Tarea 2: Instalación de drupal en mi servidor local

En la ruta /etc/apache2/sites-available/ creamos un fichero de configuración para esta página. Podemos copiar el fichero llamado 000-default.conf para tener la estructura y luego lo modificamos:

root@buster:/etc/apache2/sites-available# cp 000-default.conf javierperezhidalgo-drupal.conf

root@buster:/etc/apache2/sites-available# nano javierperezhidalgo-drupal.conf

Dentro de este fichero, establecemos la URL de la web en el apartado ServerName. Tiene que quedar así:

<\VirtualHost *:80\>
        ServerName www.javierperezhidalgo-drupal.org

        ServerAdmin webmaster@localhost
        DocumentRoot /srv/www/drupal

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

<\/VirtualHost\>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

Creamos el enlace simbólico para activar el sitio web:

root@buster:/etc/apache2/sites-available# a2ensite javierperezhidalgo-drupal.conf

Reinicamos el servicio del servidor apache:

systemctl restart apache2

Si nos dirigimos a nuestra máquina anfitriona y añadimos al /etc/hosts esta línea, en el navegador podremos visualizar la web www.javierperezhidalgo-drupal.org:

192.168.30.15   www.javierperezhidalgo-drupal.org

La página web tiene este aspecto:

Para crear un usario en MySQL:

root@buster:/var/www/html# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 65
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE drupal;
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> CREATE USER 'drupal' IDENTIFIED BY 'contraseña';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON drupal.* TO 'drupal';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> exit
Bye

Además de crear el usuario drupal, le he concedido todos los permisos para tener acceso y control sobre todas las tablas y bases de datos.

Para descargar Drupal en su última versión, que en este momento es la 9, nos dirigimos a la página oficial de Drupal. Copiamos la ruta del enlace de descarga del archivo, en mi caso prefiero el tar.gz y lo descargamos en nuestro servidor LAMP con la utilidad wget.

root@buster:~# wget https://www.drupal.org/download-latest/tar.gz
--2020-12-28 13:18:56--  https://www.drupal.org/download-latest/tar.gz
Resolving www.drupal.org (www.drupal.org)... 151.101.134.217
Connecting to www.drupal.org (www.drupal.org)|151.101.134.217|:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://ftp.drupal.org/files/projects/drupal-9.1.0.tar.gz [following]
--2020-12-28 13:18:57--  https://ftp.drupal.org/files/projects/drupal-9.1.0.tar.gz
Resolving ftp.drupal.org (ftp.drupal.org)... 151.101.134.217
Connecting to ftp.drupal.org (ftp.drupal.org)|151.101.134.217|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 17741953 (17M) [application/octet-stream]
Saving to: ‘tar.gz’

tar.gz                    100%[=====================================>]  16.92M  8.86MB/s    in 1.9s    

2020-12-28 13:18:59 (8.86 MB/s) - ‘tar.gz’ saved [17741953/17741953]

root@buster:~# tar xf tar.gz -C /srv/www/

Hemos descargado Drupal y lo hemos descomprimido en la ruta en la que se encuentra el sitio web, en mi caso, /srv/www/. Para utilizar esta ruta, debemos modificar el fichero apache2.conf, que actualmente posee esta configuración:

<\Directory /var/www/\>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
<\/Directory\>

#<\Directory /srv/\>
#        Options Indexes FollowSymLinks
#        AllowOverride None
#        Require all granted
#<\/Directory\>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

Esto indica que mostrará todos los ficheros de las páginas alojadas en la ruta /var/www/. Lo que debemos hacer es comentar estas líneas y descomentar las de abajo que hacen referencia a la ruta /srv/ y todos sus hijos:

#<\Directory /var/www/\>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#<\/Directory\>

<\Directory /srv/\>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
<\/Directory\>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

Además conviene crear un enlace simbólico sobre el directorio de Drupal para tener un nombre sin números de versión. Hemos otorgado al usuario www-data como dueño del directorio y su contenido al servidor web.

root@buster:~# ln -s /srv/www/drupal-9.1.0/ /srv/www/drupal

root@buster:~# chown -R www-data:www-data /srv/www/drupal/

También necesitamos algunas extensiones de PHP:

apt install php-gd php-mbstring php-xml -y

Drupal puede hacer uso del sistema de reescritura de URLs, basado en el módulo Rewrite de Apache, que no está activado por defecto. Este módulo permite crear direcciones URL alternativas a las dinámicas generadas por la programación de nuestros sitio web, de tal modo que sean más legibles y fáciles de recordar. Activamos el módulo Rewrite:

a2enmod rewrite

Ya tendríamos activado el módulo Rewrite de Apache, pero nos quedaría por configurar nuestra aplicación Drupal para que haga uso de él. Para ello, nos dirigimos al fichero de configuración del virtualhost de Drupal e introducimos el siguiente bloque, que permite, entre ellos, el uso de archivos .htaccess.

<\Directory /srv/www/drupal>
        AllowOverride all
<\/Directory>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

¿Y para qué hacemos esto?

Pues bien, porque en la carpeta drupal que hemos obtenido al descomprimir el paquete descargado, ya nos encontramos con un fichero de este tipo, que viene configurado para solucionar el problema de las URLs limpias.

De manera que el fichero del virtualhost quedaría con el siguiente aspecto:

<\VirtualHost *:80\>
        ServerName www.javierperezhidalgo-drupal.org

        ServerAdmin webmaster@localhost
        DocumentRoot /srv/www/drupal

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <\Directory /srv/www/drupal/\>
          AllowOverride All
        <\/Directory\>

<\/VirtualHost\>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

Aplicamos los cambios en la configuración reiniciando el servidor web:

systemctl restart apache2

En este punto ya podemos hacer uso del Instalador Web de Drupal. Accedemos a la web que hemos configurado antes con la URL www.javierperezhidalgo-drupal.org, y se nos abrirá el instalador.

Y ya comienza el proceso de instalación:

Terminada la instalación llega el momento de configurar la identidad del sitio y crear el usuario administrador.

Completamos según nuestras preferencias y guardamos y listo:

Para cambiar el tema de nuestro CMS, nos dirigimos a la opción que nos aparece arriba, Apariencia y seleccionamos + Instalar nuevo tema, introducimos el enlace de descarga del tema que queremos añadir y listo. Cuidado, tenemos que comprobar que el tema que vamos a instalar es compatible con la versión de Drupal que estamos utilizando.

Puede ser que no nos aparezca el botón + Instalar nuevo tema. En este caso, debemos dirigirnos a la pestaña Contenido y en ésta, activar el módulo Update Manager. Hecho esto, ya nos aparecería este botón.

Una vez tenemos instalado el tema que queremos, lo seleccionamos como activo:

Y ya hemos cambiado el tema:

Vamos a añadir alguna entrada, para ver como se mostraría el contenido. Para ello en la parte superior de las opciones, donde dice Contenido, clickamos en + Añadir contenido, y se nos abrirá una especie de editor, que configuramos a nuestro gusto y guardamos los cambios.

Así quedaría nuestra nueva publicación:

Para instalar un nuevo módulo en Drupal, es bastante sencillo y parecido a los temas. Vamos a la opción Ampliar, clickamos en + Instalar nuevo módulo, introducimos el enlace de descarga del módulo que queremos añadir y listo. Al igual que con el tema, tenemos que verificar que funciona con nuestra versión de Drupal.

En mi caso, voy a instalar un módulo llamado AddToAny que permite compartir los artículos y entradas de la web a través de nuestras redes sociales.

Activamos el nuevo módulo:

Observamos como en la página de inicio, ahora nos aparece un pequeño menú con varias redes sociales para compartir el artículo.

Tarea 3: Configuración multinodo

Realizamos una copia de seguridad de la base de datos de Drupal que tenemos en MySQL, mediante el comando:

root@buster:~# mysqldump -u drupal -p drupal > copiaseguridaddrupal.sql
Enter password:

root@buster:~# ls
copiaseguridaddrupal.sql

Le pasamos dos parámetros: la opción -u indica el nombre de usuario y la opción -p el nombre de la base de datos.

Modifico el escenario creado antes y queda así:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

 config.vm.define :servidor1 do |servidor1|
  servidor1.vm.box = "debian/buster64"
  servidor1.vm.network "private_network", ip: "192.168.30.15"
 end

 config.vm.define :maquina2 do |maquina2|
  maquina2.vm.box = "debian/buster64"
  maquina2.vm.network "private_network", ip: "192.168.30.30"
 end

end

En la nueva máquina llamada maquina2 hay que configurar el nuevo servidor de base de datos, para ello previamente preparo y actualizo los paquetes, e instalo los relativos a MySQL:

apt update && apt upgrade -y && apt autoremove -y && apt install mariadb-server mariadb-client -y

Una vez lo hemos instalado, vamos a configurar una serie de opciones con el comando mysql_secure_installation. Vamos a especificarle una contraseña de root, vamos a eliminar los usuarios anónimos, vamos a desactivar el acceso remoto a la base de datos, en resumen, vamos a restablecer la base de datos, con nuestras preferencias:

root@buster:/home/vagrant# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Para crear un usario en MySQL:

root@buster:/home/vagrant# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 57
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE drupal;
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> CREATE USER 'drupal' IDENTIFIED BY 'contraseña';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON drupal.* TO 'drupal';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

Para mover la copia de seguridad de la base de datos que hemos realizado en pasos anteriores, en la máquina servidor1 he instalado la utilidad rclone, he configurado mi cuenta de Dropbox y he copiado el archivo. Si quieres aprender más sobre rclone puedes visitar este post.

Podríamos haberlo hecho con el típico comando scp, pero en caso de querer utilizarlo, tendríamos que establecer una contraseña en las máquinas, ya que Vagrant por defecto no deja que nos conectemos por SSH si no utilizamos la clave privada, y luego configurar en el fichero /etc/ssh/sshd_config la línea PasswordAuthentication no y sustituir el no por un yes, y reiniciar el servicio SSH, ya que hemos tocado su configuración.

Ahora voy a configurar la misma cuenta de Dropbox con rclone en la máquina maquina2, y voy a descargar la copia de seguridad de la base de datos.

root@buster:~# rclone copy dropbox:/rclone/copiaseguridaddrupal.sql /home/vagrant/

root@buster:~# ls
copiaseguridaddrupal.sql

Ya tengo la copia de seguridad en la maquina2, que es donde quiero restaurarla. Para restaurar una copia de seguridad de una base de datos en MySQL, introducimos el siguiente comando:

root@buster:~# mysql -u drupal -p drupal < copiaseguridaddrupal.sql
Enter password:

root@buster:~#

El parámetro -u indica el nombre de usuario y -p el nombre de la base de datos, donde se va a restaurar la copia.

Si miramos las bases de datos del usuario drupal:

root@buster:~# mysql -u drupal -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 59
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| drupal             |
| information_schema |
+--------------------+
2 rows in set (0.001 sec)

Si entramos en la base de datos drupal y miramos las tablas:

MariaDB [(none)]> use drupal;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [drupal]> show tables;
+----------------------------------+
| Tables_in_drupal                 |
+----------------------------------+
| batch                            |
| block_content                    |
| block_content__body              |
| block_content_field_data         |
| block_content_field_revision     |
| block_content_revision           |
| block_content_revision__body     |
| cache_bootstrap                  |
| cache_config                     |
| cache_container                  |
| cache_data                       |
| cache_default                    |
| cache_discovery                  |
| cache_dynamic_page_cache         |
| cache_entity                     |
| cache_menu                       |
| cache_render                     |
| cachetags                        |
| comment                          |
| comment__comment_body            |
| comment_entity_statistics        |
| comment_field_data               |
| config                           |
| file_managed                     |
| file_usage                       |
| history                          |
| key_value                        |
| key_value_expire                 |
| locale_file                      |
| locales_location                 |
| locales_source                   |
| locales_target                   |
| menu_link_content                |
| menu_link_content_data           |
| menu_link_content_field_revision |
| menu_link_content_revision       |
| menu_tree                        |
| node                             |
| node__body                       |
| node__comment                    |
| node__field_image                |
| node__field_tags                 |
| node_access                      |
| node_field_data                  |
| node_field_revision              |
| node_revision                    |
| node_revision__body              |
| node_revision__comment           |
| node_revision__field_image       |
| node_revision__field_tags        |
| path_alias                       |
| path_alias_revision              |
| queue                            |
| router                           |
| search_dataset                   |
| search_index                     |
| search_total                     |
| semaphore                        |
| sequences                        |
| sessions                         |
| shortcut                         |
| shortcut_field_data              |
| shortcut_set_users               |
| taxonomy_index                   |
| taxonomy_term__parent            |
| taxonomy_term_data               |
| taxonomy_term_field_data         |
| taxonomy_term_field_revision     |
| taxonomy_term_revision           |
| taxonomy_term_revision__parent   |
| user__roles                      |
| user__user_picture               |
| users                            |
| users_data                       |
| users_field_data                 |
| watchdog                         |
+----------------------------------+
76 rows in set (0.001 sec)

MariaDB [drupal]>

Vemos que la copia se ha restaurado correctamente.

En servidor1 desinstalamos el servidor de base de datos y borramos todos sus datos:

apt remove --purge mariadb-server mariadb-client -y && apt autoremove -y

Probamos a acceder a la página de Drupal ahora:

Obviamente, no podemos acceder a la web, ya que ahora mismo no se encuentra conectada a ninguna base de datos.

En este punto, queremos volver a tener disponible nuestra web de Drupal, pero funcionando con la base de datos en la nueva máquina, es decir, en maquina2.

Tenemos que cambiar la configuración de Drupal, para ello nos dirigimos al fichero que se encuentra en la ruta /srv/www/drupal-9.1.0/sites/default/settings.php de la máquina servidor1, y al final del archivo, se encuentra la configuración de la base de datos que utiliza Drupal. Como es obvio, está configurada como que la base de datos está en el mismo equipo, por tanto está configurado en localhost. Aquí viene el primer cambio, pues debemos remover localhost y sustituirlo por la IP de la máquina donde se encuentra la nueva base de datos sobre la que va a funcionar Drupal, que es la 192.168.30.30.

$databases['default']['default'] = array (
  'database' => 'drupal',
  'username' => 'drupal',
  'password' => 'contraseña',
  'prefix' => '',
  'host' => '192.168.30.30',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

Una vez hecho esto, tendríamos que dirigirnos a la máquina donde hemos migrado la copia de seguridad, es decir la llamada maquina2, y tenemos que permitirle el acceso remoto a la base de datos.

El primer paso es editar el fichero de configuración que se encuentra en /etc/mysql/mariadb.conf.d/50-server.cnf y tenemos que editar, y en caso de estar comentadas la línea bind-address. En esta línea, tenemos que cambiar la IP, ya que por defecto aparece la de localhost, y esto hace que el servidor esté configurado para que solo escuche peticiones de localhost. Si queremos que escuche las peticiones de todas las interfaces de red, la línea debe quedar así:

bind-address            = 0.0.0.0

En último lugar, vamos a permitirle tanto a nuestro usuario drupal, como a root, que puedan ser accesibles desde otros equipos.

root@buster:~# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 61
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'contraseña' WITH GRANT OPTION;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'drupal'@'%' IDENTIFIED BY 'contraseña' WITH GRANT OPTION;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

Reiniciamos el servidor:

systemctl restart mysqld

Accedemos a la dirección www.javierperezhidalgo-drupal.org para ver si ya vuelve a funcionar:

Ya podemos acceder de nuevo a nuestro sitio web Drupal que esta vez está utilizando una base de datos que se encuentra en otra máquina.

Tarea 4: Instalación de otro CMS PHP

He decidido elegir el CMS llamado Anchor. Este CMS cuenta con una interfaz de usuario muy simple. Instalar Anchor nos llevará muy poco tiempo. Soporta Markdown editor, campos personalizados, múltiples idiomas y la posibilidad de instalar múltiples temas.

Si nos ayudamos de la página oficial de Anchor, la descarga la podemos realizar desde aquí.

Como antes para realizar la migración, desinstalé MySQL de la máquina servidor1, voy a volver a realizar la instalación y configuración, esta vez sin tantos detalles.

root@buster:~# apt install mariadb-server mariadb-client -y

root@buster:~# mysql_secure_installation

...

Creamos el usuario anchor de la base de datos y le otorgamos los permisos:

root@buster:~# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 44
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE anchor;
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> CREATE USER anchor IDENTIFIED BY 'contraseña';
Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON anchor. * TO 'anchor';
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> exit
Bye

Necesitamos instalar composer en el sistema, que es un administrador de dependencias PHP. También necesitamos tener instalado el paquete git, ya que nos hará falta durante la instalación:

apt install composer git -y

Descargamos y creamos la página de Anchor utilizando composer con el comando:

root@buster:/srv/www# composer create-project anchorcms/anchor-cms
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? yes
Creating a "anchorcms/anchor-cms" project at "./anchor-cms"
Installing anchorcms/anchor-cms (0.12.7)
    Failed to download anchorcms/anchor-cms from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing anchorcms/anchor-cms (0.12.7) into cache
  - Installing anchorcms/anchor-cms (0.12.7): Cloning 08e8e50790 from cache
Created project in /srv/www/anchor-cms


  [Composer\Json\JsonValidationException]                    
  "./composer.json" does not match the expected JSON schema  


create-project [-s|--stability STABILITY] [--prefer-source] [--prefer-dist] [--repository REPOSITORY] [--repository-url REPOSITORY-URL] [--add-repository] [--dev] [--no-dev] [--no-custom-installers] [--no-scripts] [--no-progress] [--no-secure-http] [--keep-vcs] [--remove-vcs] [--no-install] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--ask] [--] [package] [directory] [version]

Antes de pasar con el error del que nos ha informado, he cambiado el nombre del directorio:

root@buster:/srv/www# mv anchor-cms anchor

Si nos fijamos, nos ha reportado un mensaje de error. Nos indica que ha detectado un fallo en el fichero composer.json. Para solucionar este error, debemos editar el fichero:

root@buster:/srv/www/anchor# nano composer.json

En la línea que hace referencia al tipo, debemos cambiar el valor, que por defecto viene CMS, debemos indicar el tipo con letras minúsculas, de forma que quede así:

"type": "cms"

Corremos el instalador de nuevo:

root@buster:/srv/www/anchor# composer install
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? yes
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update \<package name\>`.
Package operations: 13 installs, 0 updates, 0 removals
    Failed to download indigophp/hash-compat from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing indigophp/hash-compat (v1.1.0) into cache
    Failed to download ircmaxell/password-compat from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing ircmaxell/password-compat (v1.0.4) into cache
    Failed to download ircmaxell/security-lib from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing ircmaxell/security-lib (v1.1.0) into cache
    Failed to download ircmaxell/random-lib from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing ircmaxell/random-lib (v1.2.0) into cache
    Failed to download peridot-php/leo from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing peridot-php/leo (1.6.1) into cache
    Failed to download symfony/polyfill-mbstring from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing symfony/polyfill-mbstring (v1.7.0) into cache
    Failed to download psr/log from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing psr/log (1.0.2) into cache
    Failed to download symfony/debug from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing symfony/debug (v4.0.5) into cache
    Failed to download symfony/console from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing symfony/console (v3.4.5) into cache
    Failed to download phpunit/php-timer from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing phpunit/php-timer (1.0.9) into cache
    Failed to download peridot-php/peridot-scope from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing peridot-php/peridot-scope (1.3.0) into cache
    Failed to download evenement/evenement from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing evenement/evenement (v2.1.0) into cache
    Failed to download peridot-php/peridot from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
    Now trying to download from source
  - Syncing peridot-php/peridot (1.19.0) into cache
  - Installing indigophp/hash-compat (v1.1.0): Cloning 43a19f4209 from cache
  - Installing ircmaxell/password-compat (v1.0.4): Cloning 5c5cde8822 from cache
  - Installing ircmaxell/security-lib (v1.1.0): Cloning f3db6de12c from cache
  - Installing ircmaxell/random-lib (v1.2.0): Cloning e9e0204f40 from cache
  - Installing peridot-php/leo (1.6.1): Cloning 2a6f60f237 from cache
  - Installing symfony/polyfill-mbstring (v1.7.0): Cloning 78be803ce0 from cache
  - Installing psr/log (1.0.2): Cloning 4ebe3a8bf7 from cache
  - Installing symfony/debug (v4.0.5): Cloning 1721e4e7ef from cache
  - Installing symfony/console (v3.4.5): Cloning 067339e9b8 from cache
  - Installing phpunit/php-timer (1.0.9): Cloning 3dcf38ca72 from cache
  - Installing peridot-php/peridot-scope (1.3.0): Cloning b5cc7ac35b from cache
  - Installing evenement/evenement (v2.1.0): Cloning 6ba9a77787 from cache
  - Installing peridot-php/peridot (1.19.0): Cloning 1c573868d8 from cache
Generating autoload files

Ahora sí hemos instalado correctamente Anchor como nuestro CMS.

Hemos otorgado a www-data como dueño del directorio y su contenido al servidor web.

root@buster:/srv/www/anchor# chown -R www-data:www-data /srv/

Solo nos quedaría configurar nuestro servidor web Apache para que sirviera la web. Para ello vamos a generar un fichero de configuración para Anchor:

root@buster:/etc/apache2/sites-available# cp javierperezhidalgo-drupal.conf anchor.conf

root@buster:/etc/apache2/sites-available# nano anchor.conf

Dentro de este fichero especificamos la dirección de la web (ServerName) y el DocumentRoot, quedaría así:

<\VirtualHost *:80\>

        ServerName www.javierperezhidalgoanchor.org

        ServerAdmin webmaster@localhost
        DocumentRoot /srv/www/anchor

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

<\/VirtualHost\>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

Habilitamos el sitio web para que Apache lo muestre y reiniciamos el servidor, como siempre hay que hacer cuando hagamos un cambio:

root@buster:/etc/apache2/sites-available# a2ensite anchor.conf

Por último, añadimos esta línea al fichero /etc/hosts del equipo anfitrión para que podamos ver la web en nuestro navegador.

192.168.30.15   www.javierperezhidalgoanchor.org

Introducimos en el navegador la dirección www.javierperezhidalgoanchor.org y nos saldrá el instalador de Anchor:

Vamos a realizar una instalación rápida, ya que es muy parecido al proceso que hemos realizado para Drupal.

En primer lugar indicamos el idioma y la zona horaria:

Especificamos la base de datos que va utilizar. La que previamente hemos creado en MySQL:

Configuramos el nombre de la página, la descripción, …

Creamos la cuenta administradora del sitio web:

Y con esto ya hemos terminado la instalación de Anchor.

Así luce nuestra nueva página:

Hemos terminado la instalación de Anchor, pero me gustaría hacer una modificación. Y no es más, sino que volver a migrar nuestra base de datos a nuestra segunda máquina, es decir, a la maquina2, para así acceder a la base de datos remotamente.

Volvemos a repetir el mismo proceso que realizamos con Drupal, y en primer lugar, vamos a realizar una copia de seguridad y a copiarla a la segunda máquina:

root@buster:~# mysqldump -u anchor -p anchor > copiaseguridadanchor.sql

root@buster:~# ls
copiaseguridadanchor.sql  copiaseguridaddrupal.sql

Le pasamos dos parámetros: la opción -u indica el nombre de usuario y la opción -p el nombre de la base de datos.

En este punto, ya podríamos desinstalar la base de datos existente en la máquina llamada servidor1.

apt remove --purge mariadb-server mariadb-client -y && apt autoremove -y

Si probamos a acceder ahora a nuestra web Anchor:

Vemos como efectivamente hemos eliminado correctamente la base de datos.

Hecho esto, en la maquina2, vamos a crear la base de datos y el usuario anchor.

root@buster:~# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 39
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE anchor;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> CREATE USER 'anchor' IDENTIFIED BY 'contraseña';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON anchor.* TO 'anchor';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

Copiamos el nuevo archivo a la maquina2, donde vamos a restaurar la copia de seguridad con el siguiente comando:

root@buster:~# mysql -u anchor -p anchor < copiaseguridadanchor.sql
Enter password:

root@buster:~#

Vamos a comprobar como efectivamente hemos restaurado todos los datos:

root@buster:~# mysql -u anchor -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 41
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| anchor             |
| information_schema |
+--------------------+
2 rows in set (0.001 sec)

MariaDB [(none)]> use anchor;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [anchor]> show tables;
+----------------------+
| Tables_in_anchor     |
+----------------------+
| anchor_categories    |
| anchor_category_meta |
| anchor_comments      |
| anchor_extend        |
| anchor_meta          |
| anchor_page_meta     |
| anchor_pages         |
| anchor_pagetypes     |
| anchor_post_meta     |
| anchor_posts         |
| anchor_sessions      |
| anchor_user_meta     |
| anchor_users         |
+----------------------+
13 rows in set (0.001 sec)

MariaDB [anchor]>

Vemos que sí. Y por último, nos queda configurar nuestro CMS para que haga uso de esta base de datos. Para esto nos tenemos que dirigir al fichero db.php, que se encuentra en la ruta /srv/www/anchor/anchor/config/db.php de la máquina donde tenemos instalado nuestro CMS, es decir, en servidor1.

En él, nos encontraremos la configuración de la base de datos asociada al CMS. Ajustamos los nuevos parámetros que necesitamos, cambiando la dirección de la base de datos y estableciendo la IP de nuestra segunda máquina:

<?php

return [
    'default'     => 'mysql',
    'prefix'      => 'anchor_',
    'connections' => [
        'mysql' => [
            'driver'   => 'mysql',
            'hostname' => '192.168.30.30',
            'port'     => '3306',
            'username' => 'anchor',
            'password' => 'contraseña',
            'database' => 'anchor',
            'charset'  => 'utf8mb4'
        ]
    ]
];

Hecho esto, vamos a reiniciar nuestro servidor web y a comprobar que nuestro CMS vuelve a funcionar:

La respuesta es afirmativa, por tanto habríamos terminado el ejercicio.

Instalación de un CMS PHP que no utiliza base de datos

También voy a instalar un CMS llamado Pico. No tiene un backend para editar los datos (aunque existe un plugin para ello). No utiliza consultas a la base de datos, por lo tanto, es súper rápido. Es compatible con el formato Markdown y las plantillas twig.

Vamos a proceder a instalarlo.

Si nos ayudamos de la página oficial de Pico, la descarga la podemos realizar clonando un repositorio de GitHub. Por tanto necesitamos el paquete git en nuestro sistema:

apt install git -y

Clonamos el repositorio en /srv/www:

root@buster:/srv/www# git clone https://github.com/picocms/Pico.git

Hemos otorgado al usuario www-data como dueño del directorio y su contenido al servidor web.

root@buster:/srv/www# chown -R www-data:www-data /srv/

Descargamos el instalador y lo lanzamos mediante los siguientes comandos:

root@buster:/srv/www# apt install composer -y

...

root@buster:/srv/www# php composer.phar create-project picocms/pico-composer pico

...

Hemos instalado el CMS Pico. Solo nos quedaría configurar Apache para que sirva este sitio web en la dirección www.javierperezhidalgopico.com. Primero creamos el fichero de configuración en /etc/apache2/sites-available, lo voy a llamar pico.conf. Añado las siguientes líneas:

<\VirtualHost *:80\>

        ServerName www.javierperezhidalgopico.org

        ServerAdmin webmaster@localhost
        DocumentRoot /srv/www/pico

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

<\/VirtualHost\>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

Habilitamos el despliegue de la página:

root@buster:/etc/apache2/sites-available# a2ensite pico.conf

Reiniciamos el servicio:

systemctl restart apache2

Acabamos de lanzar nuestra página en Pico, si queremos visualizarla en nuestra máquina anfitriona, añadimos la siguiente línea al fichero /etc/hosts:

192.168.30.15   www.javierperezhidalgopico.org

Nos dirigimos a la web www.javierperezhidalgopico.org:

Ya hemos instalado Pico y habríamos terminado con este post.