proyectoIV
Hito 1
Proyecto elegido
Sitio web VIAJES SIN BARRERAS
Descripción
Turismo adaptado para personas con movilidad reducida, discapacitadas que tengan problemas de accesibilidad, que se muevan en sillas de ruedas.
-
Debe aparecer toda la información relativa al hotel, ubicación, y las habitaciones que tiene disponible para minusválidos.
-
Organizar las busquedas por comunidades autónomas y provincias, número de personas, fecha de entrada salida, etc.
-
Para realizar la compra de una estancia los usuarios deberán estar registrado. Cada usuario podrá ver sus compras realizadas.
Servicios necesarios
-
Dos servidores de base de datos,en uno almacenare todo lo referente a hoteles y en el otro almacenaré los usuarios registrados y sus correspondientes datos, mediante se vaya desarrollando se estudiara posibilidad de añadir más bases de datos.
-
El despliegue se realizará en principio en Amazon Web Services, aunque puede cambiar si durante el desarrollo de la asignatura se encuentra uno con más ventajas.
Posible colaborador
Un bot en Python que me devuelva todos los hoteles posibles según los requisitos marcados por el usuario.
Hito 2
Sistemas de Integración Continua
Como sistema de integración continua he elegido Travis-CI, ya que es él que se mencionó y recomendó el profesor en clase.
Por lo tanto he añadido el archivo de configuración .travis.yml a mi repositorio.
Test
Para la realización de los tests he usado mocha y chai, que realizan una serie de peticiones (POST, GET, PUT y DELETE) a la API
Los tests se ejecutan con el comando
npm test
Instalación
- En el directorio ráiz del proyecto
- npm install
- npm start
Requisitos mínimos
Ejercicios Tema 2
Hito 3
Despliegue de una aplicación en un PaaS
He utilizado heroku, lo he elegido ya que he aprendido a utilizarlo con los ejercicios del tema 3 y me resultó sencillo de usar.
Fichero necesario para el despliegue
Para un mayor control y flexibilidad sobre su aplicación se recomienda la creación del fichero Procfile que ha de estar alojado en el directorio ráiz de la aplicación. Heroku usa el Procfile para saber que tiene que ejecutar. En nuestro caso contendrá:
+web: node app.js
Instalación de Heroku, configuración y sincronización con GitHub y Travis-CI
Descarga e instalación de Heroku
#Instación de Heroku
sudo apt-get install wget
wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
# Nos logueamos en Heroku
heroku login
# Creamos la aplicación, ponemos la región europea y el nombre que le vamos a asignar a nuestra app.
heroku apps:create --region eu viajessinbarreras
# Creamos una base de datos mongodb
heroku addons:create mongolab:sandbox
# Generamos clave para poder subir nuestros archivos a heroku
heroku auth:token //clave
# Subida de archivos a heroku
git push heroku master //nos pedirá usuario(Podemos dejarlo vacio) y la clave que acabamos de generar
//Si ya tenemos el repositorio creado
heroku git:remote -a viajessinbarreras
git push heroku master
# Ajustamos el tipo de procesos ajustando el número de dinamómetros web a 1
heroku ps:scale web=1
# Para ver nuestra aplicación en el navegador
heroku open
# Para ver los posible errores que se puedan dar.
heroku logs --tail
Para sincronizar GitHub, Travis-CI y Heroku.
Desde la aplicación creada en Heroku, pestaña deploy.

Heroku enlace a web en construcción
Ejercicios Tema 3
Hito 4
##Contenedores para pruebas: Docker
Para el entorno de pruebas se ha utilizado Docker el cual está basado en un sistema de contenedores. Para su uso, he creado dos contenedores uno para el servidor de Node.js y otro para MongoDB. He enlazado los contenedores con el parámetro –link.
Para empezar debemos registrarnos en dockerHub y vincular con nuestra cuenta de github.

Pulsamos en Create Automated Build y seleccionamos el repositorio de nuestro proyecto, escribimos una descripción y pulsamos en create. Una vez creado vamos a sincronizarlo para que con cada push se actualice, para ello nos vamos a Building Settings y pulsamos el botón Trigger.
Fichero necesarios
Dockerfile que contendrá lo siguiente:
# Tells the Docker which base image to start.
FROM node:latest
# Adds files from the host file system into the Docker container.
ADD . /models
ADD . /routes
# Sets the current working directory for subsequent instructions
WORKDIR /models
WORKDIR /routes
RUN npm install
#expose a port to allow external access
EXPOSE 8080
# Start application
CMD ["npm", "start"]
.dockerignore
node_modules
bower_components
.tmp
.env
Docker
Para ejecutar el docker desde la imagen creada en nuestro pc tenemos que:
//Creamos el contenedor mongoDB
sudo docker run -d --name mongoDB mongo
//[Descargamos la imagen](https://hub.docker.com/r/cr13/viajes_sin_barreras/) y la instalamos
sudo docker pull cr13/viajes_sin_barreras
//Enlazamos y ejecutamos los dos contenedores
sudo docker run --link=mongoDB:mongodb -it cr13/viajes_sin_barreras

Sino tenemos imagen también podemos hacer lo siguiente:
1º Nos clonamos el repositorio
2ª Ejecutamos el script
sudo docker_local.sh

Issues
Ejercicios Tema 4
Hito 5
Diseño del soporte virtual para el despliegue de una aplicación
El despliegue de la aplicación en un IaaS lo voy hacer en Azure usando Vagrant para la creación de máquinas virtuales, y utilizando las playbook de Ansible para el provisionamiento de dichas máquinas virtuales y para el despligue vamos a utilizar Fabric.
Configuración Azure
Suponiendo que ya estamos registrados en azure vamos a realizar los siguientes pasos:
1- Descargamos e instalamos la ultima versión de [vagrant](https://releases.hashicorp.com/vagrant/1.9.1/vagrant_1.9.1_x86_64.deb) y también necesitaremos el [virtualbox](https://www.virtualbox.org/wiki/Downloads)
2- Instalamos el provisionador azure para vagrant
vagrant plugin install vagrant-azure --plugin-version '2.0.0.pre1'
3- Instalamos azure
npm install -g azure
4- Ahora tenemos que loguearnos y conseguir la información de las credenciales de Azure [más info](https://docs.microsoft.com/en-us/azure/xplat-cli-connect)
azure login
Para descargar el archivo de configuración de publicación de su cuenta, asegúrese de que la CLI esté en el modo Gestión de servicios
azure config mode asm --> activar modo gestión de servicios
azure account download --> descargamos el archivo publishSettings
//Importar el archivo publishSettings
azure account import Evaluación\ gratuita-1-26-2017-credentials.publishsettings
5- Generamos los certificados que se van a subir a Azure:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout azurevagrant.key -out azurevagrant.key
chmod 600 azurevagrant.key
openssl x509 -inform pem -in azurevagrant.key -outform der -out azurevagrant.cer

6- Subimos el archivo azurevagrant.cer a Azure [+info](https://docs.microsoft.com/es-es/azure/cloud-services/cloud-services-configure-ssl-certificate):
- Inicie sesión en el [Portal de Azure clásico](http://manage.windowsazure.com/).
- Configuración --> CERTIFICADOS DE ADMINISTRACIÓN --> cargar y elegimos el archivo azurevagrant.cer creado anteriomente

7- Registro de la aplicación en Azure, para ello nos vamos al [portal de Azure](https://portal.azure.com/)
- Menú --> Azure Active Directory --> en el menú del Directorio predeterminado --> Registros de aplicaciones -->Agregar --> completamos el formulario y pulsamos en crear

- Una vez creada, clicamos en la aplicación y se nos abre una ventana de información ahí tenemos el Id. de aplicación(AZURE_CLIENT_ID). También se abre una ventana de configuración en la que vamos a crear los ACCESO DE API:
- Generamos la clave (Ponemos una descripción --> fecha de expiración --> guardamos y copiamos la clave generada(AZURE_CLIENT_SECRET))
- Id. de directorio (AZURE_TENANT_ID) Menú --> Azure Active Directory --> en el menú del Directorio predeterminado --> propiedades
- Nos faltaría el id de subscripción(AZURE_SUBSCRIPTION_ID) que se obtiene con **login account list**
- Todos estos [Ids](https://www.terraform.io/docs/providers/azurerm/) nos van ha servir para la creación de la MV en Azure.
8- Le damos permisos a nuestra aplicación para que pueda crearse la máquina virtual desde Vagrant.
- Menú --> Más servicios --> Suscripciones (elegimos nuestra suscripción) --> Control de acceso (IAM) --> Agregar (elegimos un rol y buscamos nuestra aplicación --> seleccionamos y aceptamos )
Creación de la máquina virtual
Para la creación de la máquina virtual en Azure voy ha usar Vagrant y playbook-ansible. Para Vagrant se usa el archivo Vagrantfile y para ansible el archivo playbooks.yml.
- Antes de nada vamos a crear el archivo variables.yml que contendra todas las variables con las que vamos a trabajar.
#Credenciales de azure (Estás son las que hemos ido copiando en el paso anterior)
# id del directorio de azure, necesario para la creación de la MV
AZURE_TENANT_ID: XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX
# id de la cliente de azure, necesario para la creación de la MV
AZURE_CLIENT_ID: XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX
# clave secreta de azure, necesario para la creación de la MV
AZURE_CLIENT_SECRET: XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX
# id de la subscripción de azure, necesario para la creación de la MV
AZURE_SUBSCRIPTION_ID: XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX
# Datos de la máquina virtual que será creada
# Nombre de la MV
vm_name: nombre_maquina
# Contraseña de la MV
vm_password: *******
# Nombre del grupo MV
vm_name_group: nombre_grupo_maquina
# Variable de entorno que indica que el entorno es de producción
EN_PROD: 1
# Variables para el despliegue
project_name: Nombre_del_proyecto
project_repo: Enlace_al_repositorio_github
project_path: Nombre_carpeta_almacenamiento_proyecto
# Dirección del servidor
server_name: ".cloudapp.net www..cloudapp.net"
# Dependencias del sistema
system_packages:
- git
- nodejs
- mongodb
- npm
- build-essential
- libpq-dev
- mocha
- Una vez hecho esto creamos el playbooks.yml donde indicamos que provisione la máquina usando el playbook de ansible:
---
- hosts: all
remote_user: vagrant
vars_files:
- variables.yml
gather_facts: no
become: yes
become_method: sudo
tasks:
- name: Instalar paquetes del sistema
apt: pkg= update-cache=yes cache_valid_time=3600
with_items: ""
- name: Obtener aplicacion git
git: repo= dest= clone=yes force=yes
- name: Run npm install
npm: path=
- Creamos el archivo ansible.cfg para evitar los errores que se pueden producir con cadenas demasiado largas que se usan durante el provisionamiento.
[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r
- Por último creamos el Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'
current_dir = File.dirname(File.expand_path(__FILE__))
configs = YAML.load_file("#{current_dir}/variables.yml")
Vagrant.configure('2') do |config|
config.vm.box = 'azure'
config.vm.box_url = 'https://github.com/msopentech/vagrant-azure/raw/master/dummy.box' #Caja base vacía
config.vm.network "private_network",ip: "192.168.50.4", virtualbox__intnet: "vboxnet0" #Ip privada
config.vm.hostname = "localhost"
config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.provider :azure do |azure, override|
config.ssh.private_key_path = '~/.ssh/id_rsa'
azure.vm_image_urn = 'canonical:UbuntuServer:16.04-LTS:16.04.201701130' #Imagen base del sistema
azure.vm_size = 'Basic_A0' #Tamaño (recursos) de la MV
azure.location = 'westeurope'
azure.vm_name = configs['vm_name']
azure.vm_password = configs['vm_password']
azure.resource_group_name= configs['vm_name_group']
azure.virtual_network_name= configs['vm_name_group']
azure.tcp_endpoints = '80:80'
azure.tenant_id = configs['AZURE_TENANT_ID']
azure.client_id = configs['AZURE_CLIENT_ID']
azure.client_secret = configs['AZURE_CLIENT_SECRET']
azure.subscription_id = configs['AZURE_SUBSCRIPTION_ID']
end
# Provisionar con ansible
config.vm.provision "ansible" do |ansible|
ansible.sudo = true
ansible.playbook = "playbooks.yml"
ansible.verbose = "-vvvv"
ansible.host_key_checking = false
end
end
Descripción del contenido
- Cargamos el archivo variables.yml
- Indicamos la box que debe usar, así com la red privada que tendrá, además de la redirección de puertos.
- Indicamos los datos del usuario que quiere desplegar la aplicación, indicamos donde está el certificado, así como nuestro identificadores que extraimos anteriormente, la imagen de SO que queremos que use la máquina virtual y contraseña.
- Método de provisionamiento.
Una vez creado y configurados estos cuatro archivo ejecutamos:
vagrant up --provider=azure
Si creamos la máquina y modificamos el playbooks.yml podemos actualizar con:
vagrant provision
Para conectar a nuestra máquina
vagrant ssh
Para eliminar la máquina virtual:
vagrant destroy
Resultados de la ejecución del vagrantfile:
Ejecución el playbook de ansible 
Despligue
Aunque le hayamos especificado en el Vagrantfile el puerto HTTP (80) debe estar abierto, es posible que no lo esté. Para solucionarlos nos vamos al portal de Azure, una vez en el portal: - Menú –> Máquinas virtuales - Pinchamos en el Grupo de recursos de la maquina a la que queremos abrir el puerto - Ahora en información general nos aparecen 6 elementos pinchamos en el que tiene tipo Grupo de seguridad de red - ulsamos en Reglas de seguridad de entrada –> Agregar –> rellenamos los campos y guardamos
Si queremos cambiar el nombre de dominio a nuestro proyecto tenemos: - Desde el portal de Azure - Menú –> Máquinas virtuales - Pinchamos en el Grupo de recursos de la maquina a la que queremos cambiar el DNS - Ahora en información general nos aparecen 6 elementos pinchamos en el que tiene tipo Dirección IP pública - Vamos a Configuración –> Cambiamos Etiqueta de nombre DNS y guardamos
Para desplegar la aplicación vamos a usar Fabric
Para esto vamos a crear el archivo fabfile.py que contiene diferentes funciones que serán las encargadas de realizar el proceso que deseamos remotamente.
Las posibles funciones que contiene el fichero son:
install: para instalar forever.
run_app: para ejecutar la aplicación
run_test: para ejecutar test de la BD
stop: para la ejecición de la aplicación
restart: reinicia la ejecución de la aplicación
pull: para actualizar el código de la aplicación.
Para usar Fabric es necesario instalarlo. Podemos hacerlo con apt-get.
apt-get install fabric
Para usarlo simplemente utilizamos el comando:
fab [-p claveMV][-H host_destino] <funcion>
-p indicamos la clave de la maquina virtual remota en la que realizar la acción.
-H indicamos el host remoto en el que realizar la acción.
En mi caso
sudo fab -p '*****' -H vagrant@viajessinbarreras.westeurope.cloudapp.azure.com run_app
Comprobación de que efectivamente funciona la aplicación
