Este es el segundo artículo referente a la configuración del VPS, una máquina virtual contratada en OVH que cuenta con un direccionamiento público 51.210.109.246. Además, se ha contratado una zona DNS en la que nombraremos dicha máquina junto a los servicios que despleguemos, en el dominio iesgn19.es.
La intención es la de ir desarrollando a lo largo del curso una serie de posts en los que se detallen las configuraciones llevadas a cabo en dicho VPS, así como el mantenimiento de las mismas. En el día de hoy, vamos a migrar un sitio Drupal que fue anteriormente instalado, para así desplegarlo en la VPS, además de un sitio Nextcloud, que instalaremos y migraremos.
Se recomienda realizar una previa lectura del post Instalación de un servidor LEMP, pues en este artículo se tratarán con menor profundidad u obviarán algunos aspectos vistos con anterioridad.
Tarea 1: Drupal
Crea un nuevo VirtualHost accesible con el nombre portal.iesgn19.es.
El primer paso será crear el DocumentRoot para dicho VirtualHost. En este caso, he decidido que se encontrará en /srv/drupal, así que para llevar a cabo la creación de dicho directorio, ejecutaremos el comando (con permisos de administrador, ejecutando el comando sudo su -
):
Tras ello, modificaremos el usuario y el grupo propietario de dicho directorio a debian, pues nos será necesario más adelante. Para ello, haremos uso de chown
:
Para verificar que la creación se ha llevado a cabo correctamente y que el usuario y el grupo propietario han sido modificados, listaremos el contenido de /srv/, haciendo uso del comando ls -l
:
Efectivamente, el directorio ha sido generado y su usuario y grupo propietario correctamente modificados, así que tras ello, tendremos que crear el correspondiente fichero de configuración para el sitio web, que se encuentra en /etc/nginx/sites-available/, así que nos moveremos a dicho directorio ejecutando el comando:
Tras ello, listaremos el contenido de dicho directorio haciendo uso de ls
:
En este caso, y para no complicarnos, vamos a copiar el fichero iesgn19 creado con anterioridad, para así tener una plantilla base que posteriormente modificaremos y adaptaremos al sitio web que vamos a crear. Para ello, ejecutaremos el comando:
Para verificar que el fichero se ha copiado correctamente, volveremos a listar el contenido de dicho directorio haciendo uso de ls
:
Ya está todo listo para modificar el fichero drupal, que contendrá la configuración de nuestro nuevo VirtualHost, ejecutando para ello el comando:
Si recordamos, en apache2 hacíamos uso de un fichero .htaccess que contenía una determinada configuración para el VirtualHost que no había sido previamente definida en el propio fichero de configuración, pero ésta funcionalidad no existe en nginx, por lo que tendremos que buscar una alternativa para que las directivas que se incluían en el interior del .htaccess (necesarias para el correcto funcionamiento del CMS), sigan aplicándose.
Para ello, tras leer documentación al respecto, la propia página de nginx nos proporciona una plantilla de configuración para el VirtualHost en caso de que vayamos a alojar un sitio Drupal, que contiene aquellas directivas necesarias para solventar la falta del .htaccess, como por ejemplo evitar que se sirvan determinados ficheros sensibles, establecer las URL limpias…
Tras adaptar dicha plantilla al sitio que vamos a crear, el resultado sería (eliminando líneas comentadas para dejar una salida más limpia):
Tras ello, guardaremos los cambios en el mismo.
Una vez realizadas todas las configuraciones oportunas, es hora de habilitar el VirtualHost. Para ello, a diferencia de apache2 que contaba con una utilidad para ello, tendremos crear el enlace simbólico al fichero de configuración ubicado en /etc/nginx/sites-available/ dentro de /etc/nginx/sites-enabled/ de forma manual. Para ello, ejecutamos el comando:
Al parecer, el sitio ha sido correctamente habilitado, pero para activar la nueva configuración, tendremos que volver a cargar la configuración del servicio nginx, ejecutando para ello el comando:
Una vez que la configuración del servicio se ha vuelto a cargar, vamos a listar el contenido de /etc/nginx/sites-enabled/ para verificar que el correspondiente enlace simbólico ha sido correctamente creado. Para ello, ejecutaremos el comando:
Efectivamente, los tres sitios se encuentran actualmente activos.
Antes de tratar de acceder al sitio, tendremos que llevar a cabo las correspondientes modificaciones en la zona DNS para que se pueda llevar a cabo la resolución. Para ello tendremos que tener la máquina virtual (VPS) nombrada con un registro A, que traduce nombres a direcciones IPv4 (en mi caso, ya la tenía previamente nombrada como vps), de la siguiente forma:
Tras ello, crearemos un registro CNAME para nombrar el servicio que apunte al registro A anteriormente creado, en este caso, con nombre portal, de la siguiente forma:
Como se puede apreciar, las máquinas las nombraremos con registros A y tras ello, crearemos registros CNAME que apunten a dichas máquinas para nombrar a los servicios, de manera que en caso de que se lleve a cabo un cambio de dirección IP, tendremos que modificar un único registro A para la máquina, y no para todos los registros de los servicios que se encuentren alojados en la misma, ya que estarán apuntando a dicho registro A, por lo que el cambio se efectúa en todas ellas.
Es posible que la propagación del cambio tarde hasta 24 horas, pues necesario que expire la caché de los servidores DNS que conocían dicho nombre de dominio, para que así vuelvan a realizar la petición y reciban la nueva dirección IP.
Tras esperar un rato, accedí a portal.iesgn19.es desde el navegador y el resultado fue el siguiente:
Como era de esperar, el nuevo VirtualHost ha funcionado correctamente, a pesar de habernos mostrado un error 403 (Forbidden), ya que actualmente no tiene disponible ningún fichero por defecto a servir (directiva index), ni tampoco tiene permiso para mostrar la lista de ficheros disponibles (directiva autoindex).
Nombra y configura el servicio de base de datos en producción.
En este caso, y tal y como configuramos en el anterior artículo, la base de datos se va a encontrar en la misma máquina que el resto de servicios. Al tratarse de un servicio interno (que no pretendemos que sea accesible desde el exterior), no tendría sentido nombrarlo en la zona DNS, así que lo nombraremos utilizando resolución estática.
Realmente, podríamos hacer la tarea perfectamente sin nombrar dicho servicio de forma estática y en su lugar, utilizar la dirección IP, pero en un futuro, si el servidor de bases de datos cambiase de máquina o de dirección IP, bastaría con modificar la línea correspondiente a dicha resolución estática, al estar centralizado, en lugar de tener que ir realizando dicha modificación en todas aquellas aplicaciones que necesiten acceder a la base de datos en cuestión. Para llevar a cabo dicha configuración, tendremos que modificar el fichero /etc/hosts, ejecutando para ello el comando:
Dentro del mismo, tendremos que añadir una línea de la forma [IP] [Nombre] para el nuevo sitio que hemos creado, siendo [IP] la dirección IP de la máquina servidora (en este caso, la dirección IP local, es decir, 127.0.0.1) y [Nombre] el nombre de dominio que vamos a resolver posteriormente (en este caso he usado bd.iesgn19.es), de manera que la configuración final sería la siguiente:
Tras ello, probaremos a hacer un ping
a dicho nombre, para así verificar que resuelve correctamente y alcanza a nuestra máquina de manera local, pues al fin y al cabo, sería lo mismo que tratar de alcanzar a localhost:
Efectivamente, la resolución se ha llevado a cabo correctamente, así que el siguiente paso será configurar lo necesario en la base de datos para alojar la aplicación Drupal.
Lo primero que debemos hacer es acceder al servidor mysql, ejecutando para ello el comando:
Donde:
- -u: Indica el usuario con el que nos vamos a conectar, en este caso, root.
- -p: Indicamos la contraseña, en este caso, no introducimos ninguna, ya que vamos a acceder por Socket UNIX, tal y como hemos configurado en el anterior artículo.
Una vez dentro del servidor de bases de datos, tendremos que crear una nueva base de datos, valga la redundancia. En este caso, para identificarla fácilmente, de nombre bd_drupal. Para ello, ejecutamos el comando:
Para verificar que la nueva base de datos ha sido correctamente creada, ejecutaremos el comando:
La base de datos que usará Drupal se encuentra ya creada, pero de nada nos sirve tener una base de datos si no tenemos un usuario que pueda acceder a la misma. En este caso, vamos a crear un usuario de nombre “user_drupal” que tenga permitido el acceso desde localhost (es decir, desde la máquina local) y cuya contraseña sea “pass_drupal” (lógicamente, en un caso real se usarían credenciales más seguras). Para ello, haremos uso del comando:
El usuario ya ha sido generado, pero todavía no tiene permisos sobre la base de datos que acabamos de crear, así que debemos otorgarle dichos privilegios. Para ello, ejecutaremos el comando:
Una vez realizadas todas las modificaciones oportunas, podremos salir de mysql haciendo uso del comando:
Nota: No es necesario hacer uso del comando FLUSH PRIVILEGES;
, a diferencia de varios artículos que he estado leyendo en Internet, que usan dicho comando muy a menudo sin necesidad alguna. Dicho comando, lo que hace es recargar la caché de las tablas GRANT que se encuentran en memoria, recarga que se hace de forma automática al hacer uso de una sentencia GRANT, de manera que no es necesario hacerlo manualmente. Para aclararlo, dicho comando únicamente debe utilizarse tras modificar las tablas GRANT de manera indirecta, es decir, tras usar sentencias INSERT, UPDATE o DELETE.
Realiza la migración de la aplicación.
Antes de comenzar a migrar Drupal, quiero dejar claro la estructura actualmente existente en mi entorno de desarrollo, compuesto por dos máquinas:
- cms: La máquina principal y expuesta, que tiene alojado un servidor web apache2 y un servidor de aplicaciones PHP, que se encuentra unificado con el servidor web, al tratarse de un módulo de apache2 que proporciona dicha funcionalidad.
- backup: La máquina no expuesta, que tiene alojado un servidor de bases de datos MySQL/MariaDB, a la que accede la máquina principal mediante peticiones a la misma, concretamente a una base de datos de nombre drupalbackup.
Lo primero que tendremos que hacer para llevar a cabo la migración es una copia de seguridad de la base de datos, que en el caso de mysql, se nos ofrece una funcionalidad que lleva a cabo dicha función, mysqldump. Gracias a la misma, se nos generará un fichero que contendrá todas las instrucciones necesarias para dejar la base de datos en cuestión tal y como está actualmente, fichero que posteriormente importaremos en la otra máquina, así que empezaremos trabajando con la máquina backup.
En este caso, voy a generar dentro del directorio raíz un fichero de nombre backup-file.sql que contenga la copia de seguridad de la base de datos drupalbackup (aunque en realidad podríamos hacerlo en cualquier otro directorio, intentando evitar siempre el DocumentRoot de la página web, ya que en ese caso, se podría solicitar ese recurso y sería servido por nginx, algo totalmente inseguro). Para ello, ejecutaremos el comando:
Para verificar que la copia de seguridad se ha generado correctamente, vamos a listar el contenido de dicho directorio (raíz), filtrando por el nombre backup:
Efectivamente, la copia de seguridad se ha generado correctamente en dicho directorio, así que procederemos a transferirla a la VPS, haciendo uso de scp
:
El fichero que contiene la copia de seguridad de la base de datos ya ha sido correctamente transferido al directorio personal de debian en la VPS, algo que sería totalmente inseguro en un entorno que no estuviese controlado, pero que en esta ocasión, no hay problema alguno. Ya hemos terminado el trabajo en la máquina backup, dando paso por lo tanto, a la máquina cms.
Dentro de ésta se encuentra la mayor parte de la migración, pues contiene el directorio con todos los ficheros y subdirectorios necesarios para el correcto funcionamiento de la aplicación, concretamente dentro de /srv/drupal, así que listaremos el contenido del mismo, ejecutando para ello el comando:
Podríamos copiar todos los ficheros y directorios de manera recursiva a la VPS, pero sería un trabajo poco organizado y lento, de manera que procederemos a comprimirlos, ya que los recursos del sistema se utilizan mucho mejor a la hora de transferir un único archivo, ya scp trabaja con ssh, un protocolo que cifra las transferencias, siendo mucho menos costoso computacionalmente cifrar un único fichero que cifrar miles. Para ello, ejecutaremos el comando:
Donde:
- -z: Utiliza gzip para comprimir el fichero.
- -c: Indica a tar que cree un fichero.
- -f: Indica a tar que el siguiente argumento es el nombre del fichero .tar.gz.
Para verificar que el fichero comprimido se ha generado correctamente, vamos a listar el contenido del directorio raíz, filtrando por el nombre drupal:
Efectivamente, el fichero comprimido se ha generado correctamente en dicho directorio, así que procederemos a transferirlo a la VPS, haciendo uso de scp
:
El fichero comprimido que contiene todos los ficheros y directorios del sitio Drupal ya ha sido correctamente transferido al DocumentRoot del VirtualHost en el que se alojará dicha aplicación en la VPS, concretamente a /srv/drupal, transferencia que ha sido posible llevar a cabo gracias a que previamente hemos modificado el usuario y grupo propietario de dicho directorio a debian, consiguiendo así que tenga los privilegios necesarios para escribir, pues es el usuario a través del cuál nos estamos conectando para realizar la transferencia. Ya hemos terminado el trabajo en ambas máquinas, así que volveremos a la VPS para finalizar la migración.
Una vez dentro de la VPS, procederemos a restaurar la copia de seguridad de la base de datos, pero previamente, para verificar que el fichero con la copia de seguridad ha sido correctamente transferido, listaremos el contenido del directorio personal de debian haciendo uso de ls -l
y estableciendo un filtro por nombre:
Efectivamente, el fichero con la copia de seguridad ha sido correctamente transferido, por lo que ya podremos importarlo a la base de datos creada con anterioridad. Para ello, únicamente inyectaremos el contenido del fichero a mysql, indicando la base de datos que deseamos recuperar. Además, por seguridad, eliminaremos posteriormente dicho fichero con la copia de seguridad, quedando de la siguiente forma:
Para verificar que el fichero ha sido correctamente eliminado, volveremos a listar el contenido del directorio personal de debian estableciendo a su vez un filtro por nombre, ejecutando para ello el comando visto con anteriordad:
Efectivamente, en ésta ocasión, el filtro no ha devuelto ningún resultado, ya que el fichero ha sido correctamente eliminado.
De nuevo, accederemos al servicio mysql para verificar que la base de datos ha sido correctamente restaurada:
Tras ello, nos conectaremos a la base de datos en cuestión, con la instrucción use
:
Como podemos apreciar en el último mensaje, nos hemos conectado a dicha base de datos, así que listaremos las tablas de la misma con la siguiente instrucción:
Efectivamente, la base de datos ha sido correctamente restaurada, pues contiene las 77 tablas previamente existentes en el entorno de desarrollo.
Ya hemos recorrido la mitad del camino, pues la base de datos está correctamente restaurada, pero todavía nos falta restaurar la aplicación como tal. Si recordamos, el DocumentRoot que iba a usar se encuentra en /srv/drupal, siendo éste el mismo directorio en el que se encuentra el fichero comprimido, así que nos moveremos dentro del mismo, haciendo uso de cd
:
Antes de seguir, vamos a volver a modificar el usuario y grupo propietario del directorio actual a www-data, pues es el usuario por defecto a través del cuál se sirven las en nginx, para que posteriormente no se nos olvide, pudiendo ocasionar un gran agujero de seguridad. Para ello, volveremos a hacer uso de chown
:
Para verificar que el usuario y grupo propietario han sido modificados, volveremos a listar el contenido de /srv/, haciendo uso del comando:
Como era de esperar, la modificación se ha llevado a cabo tal y como hemos especificado. Tras ello, listaremos el contenido del directorio actual para así verificar que el fichero comprimido ha sido correctamente transferido, ejecutando para ello el comando:
Efectivamente, el fichero comprimido ha sido correctamente transferido, por lo que ya podremos descomprimirlo para así obtener exactamente la misma estructura anteriormente existente en el entorno de desarrollo. Además, eliminaremos tras ello el fichero comprimido para así liberar espacio, ya que no nos va a ser necesario. Para ello, ejecutaremos el comando:
Donde:
- -z: Utiliza gzip para descomprimir el fichero.
- -x: Indica a tar que desempaquete el fichero.
- -f: Indica a tar que el siguiente argumento es el nombre del fichero .tar.gz.
Para verificar que se ha descomprimido correctamente y que además se ha eliminado de dicho directorio, haremos uso de ls -la
:
Como se puede apreciar, el fichero se ha descomprimido correctamente y tras ello, ha sido eliminado. Si nos fijamos con detenimiento, existe un fichero .htaccess que no vamos a utilizar, ya que estamos utilizando un servidor web nginx en lugar de apache2, de manera que podremos proceder a eliminarlo, pues no nos será necesario, ejecutando para ello el comando:
Actualmente, la web no funcionaría todavía ya que la máquina a la que está configurada para hacer las peticiones SQL no se encuentra operativa, por lo que tendremos que llevar a cabo las correspondientes modificaciones en el fichero oportuno para indicarle la nueva base de datos a la que ha de realizar las peticiones. Éste fichero se encuentra en /srv/drupal/sites/default/, con nombre settings.php, que modificaremos con nano
:
Dentro del mismo, nos desplazaremos al final del documento y encontraremos un bloque como el siguiente:
Como se puede apreciar, ahí se encuentran las credenciales de acceso y la base de datos a la que acceder (correspondiente a la máquina backup). En este caso, el nombre de la base de datos ha cambiado de drupalbackup a bd_drupal, el usuario ha cambiado de backupuser a user_drupal y la contraseña ha cambiado de usuario a pass_drupal. Nos queda una última modificación por hacer, y es que la base de datos ya no se encuentra en 10.0.0.5, sino en bd.iesgn19.es. El puerto en el que escucha las peticiones no ha variado, pues sigue siendo el 3306. La configuración final quedaría así:
Tras ello, guardaremos los cambios, y antes de tratar de acceder al sitio Drupal, tendremos que instalar aquellas librerías y extensiones que se requerieron en la instalación de la aplicación en el entorno de desarollo, con la finalidad de intentar que ambos entornos (desarrollo y producción) sean en todo momento lo más similares posibles. En este caso, instalaremos dichas librerías y extensiones ejecutando el comando:
Listo, ya hemos finalizado la migración, así que ha llegado la hora de la verdad. Para verificar si la migración ha sido realmente exitosa, accederemos desde el navegador al ServerName que hemos configurado para éste VirtualHost, es decir, a portal.iesgn19.es:
Efectivamente, el sitio web se ha mostrado correctamente y hemos podido hacer uso de las funcionalidades de la aplicación, como por ejemplo, autenticarnos, por lo que podemos asegurar que la migración se ha llevado a cabo de forma exitosa.
Tarea 2: Nextcloud
Instala la aplicación web Nextcloud en tu entorno de desarrollo.
Como el propio enunciado indica, la instalación la vamos a llevar a cabo sobre nuestro entorno de desarrollo (máquinas cms y backup), de manera que cambiaremos el chip para utilizar ahora apache2, hasta que realicemos la migración a la VPS, en la que volveremos a utilizar nginx.
En este caso, el nuevo VirtualHost lo voy a alojar dentro de /srv/, en un directorio de nombre nextcloud/, además de crear otro directorio fuera del DocumentRoot para que así no sea accesible, de nombre nextclouddata/, que contendrá los ficheros que se suban a dicha aplicación web, pues tiene la finalidad de una nube. Para llevar a cabo la creación de dichos directorios ejecutaremos el comando:
Una vez generados, tendremos que crear el fichero de configuración para dicho VirtualHost, así que para no complicarme, copiaré la plantilla del VirtualHost por defecto de apache2 de nombre 000-default:
Tras ello, lo modificaremos haciendo uso de nano
y estableceremos el DocumentRoot /srv/nextcloud y el ServerName www.alvaro-nextcloud.com, por ejemplo:
Una vez realizada la correspondiente configuración en el fichero, tendremos que habilitar el nuevo VirtualHost, ejecutando para ello el comando:
Tal y como se nos ha solicitado, vamos a volver a cargar la configuración del servicio apache2, haciendo uso del comando:
El siguiente paso consiste en añadir la correspondiente línea al fichero /etc/hosts de la máquina anfitriona para que lleve a cabo la resolución estatica de nombres y así poder acceder al nuevo VirtualHost, alojado en la máquina cms. Para ello, ejecutamos el comando:
Tras añadir la correspondiente línea, el resultado final es el siguiente:
La máquina anfitriona ya es capaz de realizar la resolución del nombre www.alvaro-nextcloud.com, pero todavía no tenemos ninguno de los ficheros necesarios para la instalación, así que nos moveremos al DocumentRoot, ejecutando para ello el comando:
Una vez dentro del mismo, haremos uso de wget
para descargar el paquete comprimido de Nextcloud, que podremos encontrar aquí:
Para verificar que el comprimido se ha descargado correctamente, haremos uso del comando ls -l
:
Efectivamente, se ha descargado un paquete de nombre “nextcloud-20.0.1.tar.bz2” con un peso total de 114.71 MB (120287967 bytes).
Al estar comprimido el fichero, no podemos llevar a cabo la instalación hasta que no hagamos una extracción de los ficheros contenidos. Además, para liberar espacio, borraremos tras ello dicho fichero comprimido ya que no nos hará falta. Para ello, ejecutaremos el comando:
Donde:
- -x: Indica a tar que desempaquete el fichero.
- -f: Indica a tar que el siguiente argumento es el nombre del fichero .tar.bz2.
- –strip 1: Saltamos el primer directorio, ya que dentro del comprimido hay un directorio padre que no necesitamos.
Para verificar que el fichero se ha descomprimido correctamente, haremos uso del comando:
Efectivamente, todo el contenido se ha descomprimido tal y como queríamos (en lugar de descomprimir un directorio de nombre nextcloud del que posteriormente tendríamos que mover los ficheros contenidos al directorio actual).
Ya tenemos todos los ficheros necesarios para llevar a cabo la instalación de Nextcloud, pero hay un pequeño detalle que todavía no hemos contemplado, pues el usuario y el grupo propietario correspondiente a dichos ficheros y directorios es nobody y nogroup, respectivamente, por lo que procedemos a cambiar dicho propietario y grupo de forma recursiva a www-data, haciendo para ello uso del comando chown -R
, pues de otro modo no podría escribir en dichos ficheros durante la instalación:
También es importante cambiar dichos permisos para el directorio nextclouddata/, ejecutando para ello el comando:
Para verificar que el cambio se ha llevado a cabo correctamente, volveremos a listar el contenido de /srv, haciendo uso de ls -l
:
Como era de esperar, el usuario y el grupo propietario de los directorios nextcloud/ y nextclouddata/ se han visto modificados, al igual que todos sus ficheros y directorios contenidos, al haberlo hecho de forma recursiva.
Nos falta un único paso para proceder con la instalación, y es que todavía no hemos creado la base de datos que utilizará, por lo que nos moveremos a la máquina backup para crearla, con nombre bd_nextcloud, por ejemplo:
La nueva base de datos se encuentra ya creada. Ésta vez no vamos a usar la base de datos de manera local, sino que queremos permitir el acceso a otra máquina (en concreto desde cms). En este caso, crearemos un usuario de nombre user_nextcloud, que tenga permitido el acceso desde 10.0.0.8, es decir, desde la máquina que queremos que se pueda conectar (si quisiéramos permitir el acceso desde cualquier dirección IP, se podría poder %), y cuya contraseña será pass_nextcloud.
Tras ello, tendremos que otorgarle los privilegios necesarios sobre la base de datos que acabamos de crear, ejecutando para ello el comando:
Ya está todo listo para llevar a cabo la instalación, así que accederemos al navegador de la máquina anfitriona y escribiremos el nombre de dominio previamente configurado, www.alvaro-nextcloud.com:
Como se puede apreciar, nos ha devuelto un error de falta de extensiones. Su solución es sencilla, pues únicamente tendremos que instalar los paquetes correspondientes en la máquina cms, ejecutando para ello el comando:
Tras ello, tendremos que volver a cargar la configuración del servicio apache2 para que los cambios realizados surtan efecto, ejecutando para ello el comando:
Una vez realizada la instalación de las extensiones y el correspondiente reinicio del servicio, volveremos al instalador y refrescaremos la página y podremos verificar que el problema se ha solucionado.
El siguiente y último paso nos pedirá indicar una cuenta de administrador, la ruta del directorio de datos (/srv/nextclouddata/), y la base de datos a la que accederá (alojada en la máquina backup), así como sus credenciales, que serán las siguientes:
- Usuario: user_nextcloud
- Contraseña: pass_nextcloud
- Nombre: bd_nextcloud
- Dirección: 10.0.0.5:3306
Una vez introducida dicha información, pulsaremos en Completar la instalación y tras unos segundos, ya tendremos la aplicación totalmente operativa:
Como se puede apreciar, la aplicación se ha instalado correctamente, junto a algunos ficheros que trae por defecto.
Realiza la migración al servidor en producción.
En ésta ocasión, en lugar de crear un nuevo registro en la zona DNS de la VPS, con la finalidad de alojarlo en un VirtualHost distinto, vamos a utilizar uno de los VirtualHost previamente configurados, concretamente www.iesgn19.es, que contendrá un subdirectorio cloud/ donde estará ubicada la aplicación Nextcloud.
Al igual que en la anterior migración, la propia página de Nextcloud nos proporciona una plantilla de configuración para el VirtualHost en caso de que vayamos a alojar un sitio Nextcloud en un subdirectorio, que contiene aquellas directivas necesarias para solventar la falta del .htaccess, como por ejemplo evitar que se sirvan determinados ficheros sensibles, establecer las URL limpias…
Para modificar el fichero fichero de configuración de dicho VirtualHost (concretamente iesgn19), ejecutaremos el comando:
Tras adaptar dicha plantilla al sitio que vamos a crear, el resultado sería (eliminando líneas comentadas para dejar una salida más limpia):
Tras ello, guardaremos los cambios en el mismo y procederemos a crear los directorios que utilizará la aplicación, uno que contendrá los ficheros y directorios necesarios para su funcionamiento (dentro de /srv/iesgn19/cloud/) y otro que contendrá aquellos ficheros que se suban a la nube, que debe estar fuera del DocumentRoot por seguridad (por ejemplo, en /srv/nextclouddata). Para crear dichos directorios ejecutaremos los comandos:
Tras ello, modificaremos el usuario y el grupo propietario de dichos directorios a debian, pues nos será necesario más adelante. Para ello, haremos uso de chown
:
Para verificar que la creación se ha llevado a cabo correctamente y que usuario y el grupo propietario han sido modificados, listaremos el contenido de /srv/ y de /srv/iesgn19/, haciendo uso del comando ls -l
:
Efectivamente, los directorios han sido generados y su propietario y grupo correctamente modificado. Para activar la nueva configuración, tendremos que volver a cargar la configuración del servicio nginx, ejecutando para ello el comando:
Una vez cargada la nueva configuración, vamos a proceder a crear la base de datos que la aplicación va a utilizar, de manera que accederemos al servidor mysql, ejecutando para ello el comando:
Una vez dentro del servidor de bases de datos, tendremos que crear una nueva base de datos, valga la redundancia. En este caso, para identificarla fácilmente, de nombre bd_nextcloud, ejecutando para ello el comando:
La base de datos que usará Nextcloud se encuentra ya creada, pero de nada nos sirve tener una base de datos si no tenemos un usuario que pueda acceder a la misma. En este caso, vamos a crear un usuario de nombre “user_nextcloud” que tenga permitido el acceso desde localhost (es decir, desde la máquina local) y cuya contraseña sea “pass_nextcloud” (lógicamente, en un caso real se usarían credenciales más seguras). Para ello, haremos uso del comando:
El usuario ya ha sido generado, pero todavía no tiene permisos sobre la base de datos que acabamos de crear, así que debemos otorgarle dichos privilegios. Para ello, ejecutaremos el comando:
Una vez realizadas todas las modificaciones oportunas, podremos salir de mysql haciendo uso del comando:
Una vez creada la base de datos que va a utilizar la aplicación en la VPS, tendremos que crear una copia de seguridad de la base de datos del entorno de desarrollo, haciendo uso, al igual que en la anterior migración, de mysqldump, así que empezaremos trabajando con la máquina backup.
En este caso, voy a generar dentro del directorio raíz un fichero de nombre backup-nextcloud.sql que contenga la copia de seguridad de la base de datos bd_nextcloud (aunque en realidad podríamos hacerlo en cualquier otro directorio, intentando evitar siempre el DocumentRoot de la página web, ya que en ese caso, se podría solicitar ese recurso y sería servido por nginx, algo totalmente inseguro). Para ello, ejecutaremos el comando:
Para verificar que la copia de seguridad se ha generado correctamente, vamos a listar el contenido de dicho directorio (raíz), filtrando por el nombre backup:
Efectivamente, la copia de seguridad se ha generado correctamente en dicho directorio, así que procederemos a transferirla a la VPS, haciendo uso de scp
:
El fichero que contiene la copia de seguridad de la base de datos ya ha sido correctamente transferido al directorio personal de debian en la VPS, algo que sería totalmente inseguro en un entorno que no estuviese controlado, pero que en esta ocasión, no hay problema alguno. Ya hemos terminado el trabajo en la máquina backup, dando paso por lo tanto, a la máquina cms.
Dentro de ésta se encuentra la mayor parte de la migración, pues contiene el directorio con todos los ficheros y subdirectorios necesarios para el correcto funcionamiento de la aplicación, concretamente dentro de /srv/nextcloud, además de todos los ficheros que se han subido a la nube, concretamente dentro de /srv/nextclouddata. Dado que ya nos encontramos ubicados en el primero de ellos, podremos comenzar con la migración de dichos ficheros, creando al igual que en la anterior migración, un comprimido que posteriormente transferiremos. Para crear dicho fichero comprimido ejecutaremos el comando:
Ya hemos terminado el trabajo en /srv/nextcloud, así que nos moveremos a /srv/nextclouddata para repetir exactamente el mismo procedimiento de compresión. Para ello ejecutaremos el comando:
Una vez dentro del mismo, comprimiremos los ficheros existentes, haciendo uso del comando:
Para verificar que los ficheros comprimidos se han generado correctamente, vamos a listar el contenido del directorio raíz, filtrando por el nombre nextcloud:
Efectivamente, los ficheros comprimidos se han generado correctamente en dicho directorio, así que procederemos a transferirlos a la VPS, haciendo uso de scp
:
Los ficheros comprimidos que contienen todos los ficheros y directorios del sitio Nextcloud ya han sido correctamente transferidos a los correspondientes directorios que utilizará dicha aplicación, concretamente a /srv/iesgn19/cloud y /srv/nextclouddata, transferencia que ha sido posible llevar a cabo gracias a que previamente hemos modificado el usuario y grupo propietario de dichos directorios a debian, consiguiendo así que tenga los privilegios necesarios para escribir, pues es el usuario a través del cuál nos estamos conectando para realizar la transferencia. Ya hemos terminado el trabajo en ambas máquinas, así que volveremos a la VPS para finalizar la migración.
Una vez dentro de la VPS, procederemos a restaurar la copia de seguridad de la base de datos, pero previamente, para verificar que el fichero con la copia de seguridad ha sido correctamente transferido, listaremos el contenido del directorio personal de debian haciendo uso de ls -l
y estableciendo un filtro por nombre:
Efectivamente, el fichero con la copia de seguridad ha sido correctamente transferido, por lo que ya podremos importarlo a la base de datos creada con anterioridad. Para ello, únicamente inyectaremos el contenido del fichero a mysql, indicando la base de datos que deseamos recuperar. Además, por seguridad, eliminaremos posteriormente dicho fichero con la copia de seguridad, quedando de la siguiente forma:
Para verificar que el fichero ha sido correctamente eliminado, volveremos a listar el contenido del directorio personal de debian estableciendo a su vez un filtro por nombre, ejecutando para ello el comando visto con anteriordad:
Efectivamente, en ésta ocasión, el filtro no ha devuelto ningún resultado, ya que el fichero ha sido correctamente eliminado.
De nuevo, accederemos al servicio mysql para verificar que la base de datos ha sido correctamente restaurada:
Tras ello, nos conectaremos a la base de datos en cuestión, con la instrucción use
:
Como podemos apreciar en el último mensaje, nos hemos conectado a dicha base de datos, así que listaremos las tablas de la misma con la siguiente instrucción:
Efectivamente, la base de datos ha sido correctamente restaurada, pues contiene las 75 tablas previamente existentes en el entorno de desarrollo.
Ya hemos recorrido la mitad del camino, pues la base de datos está correctamente restaurada, pero todavía nos falta restaurar la aplicación como tal. Si recordamos, el directorio que la aplicación iba a usar se encuentra en /srv/iesgn19/cloud, siendo éste el mismo directorio en el que se encuentra uno de los dos ficheros comprimidos, así que nos moveremos dentro del mismo, haciendo uso de cd
:
Antes de seguir, vamos a volver a modificar el usuario y grupo propietario de los directorios /srv/iesgn19/cloud y /srv/nextclouddata a www-data, pues es el usuario por defecto a través del cuál se sirven las en nginx, para que posteriormente no se nos olvide, pudiendo ocasionar un gran agujero de seguridad. Para ello, volveremos a hacer uso de chown
:
Para verificar que el usuario y grupo propietario han sido modificados, volveremos a listar el contenido de /srv/ y de /srv/iesgn19/, haciendo uso del comando ls -l
:
Como era de esperar, la modificación se ha llevado a cabo tal y como hemos especificado. Tras ello, listaremos el contenido del directorio actual para así verificar que el fichero comprimido ha sido correctamente transferido, ejecutando para ello el comando:
Efectivamente, el fichero comprimido ha sido correctamente transferido, por lo que ya podremos descomprimirlo para así obtener exactamente la misma estructura anteriormente existente en el entorno de desarrollo. Además, eliminaremos tras ello el fichero comprimido para así liberar espacio, ya que no nos va a ser necesario. Para ello, ejecutaremos el comando:
Para verificar que se ha descomprimido correctamente y que además se ha eliminado de dicho directorio, haremos uso de ls -la
:
Como se puede apreciar, el fichero se ha descomprimido correctamente y tras ello, ha sido eliminado. Posteriormente, tendremos que repetir exactamente el mismo procedimiento en /srv/nextclouddata para así descomprimir el otro fichero, de manera que lo primero que haremos será movernos a dicho directorio, ejecutando para ello el comando:
Una vez dentro del directorio, listaremos el contenido del mismo para así verificar que el fichero comprimido ha sido correctamente transferido, ejecutando para ello el comando:
Efectivamente, el fichero comprimido ha sido correctamente transferido, por lo que ya podremos descomprimirlo para así obtener exactamente la misma estructura anteriormente existente en el entorno de desarrollo. Además, eliminaremos tras ello el fichero comprimido para así liberar espacio, ya que no nos va a ser necesario. Para ello, ejecutaremos el comando:
Para verificar que se ha descomprimido correctamente y que además se ha eliminado de dicho directorio, haremos uso de ls -la
:
Como se puede apreciar, el fichero se ha descomprimido correctamente y tras ello, ha sido eliminado.
Actualmente, la web no funcionaría todavía ya que la máquina a la que está configurada para hacer las peticiones SQL no se encuentra operativa, por lo que tendremos que llevar a cabo las correspondientes modificaciones en el fichero oportuno para indicarle la nueva base de datos a la que ha de realizar las peticiones. Éste fichero se encuentra en /srv/iesgn19/cloud/config/, con nombre config.php, que modificaremos con nano
:
Dentro del mismo, encontraremos un bloque como el siguiente:
Como se puede apreciar, ahí se encuentran las credenciales de acceso y la base de datos a la que acceder (correspondiente a la máquina backup). En este caso, el nombre de la base de datos se ha mantenido como bd_nextcloud, el usuario se ha mantenido como user_nextcloud y la contraseña también se ha mantenido como pass_nextcloud. Además, la base de datos ya no se encuentra en 10.0.0.5:3306, sino en bd.iesgn19.es:3306. Por último, tendremos que cambiar el dominio con confianza de www.alvaro-nextcloud.com a www.iesgn19.es y la URL donde se encuentra alojada la aplicación de http://www.alvaro-nextcloud.com a http://www.iesgn19.es/cloud, manteniéndose a su vez el directorio de datos en /srv/nextclouddata. La configuración final quedaría así:
Tras ello, guardaremos los cambios, y antes de tratar de acceder al sitio Nextcloud, tendremos que instalar aquellas librerías y extensiones que se requerieron en la instalación de la aplicación en el entorno de desarollo, con la finalidad de intentar que ambos entornos (desarrollo y producción) sean en todo momento lo más similares posibles. En este caso, instalaremos dichas librerías y extensiones ejecutando el comando:
Listo, ya hemos finalizado la migración, así que ha llegado la hora de la verdad. Para verificar si la migración ha sido realmente exitosa, accederemos desde el navegador a www.iesgn19.es/cloud/:
Efectivamente, el sitio web se ha mostrado correctamente y hemos podido hacer uso de las funcionalidades de la aplicación, como por ejemplo, autenticarnos, por lo que podemos asegurar que la migración se ha llevado a cabo de forma exitosa.
Instala y configura en un ordenador el cliente de Nextcloud.
Para éste apartado, he vuelto a la máquina anfitriona, donde procederé a instalar dicho cliente, ejecutando para ello el comando:
Tras ello, simplemente ejecutaremos el siguiente comando para abrir la aplicación de escritorio:
La configuración de la misma se compone de los siguientes pasos:
- Nos preguntará si queremos registrarnos en un proveedor o entrar a uno en el que ya estamos registrados, por lo que pulsaremos en Entrar.
- Tras ello nos preguntará la dirección del mismo, en este caso, http://www.iesgn19.es/cloud/.
- Tendremos que pulsar en Iniciar sesión e introducir nuestros credenciales para posteriormente Conceder acceso a la aplicación para acceder a nuestra cuenta.
- Establecemos qué es lo que queremos sincronizar y dónde queremos hacerlo y pulsaremos en Conectar.
Finalmente, la aplicación de escritorio se verá de la siguiente forma:
En mi caso, he decidido que la sincronización se lleve a cabo en el directorio /home/alvaro/Nextcloud, así que listaré el contenido del mismo para verificar que la sincronización se ha llevado a cabo correctamente:
Efectivamente, todos los ficheros que se crearon automáticamente durante la instalación de Nextcloud están ahora sincronizados, así que para hacer la prueba, vamos a generar un nuevo fichero en dicho directorio para comprobar que también se sincroniza sin problemas. Para ello, ejecutaremos el comando:
Tras ello, accederemos a la aplicación desde el navegador web para ver si dicho fichero es accesible desde ahí:
Como era de esperar, no ha habido ningún problema en la sincronización y todos los ficheros que creemos en /home/alvaro/Nextcloud serán accesibles desde la aplicación en el navegador web y viceversa.
Por último, y como curiosidad, me gustaría listar el contenido del directorio del usuario alvaro en /srv/nextclouddata, directorio alojado en la VPS, para así concienciar del gran cuidado que hay que tener como administrador de sistemas a la hora de administrar una nube:
Como se puede apreciar, todos los ficheros del usuario alvaro (junto a los del resto de usuarios) están aquí contenidos y son accesibles sin ningún tipo de cifrado, por lo que cualquier fallo de ajuste en los permisos UNIX supondría un gran agujero de seguridad.