Skip to content

franfermi/Infraestructura-Virtual_IV

Repository files navigation

Build Status

Deploy

License: LGPL v3

Docker: OK

Deploy to Azure

SubjectsGII_Bot

Descripción general

El proyecto que voy a realizar trata de un bot desarrollado en Python, que mostrará información sobre asignaturas del grado de Ingeniería Informática de la ETSIIT. La información se almacenará en una base de datos, en ésta se encontrará el siguiente contenido:

  • Guía docente de las asignaturas.

  • Horarios de los distintos grupos.

  • Fecha de exámenes finales.

Requerimientos

Debido a que el desarrollo se realizará en Python, necesitaremos las librerías, API o framework correspondientes.

Los datos sobre cada una de las asignaturas de alojarán en algún sitio.

Servicios

  • Base de datos Postgres.

  • API Bot Telegram para la comunicación.

Automatización

He realizado un fichero Makefile que se encargará de automatizar el proceso.

Integración continua

El sistema de integración continua que he utilizado es Travis-CI, enlazado con mi cuenta de GitHub. Este sistema comprueba de forma continua cada cambio que es realizado en el repositorio para que todo funcione correctamente. Su fichero de configuración es .travis.yml.

Despliegue en un PaaS

Para mi proyecto he empleado el PaaS Heroku.

Los pasos a seguir para su despliegue son los siguientes:

-Instalamos el cliente de heroku desde su propia página o mediante el siguiente comando:

wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

-Una vez instalado, procedemos a autenticarnos en heroku.

heroku login

curl

-Creamos la aplicación la cual vamos a desplegar.

heroku apps:create --region eu subjectsgii

curl

-Añadimos los siguientes ficheros:

  • Procfile, fichero de ejecución de Heroku. Worker para el servicio bot de Telegram y Web para el servicio web desplegado.
  • runtime.txt, especificamos la versión de python utilizada.
  • requierements.txt, añadimos las dependencias de nuestro proyecto.

-Desplegamos Github desde Heroku para un despliegue automático:

En la opción de despliegue de Heroku, en métodos de despliegue seleccionamos la opción Github.

curl

Conectamos nuestro repositorio Github en el cual se encuentra nuestro proyecto.

curl

Por último activamos el despliegue automático y activamos la opción de que antes de desplegar debe de pasar el test de Travis.

curl

-Para configurar el token de Telegram para su uso desde Heroku:

heroku config:set TOKEN=$$$$ --app subjectsgii

-Por último, lanzamos tanto el bot como el servicio web.

heroku ps:scale worker=1 --app subjectsgii

heroku ps:scale web=1 --app subjectsgii

-Comprobamos que están activos y funcionando.

curl

curl

Despliegue https://subjectsgii.herokuapp.com/

Despliegue en Docker

Para desplegar nuestro proyecto en Docker, nos creamos una cuenta y un repositorio, a este último le asociaremos nuestro proyecto de Github.

curl

Como siguiente paso sería activar las compilaciones automáticas, para que cada vez que hagamos push se compile también en Docker.

curl

Para el despliegue necesitaremos añadir a nuestro repositorio el archivo Dockerfile, (pinchando en el enlace podemos ver su contenido).

Una vez configurado correctamente incluyendo las variables de entorno para el accceso a la BD y el token para el bot de Telegram, Docker comenzará a construir un contenedor con los comandos que se encuentran en el archivo.

Para comprobar que todo ha ido correctamente, se mostrará lo siguiente:

curl

Ya está todo listo para descargar nuestro contenedor con el comando:

sudo docker build -t subjectsgii_bot ./

(Para no hacer uso de "sudo" debemos de seguir el siguiente tutorial proporcionado por el profesor).

Una vez descargada la imagen de Docker podemos comprobar que realmente se encuentra con:

docker images

curl

Repositorio en DockerHub: https://hub.docker.com/r/franfermi/subjectsgii_bot/

Despliegue en Azure

El despliegue en Azure lo he realizado mediante Azure Cloud Shell que es un shell de Bash que se puede ejecutar directamente en Azure Portal.

El primer paso sería crear un grupo de recursos en el cual se implementan y administran los recursos de las aplicaciones desarrolladas.

az group create --name proyectoIV --location "West Europe"

El segundo paso es crear un plan de App Service de Linux, en mi caso he utilizado un plan de precios estándar en un contenedor Linux.

az appservice plan create --name AppServicePlan --resource-group proyectoIV --sku S1 --is-linux

Como tercer paso, creamos la aplicación web en el plan de servicio creado, en este paso tenemos que añadir la imagen de nuestro contenedor, para ello indicamos su docker-ID seguido del nombre de la imagen.

az webapp create --resource-group proyectoIV --plan AppServicePlan --name subjectsgiibot --deployment-container-image-name 422e56bd4839/subjectsgii_bot

Por último, configuramos las variables de entorno que en este caso será el puerto que usará la aplicación, para no tener conflictos con el puerto 80, he utilizado el puerto 8000.

az webapp config appsettings set --resource-group proyectoIV --name subjectsgiibot --settings WEBSITES_PORT=8000

Servicio web desplegado:

curl

Contenedor: https://subjectsgiibot.azurewebsites.net/

Diseño del soporte virtual para el despliegue de una aplicación

El despliegue de la aplicación en IaaS, lo he realizado mediante la herramienta de despliegue automático Vagrant.

Esta herramienta se encargará de desplegar una máquina virtual que he creado en Azure con el código promocional proporcionado por el profesor.

He seguido los siguientes pasos para el despliegue:

  • Instalar Vagrant.
  • Instalar Ansible.
  • Configurar fichero var.yml.
  • Configurar fichero playbook.yml.
  • Configurar fichero ansible.cfg.
  • Creación y configuración de aplicación en Azure.
  • Configurar fichero Vagrantfile.
  • Instalación de la máquina virtual.
  • Establecer puertos y dominios.
  • Configurar fichero fabfile.py.

La explicación con detalle de los pasos que he seguido para el despliegue se encuentran en:

Documentación Hito 5

El contenido de los ficheros utilizados para el despliegue son:

var.yml

playbook.yml

ansible.cfg

Vagrantfile

Para el despliegue he utilizado Fabric y he configurado varias opciones en el fichero fabfile.py para que se puedan realizar remotamente.

fabfile.py

Para realizar la instalación de nuestra máquina, usamos vagrant con nuestro Vagrantfile configurado.

vagrant up --provider=azure

Una vez terminado el proceso de instalación, nos vamos a Azure y comprobamos que efectivamente se ha creado la máquina virtual.

curl

Una vez creada nuestra máquina virtual, le abrimos el puerto 80 en la configuración de red de nuestra máquina.

curl

Para finalizar, cambiamos el nombre del dominio.

curl

Un ejemplo de funcionamiento sería:

fab -H vagrant@subjectsgii.southcentralus.cloudapp.azure.com IniciarApp

culr

Despliegue final: subjectsgii.southcentralus.cloudapp.azure.com