Skip to content

adalsa91/APYE

Repository files navigation

APYE

Build Status Deploy Docker

Proyecto para la asignatura de Infraestructura Virtual 2016-2017

##Descripción La aplicación consiste en un gestor de ficheros que junto a un editor de texto permitirá al usuario la creación y edición de scripts de python, quedando estos almacenados permanentemente entre sesiones, posibilitando la opción de ejecutar estos scripts en un entorno virtual y seguro que devolverá los resultados del programa en pantalla.

##Herramientas

  • Framework Python (Flask)
  • Tecnología de virtualización de contenedores (Docker)
  • IaaS(e.g. Azure)

##Requisitos principales

  • Python 3
  • PostgreSQL
  • pip

##Instalación en local

	#Clonar repositorio
	$ git clone git@github.com:adalsa91/APYE.git
	$ cd APYE
	#Instalar dependencias
	$ make install

Es necesario definir tres variables de entorno:

	$ export APP_SETTINGS="config.DevelopmentConfig"
	$ export DATABASE_URL="postgresql://<user>:<password>@localhost/<db_name>"
	$ export SECRET_KEY="SuperSecretKey"

Una vez definidas las variables de entorno podemos ejecutar la aplicación.

	$ make run

Si todo ha ido bien se podrá acceder a la aplicación a través de la dirección http://127.0.0.1:5000

##Automaticación Se han definido algunas reglas en el fichero Makefile para automatizar algunas tareas:

  • install: instalara los requirimiento necesarios para la aplicación mediante pip.
  • test: ejecuta todos los test.
  • run: lanza la aplicación.

##Integración continua Para la integración continua se ha utilizado Travis CI, para más información sobre los tests y el proceso de integración continua consultar la documentación del proyecto.

##Despliegue en un PaaS Para el despliegue en un Paas he elegido Heroku, ya que era el PaaS que mejores servicios gratuitos ofrecía, una interfaz web muy intuitiva y fácil de usar además disponía de unas herramientas de CLI muy completas para tareas más complejas, otro motivo de peso es la posibilidad de usar de forma gratuita el addon de PostgreSQL, ya que es el que usa mi aplicación me ahorro externalizar la base de datos. Además ofrece un servicio de pipelines que permite crear un flujo de trabajo entre entornos estilo dev ---> staging ---> production y por supuesto el soporte a Flask que es el framework que estoy usando para desarrollar la aplicación. Pensando en probar los pipelines he creado dos apps: apye-stage y apye-pro.

Para más información sobre como se ha realizado el despliegue consultar la documentación del proyecto

Si deseas desplegar este proyecto en Heroku utiliza el siguiente botón. Deploy

Página web del proyecto

##Docker Para crear la imagen de docker solo es necesario ejecutar el siguiente comando en la carpeta raíz del repositorio:

    $ docker build -t apye .

También es posible descargar la imagen directamente de los repositorios de Docker Hub adalsa91/apye.

La aplicación necesita PostgreSQL para la persistencia de datos, como por ejemplo los datos de los usuarios, sin embargo este no se incluye en la imagen adalsa91/apye, la aplicación es independiente de como se decida instalar PostgreSQL, solo necesita conocer las credenciales y dirección del host a través de la variable de entorno DATABASE_URL que se detalla más adelante.

Se puede utilizar la imagen de PostgreSQL que hay disponible en los repositorios oficiales de Docker Hub, solo sería necesario ejecutar el siguiente comando:

    $ docker run --name postgresql_container -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password -e POSTGRES_DB=db_name -d postgres

###Variables de entorno Para ejecutar la aplicación es necesario definir tres variables de entorno:

  • APP_SETTINGS: indica el contexto de ejecución de la aplicación, puede tomar los siguientes valores:

    • config.ProductionConfig: para entornos de producción
    • config DevelopmentConfig: para desarrollo, habilita recarga automática de archivos python por parte del servidor integrado de Flask y además activa el depurador.
    • config TestingConfig: para realizar tests.
  • DATABASE_URL: indica la url de la base de datos postgresql a usar. El formato de la url es: postgresql://user:password@host/db_name

  • SECRET_KEY: clave secreta para cifrar sesiones. puede descargar y lanzar la imagen con el sigueinte comando:

###Lanzar container Para descargar y lanzar la imagen fijando las variables de entorno se puede usar el siguiente comando:

    $ docker run --name apye --link postgresql_container:postgresql -d -e APP_SETTINGS="config.DevelopmentConfig" -e DATABASE_URL="postgresql://apye:password@postgresql/apye" -e SECRET_KEY="Sql1D00WTF." -p 5000:5000 adalsa91/apye
  • La opción --link postgresql_container:postgresql solo será necesaria si hemos creado un contenedor para postgreSQL, esta opción crea un enlace entre los contenedores, creando entre otras cosas una entrada en /etc/hosts con el nombre postgres y la dirección asociada del contenedor de nombre postgresql_container, de esta forma el contenedor podrá resolver la dirección del host de la url de la base de datos pasada como variable de entorno.

  • La opción -p 5000:5000 crea un reenvío de puertos del contenedor al host, para poder acceder a la aplicación.

###Punto de entrada La imagen está configurada para arrancar la aplicación automáticamente, para ello tiene fijado como punto de entrada el comando python3 manage.py y como comandos por omisión runserver --host 0.0.0.0. Si se desea utilizar otro punto de entrada al arrancar el contenedor para por ejemplo arrancar un terminal se puede usar la opcíon --entrypoint /bin/bash, por ejemplo:

    $ docker run --name apye -i --entrypoint /bin/bash --link postgresql_container:postgresql -d -e APP_SETTINGS="config.DevelopmentConfig" -e DATABASE_URL="postgresql://apye:password@postgresql/apye" -e SECRET_KEY="Sql1D00WTF." -p 5000:5000 adalsa91/apye

Creación tablas

Para crear las tablas necesarias para la aplicación en la base de datos de PostgreSQL debemos ejecutar el siguiente comando en el contenedor de la aplicación:

    $ python3 migrate.py db upgrade

Despliegue en Azure

Para realizar el despliegue automático en Azure en primer lugar es necesario instalar la CLI de Azure.

npm install -g azure-cli

Para realizar el despliegue automático necesitaremos un certificado de gestión para nuestra cuenta de Azure. Para ello hay que seguri los siguientes pasos:

Creamos un par de claves privada/pública en formáto x509 y añadir la pública a nuestra cuenta de azure para poder crear recursos.

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ~/.ssh/azurevagrant.key -out ~/.ssh/azurevagrant.key
$ chmod 600 ~/.ssh/azurevagrant.key
$ openssl x509 -inform pem -in ~/.ssh/azurevagrant.key -outform der -out ~/.ssh/azurevagrant.cer

Para subir el certificado necesitamos usar el portal de Azure clásico (ASM), para ello una vez dentro del portal claśico ir a Settings->Management Certificate->Upload y seleccionamos la clave pública (con extensión .cer).

Una vez creado el certificado clonamos el repositorio.

$ git clone https://github.com/adalsa91/APYE.git && cd APYE

Antes de desplegar tendremos que modificar algunas variable en el archivo vars.yaml

---
vm_name: apye
vm_user: apye
vm_password: SuperSecretPassword
azure_subscription_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

mgmt_certificate_path: azure_key.pem
certificate_path: azure_key.cer

db_user: apye
db_password: password
db_name: apye
....

Principal debemos modificar el id de nuestra subscripción Azure (azure_subscription_id) y los certificados creados anteriormente (mgmt_certificate_path y certificate_path).

Ejecutamos el siguiente comando para desplegar en Azure:

$ vagrant up

Y por último desplegamos la aplicación con el siguiente comando:

$ fab deploy

De forma alternativa a estos dos últimos comandos podemos ejecutar el siguiente comando:

    # make deploy-azure

Que antes de realizar el despliegue instalará todos los paquetes necesarios para realizar el despliegue. Las acciones que ejecuta la regla deploy-azure son las siguientes:

deploy-azure:
        sudo apt-get update
        FILE=`mktemp`; wget https://releases.hashicorp.com/vagrant/1.8.7/vagrant_1.8.7_x86_64.deb -qO $FILE && sudo dpkg -i $FILE; rm $FILE
        vagrant plugin install vagrant-azure
        FILE=`mktemp`; wget https://bootstrap.pypa.io/get-pip.py -q0 $FILE && sudo python get-pip.py; rm $FILE
        sudo pip install ansible fabric
        vagrant up
        fab deploy

Para una descripción más completa de como se ha realizado el despliegue consultar la documentación del proyecto.

La aplicación se encuentra desplegada en la dirección http://apye.cloudapp.net/

Adrián Álvarez Sáez

About

Proyecto para la asignatura de Infraestructura Virtual 2016-2017

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published