Hoy os quiero explicar algo que he tenido que hacer estos días atrás y que creo que es interesante dejarlo documentado. Mi servidor Freya que es donde tengo mis webs y servicios funcionando, tiene Debian 8 y quería actualizar a Debian 9. Se podría actualizar sin problemas, pero ya que voy a tener Debian 9, pues mejor tener un Debian «virgen».

Todo este proceso va a ser bastante fácil de hacer por varios motivos. El primero es por como configuré mi servidor anteriormente, que hace que la migración sea bastante sencilla como veréis después. En segundo es que el servidor está ubicado en la empresa Clouding.io, una empresa ubicada en Barcelona. En Clouding.io podremos gestionar diferentes servidores con diferentes distribuciones de GNU/Linux (CentOS, Debian y Ubuntu) por un precio bastante económico y, según tengo entendido, parece que van a cambiar precios y será más barato que otros servicios de VPS en la nube. Una de las características estrella de Clouding es la opción de redimensionar recursos (RAM y CPU) siempre que lo necesites, si necesitas más RAM en un momento dado, en 3 clics tienes el servidor con más RAM (ojo, requiere reiniciar).

Para esta migración he usado mucho la opción de instantáneas del servidor (snapshots) y es que es la mejor manera de realizar cambios sin tener miedo de fastidiarlo todo. Si realizas algo mal, simplemente restauras ese punto de la instantánea guardada y vuelves a empezar. Por otro lado, también podemos gestionar copias de seguridad del servidor, pero por suerte no he tenido que usar esa opción 😛

Por otro lado, comentar también que el servicio técnico de Clouding.io es de 10, tanto si llamas como si envías un e-mail con alguna consulta trataran de ayudarte en todo lo que puedan y lo pueden hacer en castellano, catalán o inglés. Así que si estáis mirando de cambiar de proveedor o buscando uno nuevo, no dudéis, formad parte de la familia de Clouding.io porque no os vais a arrepentir! 😀

Nota Importante

Tras la actualización de Debian 9, hay que tener en cuenta un par de cosas. Una de ellas es muy importante: el paquete mysql-server ya no está en Debian 9, ya que se pasa a usar MariaDB. Eso significa, que se introduce un nuevo formato de archivo de datos binarios de base de datos que no es retrocompatible con el formato de base de datos actual (Debian 8 Jessie).

Por lo tanto, tendremos que exportar manualmente las bases de datos y luego importarlas a MariaDB. Por si no fuera poco, también tenemos que tener en cuenta que en Debian 8 se utiliza PHP 5.3 y que en Debian 9 la versión de PHP se actualiza a 7.0, por lo que es posible que alguna web tenga problemas de visualización.

Tras explicar estas características de la migración, pasamos a explicar como hacerlo punto por punto.

Pasos previos a instalar el servidor web

Lo primero que vamos hacer en el servidor es crearnos un usuario para poder acceder sin tener que usar root como usuario por defecto.

adduser nombreusuario

Lo añadimos al grupo de sudoers, editando el fichero /etc/sudoers:

User privilege specification
root ALL=(ALL:ALL) ALL
nombreusuario ALL=(ALL:ALL) ALL

Luego tendremos que añadir root y nuestro usuario nuevo como únicos usuarios que pueden iniciar sesión por SSH, para ello tendremos que editar /etc/ssh/sshd_config:

PermitRootLogin yes
AllowUsers nombreusuario root
MaxAuthTries 2
MaxStartups 3

Reiniciamos el servicio de SSH, y nos volvemos a loguear por SSH con nuestro usuario:

systemctl restart ssh
ssh nombreusuario@IP_servidor

Que tenemos que migrar

Lo que voy a tener que migrar, entre otras cosas que no voy a comentar, son mis tres proyectos que todos ya conocéis: PortalLinux, PlanetLibre y _voidNull. Además también voy a tener que migrar un NextCloud que tengo que he tenido que instalar de nuevo porque no he sido capaz de solucionar un problema que me daba tras actualizar a su última versión. Así que aprovecharé eso para crear otro artículo para explicar como instalar NextCloud en un VPS.

De este modo, lo que vamos a migrar principalmente, serán 3 WordPress y un NextCloud, así que tampoco es una migración muy compleja.

Software a instalar

En el servidor tendremos qune instalar varios paquetes para que realice la función de servidor web. Lo primero que hay que hacer, actualizar repositorios e instalar actualizaciones:

apt-get update
apt-get upgrade

Instalamos aptitude, git, htop y zip:

apt-get install aptitude git htop zip

Instalamos el servidor web Apache2 y lo habilitamos al arranque:

apt-get install apache2
systemctl enable apache2

Instalamos PHP para que funcionen las webs, en esta ocasión instalaremos PHP 7.0:

apt-get install php7.0 libapache2-mod-php7.0 php7.0-mysql php7.0-mbstring php7.0-curl php7.0-zip php7.0-dom php7.0-simplexml php7.0-xml php7.0-xml php7.0-gd php7.0-memcached

Finalmente, instalamos mariadb-server y lo habilitamos al arranque:

apt-get install mariadb-server
systemctl enable mysql

Securizamos MariaDB:

mysql_secure_installation

Ahora nos conectamos a MariaDB para crear un usuario y poder iniciar sesión desde phpMyAdmin:

mysql –user=root mysql

Y creamos un usuario para iniciar sesión desde fuera:

CREATE USER ‘phpmyadmin’@’localhost’ IDENTIFIED BY ‘PASSWORD’;
GRANT ALL PRIVILEGES ON *.* TO ‘phpmyadmin’@’localhost’ WITH GRANT OPTION;
FLUSH PRIVILEGES;

Migrar contenido al nuevo servidor

Es el momento de copiar todo el contenido al nuevo servidor. Para ello usaremos el comando rsync que permite la transmisión eficiente de datos entre servidores.

Lo primero que haremos serà copiar el directorio /var/www/html/vhosts que es donde están todas las webs alojadas (tanto este blog, como PlanetLibre o PortalLinux entre otros). Así que desde Debian 8:

rsync -a /var/www/html/vhosts root@46.183.XXX.XXX:/var/www/html

Una vez hemos copiado todos los datos es el turno de las bases de datos, primero exportamos las bases de datos en Debian 8:

mysqldump -u root -p –all-databases > alldb.sql

Lo copiamos a Debian 9:

rsync alldb.sql root@46.183.XXX.XXX:/root

Y ahora importamos las bases de datos en Debian 9:

mysql -u root < alldb sql

Configuración Apache

Lo que vamos hacer es copiar los VirtualHosts al nuevo servidor:

rsync -a /etc/apache2/sites-available/* root@46.183.XXX.XXX:/etc/apache2/sites-available/

También copiaremos el fichero con el usuario y contraseña usado para los espacios protegidos de Apache2:

rsync -a /etc/apache2/htpasswd root@46.183.XXX.XXX:/etc/apache2/htpasswd

También habilitaremos módulos del Apache2 que necesitemos:

a2enmod rewrite headers

Configurando SSL

Lo primero que hacemos es instalar Certbot para generar certificados SSL firmados por Let’s Encrypt:

apt-get install certbot python-certbot-apache

Hasta que no tengamos nuestros dominios apuntando al servidor no podremos crear el certificado, por lo que no se podrá activar HTTPS, por eso, copiaremos los certificados ya creados y luego los renovaremos:

rsync -a /etc/letsencrypt/ root@46.183.XXX.XXX:/etc/letsencrypt

También habilitamos el módulo de Apache2 para SSL:

a2enmod ssl

Cambiar registros del DNS

Ha llegado el turno de cambiar las IP’s del DNS, lo iremos haciendo aplicación por aplicación, e iremos comprobando que todo funciona correctamente.

Por ejemplo, primero empezaré por habilitar phpMyAdmin:

cd /etc/apache2/sites-available
a2ensite phpmyadmin.conf
systemctl reload apache2

Una vez hemos realizado esto, cambiamos la IP del registro tipo A de nuestra zona DNS y podremos acceder sin problemas por el navegador.

Este proceso lo repetimos con todas las webs que tengamos.

Regenerar certificados SSL con Let’s Encrypt

Para evitar problemas de renovación de certificados, lo que haremos será forzar manualmente la regeneración del certificado para ver que la próxima vez que se renueve de manera automática con un cron funcione correctamente y no tengamos sorpresas.

Primero de todo, añadimos en cron que renueve cada 30 días:

30 2 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log

Ahora ejecutramos lo siguiente para comprobar si hay algún certificado que se pueda renovar:

letsencrypt renew

Obtendremos una salida similar a esta:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
——————————————————————————-
Processing /etc/letsencrypt/renewal/www.XXXXX.conf
——————————————————————————-
Cert not yet due for renewal

Si todo es correcto, no debería de mostrar ningún error, por lo que los certificados se renovarán correctamente solos.

Securizamos servidor

Desactivamos root para que se pueda conectar por SSH y añadimos nuestro usuario como único usuario que se pueda conectar por SSH, para ello tendremos que editar /etc/ssh/sshd_config:

PermitRootLogin no
AllowUsers nombreusuario
MaxAuthTries 2
MaxStartups 3

Reiniciamos el servicio de SSH, y volveremos a iniciar sesión por SSH con nuestro usuario:

systemctl restart ssh
ssh nombreusuario@IP_servidor

Conclusiones

Como hemos podido observar el cambio del servidor no ha sido una tarea muy complicada debido a la buena configuración que ya tenía de antes. Por eso es importante realizar configuraciones e instalaciones correctas y bien pensadas en el futuro. Si bien es cierto, algunos paneles de estos que permiten administrar servidores permiten una migración más fácil, aunque nos podemos llevar más sorpresas de las deseadas. Como por ejemplo que de una versión a otra no sirvan los mismos backups de las webs, como ha pasado hac epoco con VestaCP (si servidor de correo es VestaCP).

Yo siempre he sido un anti-paneles administrativos básicamente porque es más facil acceder por SSH y hacer lo que se tenga que hacer, ya sea instalar algo nuevo o bien solucionar algún problema. Y sobretodo usar scripts para hacer de todo, los VirtualHosts al principio en el servidor antiguo los cree desde un script sencillo que configuraba toda la web nueva.

Comentar finalmente que esta migración me ha llevado exactamente 5 horas de trabajo que han sido repartidas en dos días, ya que también iba escribiendo este post a medida que iba migrando webs. Y respecto al servidor antiguo, aún no lo voy a borrar hasta que no pasen dos meses, para asegurarme que todo funciona correctamente y que no me falta nada por copiar.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación