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.
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.
-
Base de datos Postgres.
-
API Bot Telegram para la comunicación.
He realizado un fichero Makefile que se encargará de automatizar el proceso.
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.
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
-Creamos la aplicación la cual vamos a desplegar.
heroku apps:create --region eu subjectsgii
-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.
Conectamos nuestro repositorio Github en el cual se encuentra nuestro proyecto.
Por último activamos el despliegue automático y activamos la opción de que antes de desplegar debe de pasar el test de Travis.
-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.
-
Servicio Web: https://subjectsgii.herokuapp.com/
-
Bot Telegram: @proyecto_iv_bot
Despliegue https://subjectsgii.herokuapp.com/
Para desplegar nuestro proyecto en Docker, nos creamos una cuenta y un repositorio, a este último le asociaremos nuestro proyecto de Github.
Como siguiente paso sería activar las compilaciones automáticas, para que cada vez que hagamos push
se compile también en Docker.
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:
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
Repositorio en DockerHub: https://hub.docker.com/r/franfermi/subjectsgii_bot/
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:
Contenedor: https://subjectsgiibot.azurewebsites.net/
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:
El contenido de los ficheros utilizados para el despliegue son:
Para el despliegue he utilizado Fabric y he configurado varias opciones en el fichero fabfile.py para que se puedan realizar remotamente.
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.
Una vez creada nuestra máquina virtual, le abrimos el puerto 80 en la configuración de red de nuestra máquina.
Para finalizar, cambiamos el nombre del dominio.
Un ejemplo de funcionamiento sería:
fab -H vagrant@subjectsgii.southcentralus.cloudapp.azure.com IniciarApp
Despliegue final: subjectsgii.southcentralus.cloudapp.azure.com