Ing. Sistemas Computacionales

Mostrando las entradas con la etiqueta vagrant. Mostrar todas las entradas
Mostrando las entradas con la etiqueta vagrant. Mostrar todas las entradas

viernes, 6 de septiembre de 2024

Práctica | Desarrollar plantilla Vagrant + Ubuntu 20.40LTS + Docker + Docker-compose

septiembre 06, 2024 Creado por Victor Jesus Maximo Abundio Sin comentarios

Desarrollar plantilla Vagrant  + Ubuntu 20.40LTS + Docker + Docker-compose


Introducción

Vagrant es una herramienta que permite crear, configurar y gestionar máquinas virtuales de VirtualBox. Por otro lado, Docker es una herramienta para gestionar contenedores en entornos de desarrollo y producción, mientras que Docker-compose te permite gestionar dependencias y la orquestación de servicios. Docker y Docker-compose se complementan mutuamente. 


En este práctica vamos a crear una plantilla usando Vagrant para crear una maquina virtual con Ubuntu 20.04 LTS, y dentro de la máquina virtual se instala Docker y Docker Compose, esto será como una guía paso a paso para configurar un entorno de desarrollo eficiente y reproducible.


Ver proyecto (GitHub)



Objetivo

Esta plantilla sirve para aquellas personas que tienen pocos recursos en su maquina host, como bien se sabe Docker y Docker compose no está disponible para Windows, por lo que es necesario instalar un Subsistema de Windows para Linux (WSL) para poder usar Docker y Docker-compose, pero este consume muchos recursos en la máquina. Para intentar solventar esto creamos una máquina virtual usando Vagrant + Ubuntu 20.4LTS, que en lo particular me ha servido bastante.


Conocimientos obtenidos

Vagrant es una herramienta de software que se utiliza para crear y gestionar entornos de desarrollo virtualizados de manera sencilla y reproducible. Vagrant sirve para automatizar el proceso de creación, configuración y gestión de máquinas virtuales que funcionan como entornos de desarrollo aislados. 


Docker y Docker Compose son herramientas utilizadas en la gestión de aplicaciones basadas en contenedores. Facilitan la creación, despliegue y ejecución de aplicaciones en entornos aislados y reproducibles, mejorando la eficiencia y la consistencia en el desarrollo y la producción.


Ubuntu es una distribución del sistema operativo Linux basada en Debian, desarrollada y mantenida por Canonical Ltd.


Al desarrollar la práctica se obtiene conocimientos acerca de 

  • Vagrant   Para crear y configurar una máquina virtual.

  • Docker  Para descargar imágenes desde DockerHub

  • Docker-compose  Para complementar con Docker.

  • Git  Para crear commit, crear ramas, fusionar ramas, subir repositorio a GitHub, etc.

  • etc. 


Notas

  • La plantilla es solo una base para dockerizar o vagratizar un proyecto.

¿Cómo funciona?

Para poder simplificar las cosas, vamos a usar un repositorio github, que puedes consultarlo aquí


Estos son los pasos a seguir para poder levantar la caja de Vagrant


Paso 1)

Instalar VirtualBox, Extension_Pack para VirtualBox y Vagrant.


Paso 2)

Inicializar un nuevo caja Vagrant.


$ vagrant init  


Paso 3)


Copiar todo el contenido del archivo Vagrantfile de este repositorio, y reemplazarlo por el archivo generado por el paso anterior.


Paso 4)


Descargar los archivos script shell para linux llamados, setup.sh y vagrant.sh. Y colocarlos en la carpeta raíz del proyecto junto con el archivo Vagrantfile.


Paso 5)


Ejecuta el siguiente comando para arrancar la caja de vagrant. (Esto dura aprox. 15 min. la primera vez)


$ vagrant up


Paso 6)

Entrar a la caja de vagrant


$ vagrant ssh


Paso 7) (Opcional)

Instalar NVM, instalar la última versión de NodeJS y crear alias para Docker y Docker-compose


$ cd ~/workspace

$ dos2unix ./setup.sh

$ ./setup.sh

$ source ~/.bashrc


Paso 8) (Opcional)

Verificar toda la instalación de NodeJS, NVM, Docker, Docker-compose, Imagenes Docker, alias


$ node --version

$ nvm --version

$ docker --version

$ docker-compose --version

$ docker images

$ alias


Vista previas






sábado, 12 de agosto de 2023

Artículo | Comandos básicos de Vagrant

agosto 12, 2023 Creado por Victor Jesus Maximo Abundio Sin comentarios

Vagrant

Introducción

Vagrant es una herramienta de código abierto diseñada para simplificar la creación y gestión de entornos de desarrollo virtualizados. Desarrollada por HashiCorp, Vagrant permite a los desarrolladores definir y provisionar entornos de desarrollo consistentes y reproducibles mediante un archivo de configuración llamado Vagrantfile. Esto asegura que todos los miembros del equipo trabajen con las mismas versiones de software y configuraciones, eliminando el problema del "funciona en mi máquina". Vagrant es compatible con diversas plataformas de virtualización como VirtualBox, VMware y Docker, y soporta herramientas de provisionamiento como Puppet, Chef y Ansible. Ideal para proyectos con configuraciones complejas o para equipos de desarrollo que necesitan entornos uniformes, Vagrant facilita la automatización, el aislamiento y la portabilidad de entornos, mejorando la consistencia y eficiencia en el desarrollo de software.

¿Qué es?

Vagrant es una herramienta de código abierto que facilita la construcción y gestión de entornos de desarrollo virtualizados. Desarrollado por HashiCorp, Vagrant permite a los desarrolladores crear entornos de desarrollo reproducibles y consistentes utilizando máquinas virtuales. Proporciona una forma de automatizar la configuración y el despliegue de entornos virtuales, lo que permite a los equipos trabajar en un entorno común sin preocuparse por las diferencias entre las máquinas de desarrollo.

¿Cuáles son las características?

  • Automatización: Configura y provisiona máquinas virtuales de manera automática utilizando un archivo de configuración (Vagrantfile).

  • Compatibilidad: Compatible con diversas plataformas de virtualización como VirtualBox, VMware, y Docker.

  • Provisionamiento: Soporta varias herramientas de provisionamiento como Shell, Puppet, Chef, y Ansible.

  • Portabilidad: Los entornos pueden ser fácilmente compartidos y versionados a través de Vagrantfile.

  • Integración: Funciona bien con sistemas de control de versiones y CI/CD.

¿Para qué sirve?

  • Configuración Consistente: Permite crear entornos de desarrollo y pruebas consistentes y replicables, evitando el problema del "funciona en mi máquina".

  • Desarrollo Aislado: Proporciona entornos aislados para diferentes proyectos o versiones de software sin interferencia entre ellos.

  • Pruebas de Software: Facilita la creación de entornos de prueba que imitan la infraestructura de producción.

  • Educación y Demostraciones: Útil para crear entornos educativos o de demostración que sean fáciles de reproducir.

¿Cuándo usarlo?

Vagrant se usa cuando se trabaja en equipo y se requiere que todos los miembros tengan un entorno de desarrollo uniforme, es decir, que todos tengan el mismo ambiente de trabajo.


También sirve para proyectos que requieren configuraciones complejas o múltiples dependencias que deben ser configuradas de manera repetitiva.


Otras formas de usarlo:

  • Pruebas: Cuando se necesita un entorno de prueba que sea una réplica exacta del entorno de producción.

  • Educación: Para enseñar conceptos de virtualización y configuración de entornos.

  • Compartir: Cuando se necesita compartir un proyecto con un ambiente de desarrollo específico.

Ventajas

  • Reproducibilidad: Garantiza que el entorno de desarrollo sea consistente en todas las máquinas.

  • Automatización: Reduce la necesidad de configuraciones manuales al automatizar el proceso de provisión.

  • Aislamiento: Permite trabajar con diferentes versiones de software o configuraciones sin conflictos.

  • Facilidad de Uso: La configuración se realiza a través de un archivo sencillo (Vagrantfile), facilitando la gestión y compartición de entornos.

Desventajas

  • Consumo de Recursos: Las máquinas virtuales pueden consumir muchos recursos del sistema (CPU, memoria, almacenamiento).

  • Curva de Aprendizaje: Puede requerir tiempo para aprender a configurar y usar adecuadamente, especialmente si se integran herramientas de provisionamiento avanzadas.

  • Tiempo de Arranque: Las máquinas virtuales pueden tardar en iniciar, lo que puede afectar la velocidad de desarrollo y prueba.

  • Mantenimiento: Puede requerir mantenimiento adicional para mantener actualizadas las configuraciones y herramientas de provisionamiento.

Ejemplos

vagrant init: Inicializa un proyecto de Vagrant y crea un Vagrantfile.

vagrant up: Levanta el entorno de Vagrant (crea y arranca la máquina virtual).

vagrant ssh: Te conecta a la máquina virtual usando SSH.

vagrant halt: Apaga la máquina virtual.

vagrant destroy: Elimina la máquina virtual.

vagrant provision: Ejecuta la provisión (instalación y configuración de software) sin recrear la máquina virtual.

vagrant box add: Descarga una box pre configurada.


Ver proyecto (GitHub)

Conclusión

Vagrant es una herramienta poderosa para la creación de entornos virtualizados consistentes y reproducibles, adecuada para diversas aplicaciones en el desarrollo de software y la administración de sistemas.


viernes, 7 de abril de 2023

Proyecto | ReactJS | MusicApp

abril 07, 2023 Creado por Victor Jesus Maximo Abundio Sin comentarios

MusicApp | Aplicación web





Introducción



El proyecto Full-Stack consiste en registrar música con información sobre título, artista, género y año, por lo que todos pueden compartir la información de sus canciones favoritas sin necesidad de registrarse a la aplicación web. Fue creado por mi mismo, el día 7 de abril de 2023.


Este proyecto tiene una arquitectura "monolítica", fue desarrollado usando usando NodeJS + Express + Mongoose + MongoDB + Handlebars. Así también, se utilizó la base de datos de MongoDB para almacenar los datos usando Mongoose cómo ODM, por lo que los datos se guardan en la nube, y pueden ser fácilmente recuperados.


Por último, pero no menos importante, este proyecto, implementa Vagrant con Ubuntu 18.02LTS como sistema operativo, además de incluir Docker y Docker-compose para crear y lanzar servicios (mongodb:4.0, node:14.21.3-slim, ) por contenedores. Por lo que, se puede probar usando Docker / Docker-compose / NPM.


Ver proyecto (GitHub)

Funciones

Esta arquitectura está compuesto por un solo código que maneja las rutas (endpoints), la lógica de negocio, y la interacción con la base de datos, sigue el enfoque de una arquitectura "monolítica", similar a cómo se estructuran las aplicaciones con Laravel.

Este conjunto de tecnologías y características para este aplicación web:

  • Proyecto con infraestructura virtualizada o proyecto Vagrantizado.
  • Proyecto dockerizado.
  • Proyecto con arquitectura "monolítica".
  • Patrón de diseño MVC (Modelo-Vista-Controlador)
  • Base de datos usando MongoDB.
  • Mapeador de Documentos a Objetos (ODM con Mongoose).
  • Notificaciones de sistema.
  • CRUD para música (crear, leer, eliminar, actualizar).

¿Cómo funciona?

Configuración Backend

Es necesario crear un archivo `.env` del proyecto de backend dentro del path **/**(raíz), opcionalmente puede hacer una copia del archivo `.env.example` con el nombre de **.env** que incluyen variables de entorno


Variables de entorno para proyecto | Musicapp

  • APP_PORT *(Requerido)* Puerto para la aplicación por defecto es `3015`


Variables de entorno para base de datos | MongoDB Atlas

  • APP_DB_USER *(Requerido)*
  • APP_DB_PASSWORD *(Requerido)*
  • APP_DB_DATABASE *(Requerido)*


Variables de entorno para base de datos | Otros

  • APP_DB_URI *(Opcional)*
Solo en caso de requerir usuario y contraseña, por ejemplo: `mongodb://<user>:<password>@<host>:<port>/<database>?<options>`. Esta variable de entorno anula las anteriores.

El URI por defecto es mongodb://user_vagrant:pass@service_db/db_vagrant?authSource=admin

Correr aplicación de forma independiente (Usando npm)

Configuración previa

Antes de ejecutar la aplicación es necesario configurar el archivo `.env` en la ruta **./** (raíz), la configuración necesario es la siguiente:

```text
# MusicApp
APP_PORT=3015 # Puerto para Music App

# Database para Servidor de MongoDB Atlas
APP_DB_USER="<user>"
APP_DB_PASSWORD="<password>"
APP_DB_DATABASE="<database>"

# Database para Servidor Local
APP_DB_URI="mongodb://user_musicapp:pass@service_db/db_musicapp?authSource=admin" # Opcional
```

Iniciar la aplicación

Es necesario ejecutar el comando dentro del path para iniciar la aplicación ./ (raíz)

$ npm run start

Correr aplicación de forma automatizada (Usando docker-compose)


Es necesario ejecutar el siguiente comando desde donde se encuentra el archivo docker-compose.yml

Configuración previa

Antes de ejecutar los proyectos es necesario configurar el archivo `.env` en la ruta ./musicapp, la configuración necesario es la siguiente:

```text
# MusicApp
APP_PORT=3015 # Puerto para Music App

# Database para Servidor de MongoDB Atlas
APP_DB_USER="<user>"
APP_DB_PASSWORD="<password>"
APP_DB_DATABASE="<database>"

# Database para Servidor Local
APP_DB_URI="mongodb://user_musicapp:pass@service_db/db_musicapp?authSource=admin" # Opcional
```


Esto construye y corre la aplicación en segundo plano

$ docker-compose build && docker-compose up -d

Esto detiene y elimina la aplicación

$ docker-compose stop -f && docker-compose rm -f


Correr aplicación de forma automatizada (Usando vagrant)

Nota:

Es necesario ejecutar el siguiente comando desde el directorio/carpeta raíz donde se encuentra el archivo docker-compose.yml.


Cabe mencionar que el archivo docker-compose.yml es creado y configurado específicamente para ejecutarse dentro de vagrant.

Así también el comando "vagrant up" o "vagrant reload", levanta los servicios definidos en el archivo docker-compose.yml (Por defecto).

Configuración previa

Antes de ejecutar los proyectos es necesario configurar el archivo `.env` en la ruta ./musicapp, la configuración necesario es la siguiente:


```text
# MusicApp
APP_PORT=3015 # Puerto para Music App

# Database para Servidor de MongoDB Atlas
APP_DB_USER="<user>"
APP_DB_PASSWORD="<password>"
APP_DB_DATABASE="<database>"

# Database para Servidor Local
APP_DB_URI="mongodb://user_musicapp:pass@service_db/db_musicapp?authSource=admin" # Opcional
```



Crear maquina virtual

Este comando crea una máquina virtual usando 'vagrant' para correr docker y docker-compose dentro de ella. Por tal motivo, este comando se debe ejecutar una sola vez.

$ vagrant up


Construir y levantar el proyecto
Este comando reinicia la máquina virtual usando 'vagrant', así también ejecuta la provision run-workspace definida en el archivo Vagrantfile.

run-workspace : Suspende, Elimina, Construye y Levanta los servicios de __docker-compose__ en el mismo orden.

Por tal motivo, este comando se puede ejecutar las veces que sean necesarias.

$ vagrant reload

Vista previas







Proyecto | ReactJS + Axios | NodeJS + Express + Mongoose | CRUD de Mascotas

abril 07, 2023 Creado por Victor Jesus Maximo Abundio Sin comentarios

Mascotas | Aplicación web



Introducción

El proyecto Full-Stack consiste en registrar mascotas con información como edad, nombre, raza y enfermedades, por lo que todos pueden comparar la información de sus mascotas sin necesidad de registrarse a la aplicación web. Fue creado por mi mismo, el día 7 de abril de 2023, inicialmente fue creado una prueba técnica de un puesto de trabajo de desarrollador Full-Stack.


Este proyecto tiene una arquitectura de "FrontEnd y BackEnd desacoplados", fue desarrollado usando ReactJS + Axios para el lado de "FrontEnd" y usando NodeJS + Express + Mongoose para el lado del "BackEnd". 


También se utilizó la base de datos de MongoDB para almacenar los datos usando Mongoose cómo ODM, por lo que los datos se guardan en la nube, y pueden ser fácilmente recuperados.


Por último, pero no menos importante, este proyecto, implementa Vagrant con Ubuntu 18.02LTS como sistema operativo, además de incluir Docker y Docker-compose para crear y lanzar servicios (mongodb:4.0, node:14.21.3-slim, ) por contenedores. Por lo que, se puede probar usando Docker / Docker-compose / NPM.


Ver proyecto (GitHub)


Funciones

Esta arquitectura representa un enfoque completo y moderno para el desarrollo de aplicaciones web, integrando frontend, backend, y bases de datos, junto con herramientas de virtualización y contenedores para un manejo eficiente del entorno de desarrollo y despliegue.


Este conjunto de tecnologías y características para este aplicación web:

  • Proyecto con infraestructura virtualizada o proyecto Vagrantizado.

  • Proyecto dockerizado.

  • Proyecto de RectJS + Axios (FrontEnd).

  • Proyecto de NodeJS + Express + Moongose (BackEnd).

  • Base de datos usando MongoDB

  • Mapeador de Documentos a Objetos (ODM con Mongoose).

  • Notificaciones de sistema.

  • CRUD para mascotas (crear, leer, eliminar, actualizar).

¿Cómo funciona?

Es necesario crear un archivo `.env` del proyecto de backend dentro del path **./api**, opcionalmente puede hacer una copia del archivo `.env.example` con el nombre de **.env** que incluyen variables de entorno predeterminado o por default para funcionar con **docker-compose** y **vagrant**. <br> 


```text

# API Mascotas

API_PORT=3033 # Puerto para API mascotas

API_CORS_ORIGIN="http://localhost:3080" # URL de App mascotas


# Mongo Database para MongoDB Atlas

API_MONGO_HOST="<host>"

API_MONGO_PORT=<port>

API_MONGO_DATABASE="<database>"


# Mongo Database para MongoDB Local u Otro

API_MONGO_URI="mongodb://user_vagrant:pass@service_db/db_vagrant?authSource=admin"

```


Variables de entorno | Mascota Api

  • API_PORT *(Requerido)* Puerto para API mascota por default es `3033`

  • API_CORS_ORIGIN *(Requerido)* Es la URL del proyecto frontend de App Mascotas por default es `http://localhost:3033`


Variables de entorno para base de datos | Local u Otro

  • API_MONGO_HOST *(Requerido)*  

  • API_MONGO_PORT *(Requerido)* 

  • API_MONGO_DATABASE *(Requerido)*

  • API_MONGO_URI *(Opcional)* 

Solo en caso de requerir usuario y contraseña, por ejemplo: `mongodb://<user>:<password>@<host>:<port>/<database>?<options>`. Esta variable de entorno anula las anteriores.


El URI por defecto es `mongodb://user_vagrant:pass@service_db/db_vagrant?authSource=admin`


Configuración Previa | Frontend | Mascota App

Es necesario crear un archivo `.env` del proyecto de backend dentro del path **./mascotas-app**, opcionalmente puede hacer una copia del archivo `.env.example` con el nombre de **.env** que incluyen variables de entorno predeterminado o por default para funcionar con **docker-compose** y **vagrant**. <br> 


```text

# Base URL de Moscota API

REACT_APP_MASCOTA_API="http://localhost:3033/api/v1/mascota"

```


Variables de entorno | Mascota App

*  **REACT_APP_MASCOTA_API** *(Requerido)* Es la URL del proyecto backend de Mascotas API por default es `http://localhost:3033/api/v1/mascota`


Correr aplicación de forma independiente (Usando npm)

Es necesario ejecutar el siguiente comando desde donde se encuentra el archivo **package.json** de cada respectivo proyecto. 


Configuración previa

Antes de ejecutar los proyectos Frontend (App Mascotas) y Backend (API Mascota) es necesario configurar el archivo `.env`  de cada respectivo proyecto. 


Ejecutar Frontend

Es necesario ejecutar el proyecto frontend usando el sig. comando dentro del path **./mascotas-app/**


$ npm run start



Ejecutar Backend

Es necesario ejecutar el proyecto backend usando el sig. comando dentro del path **./api/**

$ npm run dev


Correr aplicación de forma automatizada (Usando docker-compose)

Es necesario ejecutar el siguiente comando desde donde se encuentra el archivo **docker-compose.yml** 


Configuración previa

Antes de ejecutar los proyectos Frontend (App Mascotas) y Backend (API Mascota) es necesario configurar el archivo `.env`  de cada respectivo proyecto. 


Esto construye y corre la aplicación en segundo plano


docker-compose build && docker-compose up -d



Esto detiene y elimina la aplicación


docker-compose stop -f && docker-compose rm -f



Correr aplicación de forma automatizada (Usando vagrant)

**Nota**

Es necesario ejecutar el siguiente comando desde la directorio/carpeta raíz donde se encuentra el archivo **Vagranfile** 


Cabe mencionar que el archivo **docker-compose.yml** Es creado y configurado específicamente para ejecutarse dentro de vagrant.

Así también el comando "vagrant up" o "vagrant reload", levanta los servicios definidas en el archivo **docker-compose.yml** (Por defecto).


Configuración previa

Antes de ejecutar los proyectos Frontend (App Mascotas) y Backend (API Mascota) es necesario configurar el archivo `.env`  de cada respectivo proyecto.


Crear maquina virtual

Este comando crea una máquina virtual usando **'vagrant'** para correr *docker* y *docker-compose* dentro de ella. <br>

Por tal motivo, este comando se debe ejecutar una sola vez. 


$ vagrant up 



Construir y levantar el proyecto

Este comando reinicia la maquina virtual usando **'vagrant'**, así también ejecuta la provision *run-workspace* definida en el archivo *Vagrantfile*. <br>

+ *run-workspace* : Suspende, Elimina, Construye y Levanta los servicios de *__docker-compose__* en el mismo orden. <br>


Por tal motivo, este comando se puede ejecutar las veces que sean necesarias. 


$ vagrant reload 


Ejecutar los contenedor individualmente y manualmente


Este comando levanta en segundo plano el servicio *__service_db__*


  $ doc run -d -p 2780:2780 -v /home/vagrant/data:/data/db -t service_db mongod --port 27080 --dbpath /data/db



Este comando levanta en segundo plano el servicio *__service_api__*


$ doc run -p 3033:3033 -v /home/max98/workspace/api/node_modules -t service_api npm run dev --no-deps




Vista previas