Skip to content

romilgildo/IV-PLUCO-RMH

Repository files navigation

PLATAFORMA UNIVERSITARIA DE COMPARTICIÓN DE CONOCIMIENTOS: PLUCO

Autor: Rubén Martín Hidalgo

Travis Snap CI

Heroku Azure Docker

Apuntado en el proyecto de software libre de la oficina OSL

Introducción

Se trata de una plataforma académica de compartición de archivos de la Universidad de Granada, que permite la colaboración en grupo entre los usuarios del sistema. Ofrece servicios de almacenamiento de archivos en la nube, y de mensajería y foros para la resolución de dudas, potenciando la interacción de los usuarios, y agrupando a los mismos por grupos, por ejemplo de asignaturas o cursos.

Seguridad

En cuanto a la seguridad de nuestra plataforma los objetivos son: Permitir tener un sistema seguro en el que se separen datos sensibles y credenciales de los usuarios, y por otra parte archivos de los mismos. Además tendremos una web con foros que si es atacada no compremete la privacidad de los usuarios ni sus archivos.

Infraestuctura

En mi infraestructura, se realiza un despliegue sobre Azure de un sistema de organización y gestión de datos de los usuarios de la plataforma, permitiendo recuperar la información de los usuarios, consultar sus datos asociados, modificar los datos, además de los procesos asociados a dar de alta o baja a los usuarios.

Va instalado sobre una máquina virtual que actúa como servidor, disponiendo de acceso a la información almacenada mediante una página web, cuyo servidor web está alojado en un servidor distinto al de la base de datos, con el objetivo de repartir la carga y dar mayor seguridad a la infraestructura.

La base de datos usada es MySQL y contiene información sobre las asignaturas matriculadas e información personal de los usuarios.

Como lenguaje de programación se usa Python. Además utilizamos Django como framework para agilizar el desarrollo web.

El resto de mis compañeros están creando:

  1. Un sistema web/red social de foros y dudas similar a Stackoverflow. Lleva detrás un servidor web para alojar las páginas y otro servidor para la base de datos de los usuarios.

  2. Un sistema de almacenamiento sftp de recursos en la nube, que se usará para la organización, administración y compartición de archivos. Todo esto irá implementado en otro servidor que usaremos de Cloud Storage, además de un sistema de acceso a los datos y recursos por parte de los usuarios.

Al final del proyecto, deberemos enlazar en conjunto las tres partes del proyecto, y realizar el despliegue correcto sobre cualquier infraestructura virtual.

Herramienta de construcción con Make

Para la construcción automática de la app, he usado Make. Para su funcionamiento, he creado un Makefile con las distintas opciones.

Para ejecutar la herramienta de construcción, simplemente debemos escribir en la terminal el comando make seguido de la opción que queramos ejecutar (clean, test, run...).

Más información

Integración contínua

La integración contínua consiste en hacer integraciones automáticas de un proyecto cada vez que actualizamos el repositorio para así poder detectar fallos cuanto antes. Este proceso conlleva la ejecución de pruebas del proyecto.

Realización de tests con Nose

Para la realización de tests que permitan comprobar que el código creado funciona correctamente, he usado para mi código escrito en Python, el sistema de pruebas Nose, que está basado en funciones de Unittest. Existen otras alternativas para Python como pueden ser Tox y Pytest, pero he escogido Nose por ser el más conocido.

Aquí está el archivo tests.py actualizado con los tests correspondientes para manejar los modelos de la app.

Para ejecutar los tests localmente, hacer make test.

Aquí vemos como la aplicación pasa el test de pruebas inicial:

Ejecucion Nosetest

Herramientas de integración contínua

El siguiente paso es elegir un sistema de integración contínua de modo que cada cambio realizado en el repositorio, implique una ejecución de los tests anteriores comprobando y asegurandonos de que el programa sigue funcionando.

En mi caso, estoy haciendo la integración contínua con Shippable, Travis y Snap-CI

Más información

Descarga de la app

Para realizar cualquiera de las funcionalidades que vienen en esta documentación, necesitaremos descargar antes la aplicación en nuestro ordenador, y a partir de ahí podremos realizar tests, desplegar la app o simplemente arrancarla localmente.

Para ello ejecutamos los siguientes comandos:

$ sudo apt-get install git
$ sudo apt-get install make
$ git clone https://github.com/romilgildo/IV-PLUCO-RMH.git
$ cd IV-PLUCO-RMH/

Instalación local de la app

Para ejecutar la aplicación en nuestro propio ordenador, ejecutamos los siguientes comandos:

$ make install
$ make run

Si todo ha ido bien, ya podremos acceder a nuestra app introduciendo localhost:8000 en nuestro navegador web. Debemos asegurarnos antes de que tenemos las bases de datos ya montadas, sino habría que hacer make mysql.

Despliegue de la app

Para desplegar la aplicación en Azure, lo primero que debemos hacer es crear el certificado para Azure.

Se necesita crear un fichero variables_entorno.sh con el siguiente contenido:

#!/bin/bash

archivo=./despliegueMySQL/.env

echo 'VM_USER=""' > $archivo
echo 'VM_PASS=""' >> $archivo
echo 'AZURE_PEM=""' >> $archivo
echo 'SUBSCRIPTION_ID=""' >> $archivo
echo 'VM_MYSQL_NAME=""' >> $archivo
echo 'VM_DOCKER_NAME=""' >> $archivo
echo 'VM_APP_NAME=""' >> $archivo

cp $archivo ./despliegueAzure
cp $archivo ./despliegueDocker

Una vez hecho los pasos anteriores, ya podemos poner en marcha toda la app en la web de manera totalemente automatizada con solo ejecutar lo siguiente:

sudo ./desplegarPLUCO.sh

Dicho script instalará todo lo necesario, crea las bases de datos y despliega la aplicación en Azure con los siguientes comandos:

make install
make mysql
make azure

Para eliminar cualquiera de las máquinas creadas con Vagrant, bastará con ejecutar sudo vagrant destroy dentro del directorio donde se encuentre el fichero Vagrantfile que crea dicha máquina.

Instalación de MySQL en Azure

Para poder tener disponible desde cualquier lugar nuestra base de datos, he decidido instalar y configurar la app con MySQL en una máquina virtual independiente dentro de Azure.

Para ello, bastará con ejecutar make mysql y automáticamente se crearán las bases de datos en una máquina independiente en Azure.

Más información

Entorno de pruebas con Docker

Docker es una plataforma que automatiza el despliegue de aplicaciones dentro de contenedores software, permitiendo probarla en un entorno aislado para posteriormente desplegarla a producción rápidamente.

El repositorio de mi app en Docker se actualiza automáticamente cada vez que hago un 'push' de git. La Automated Build de mi app es esta.

Aquí está funcionando el entorno de pruebas instalado en Azure: http://pruebas-pluco.cloudapp.net

Para crear dicho entorno, se debe ejecutar el siguiente comando en local:

make docker

Más información

Despliegue en un PaaS: Heroku

Nos decantamos por Heroku, debido a que funciona realmente bien y su sencilla configuración para integración contínua. Otra alternativa de PaaS puede ser OpenShift.

Esta es la aplicación ya desplegada en Heroku: https://pluco-db.herokuapp.com/

Más información

Despliegue en un IaaS: Azure

Para el despliegue en un IaaS, he usado Azure. La aplicación se despliega automáticamente con solo ejecutar make azure usando Vagrant y Ansible.

Con el comando make push podemos actualizar al mismo tiempo los archivos en el repositorio de Git y luego en nuestra máquina de Azure.

Si el crédito de Azure no se ha agotado, tendré la aplicación web totalmente actualizada funcionando en esta dirección: http://pluco-iv.cloudapp.net/

Más información

Administración remota con Fabric

Si queremos realizar una administración remota del despliegue de manera automática, podemos usar Fabric.

Más información