©2024 Escuela Tecnologías de la Información S.L. Todos los derechos reservados.
Curso de Deploy de Aplicaciones NodeJS
Aprende a llevar a producción aplicaciones NodeJS, mediante varias alternativas y las mejores prácticas
Material disponible
Este curso empieza justo donde acaban los demás cursos de NodeJS: aprendiendo a desplegar aplicaciones construidas con NodeJS, mediante diversas aproximaciones que irán incrementando sus ventajas progresivamente.
Generalmente en un curso de NodeJS se enseña a construir aplicaciones en este entorno, ya sean sitios, servicios web, etc. Sin embargo en esta ocasión vamos a partir del supuesto que los estudiantes son capaces de construir aplicaciones y vamos centrarnos en enseñar a desplegarla de diversos modos, que se pueden adaptar a diversas situaciones, infraestructura disponible o necesidades del proyecto.
Qué aprenderé en el Curso de Deploy de Aplicaciones NodeJS
Objetivos del curso
Clases y contenidos
Despliegue de app NodeJS en un VPS
Creación de un servidor privado virtual (VPS): instalación de todo el software en el servidor y despliegue de la app bajo HTTPS.
- Introducción y alternativas para el alojamiento de aplicaciones realizadas en NodeJS.
- Opciones cloud computing en diversos tipos de clientes y de proyectos.
En el primer bloque del vídeo se enumeran los temas que se van a desarrollar en esta clase. Luego veremos cómo crear un servidor privado virtual (VPS) con Digital Ocean. Comenzamos con este proveedor, que nos permite unas opciones básicas de cloud computing, muy fáciles de configurar y altamente amistosas para desarrolladores. Está orientado para proyectos pequeños o medianos y clientes con necesidades básicas y un control de presupuesto bajo. Lo que se conoce como VPS de manera genérica en Digital Ocean le denominan Droplet. Crearemos un primer droplet, explicando diferentes opciones y configuraciones.
Cómo generar una llave SSH en nuestro ordenador local. Cómo configurar esta llave para que sirva de acceso al droplet que estamos creando dentro de Digital Ocean.
Con este paso se completa el proceso de creación de la máquina virtual (VPS, Droplet) en Digital Ocean
En este vídeo realizamos un primer acceso a la máquina virtual creada en Digital Ocean.
Se explicará cómo crear un nuevo usuario en el servidor, al que le daremos permisos para realizar tareas como superusuario (con sudo). Luego, por motivos de seguridad, se bloqueará el acceso root en el servidor.
En este vídeo explicamos cómo se instala NodeJS en el servidor creado. Veremos cómo descargar NodeJS de los repositorios de Linux específicos para nuestra distribución y cómo instalar la plataforma Node en la máquina virtual.
Realizaremos una aplicación elemental con NodeJS, en local. Una vez creada se subirá a un repositorio Git remoto y se publicará en el servidor clonando el respositorio. Una vez publicada se podrá acceder a través de la IP del servidor y el puerto usado en la app.
En este vídeo se muestra cómo se puede registrar un dominio, en este caso gratuito, para nuestra aplicación. Cómo asociar al dominio la IP del servidor. Posteriormente se muestra cómo configurar el dominio también en el panel de control de Digital Ocean y cómo usando ese nombre de dominio somos capaces de acceder al servidor y nuestra app, por el puerto configurado.
Solamente a modo informativo, se muestra la posibilidad de configurar una aplicación creada por nosotros en NodeJS mediante el puerto 80. Se explica que el puerto 80 está reservado por el sistema operativo, por lo que este modo de actuar no es realmente recomendable y será mejorado en el siguiente vídeo.
En esta sección de la clase 1 se muestra cómo usar el servidor web Nginx como proxy inverso (reverse proxy). Es la manera adecuada de permitir que nuestra web se sirva a partir del puerto 80, aunque nuestra app esté escuchando realmente en otro puerto como el 3000. El proxy inverso será la vía que permitirá más tarde hacer el balanceo de carga mediante el propio Nginx.
En este momento tenemos Nginx configurado como proxy inverso, así que podemos usar el servidor web para permitir el balanceo de carga entre procesos Node. Mejoraremos el código de la aplicación para que seamos capaces de levantar varias instancias de la APP, en procesos NodeJS distintos, que escuchen en puertos distintos. Configuraremos Nginx para que se pueda balancear la carga entre los distintos procesos con las instancias de la aplicación.
Ahora vamos a aprender a configurar Nginx para alterar la manera de trabajar con el balanceo de carga, cambiando el algoritmo usado en el balanceo y cambiando el peso de cada proceso de Node, de modo que se use más uno que otro.
Generar un certificado SSL para usar en nuestra app, de manera que podamos servirla a través de https. Usaremos Let's Encrypt, ya que nos permite generar los certificados de seguridad de manera muy sencilla y gratuita. Instalaremos el certificado de seguridad en la configuración de Nginx y accederemos a la aplicación mediante https://
Gestión de los procesos Node
Gestión de los procesos de la aplicación NodeJS con Forever y PM2, monitorización y balanceo.
Explicamos una herramienta necesaria para mantener activos los procesos NodeJS que ponen en marcha una aplicación. Existen varias alternativas y en este curso vamos a ver un par de ellas. La más sencilla, a la que dedicamos este vídeo, es Forever.
- Qué es Forever y por qué lo necesitamos
- Correr procesos con Forever
- Consultar los log de las aplicaciones
- Configurar los procesos a ejecutar en un JSON
Qué es PM2 y cuáles son sus comandos principales para comenzar a trabajar. Crear procesos y pararlos, listar procesos y otras acciones básicas.
Dentro de PM2 podemos obtener una pantalla para la monitorización rápida de la aplicación, visible desde la línea de comandos. Permite ver los procesos del servidor donde se lance el comando "pm2 monit".
En este vídeo vamos a ver cómo con PM2 podemos controlar un cluster de procesos, instancias de una misma aplicación.
- Cómo crear procesos con un cluster, desde comandos de terminal PM2
- Cómo borrar todos los procesos
- Motivos por los que un cluster puede venirnos bien
- Opciones para restaurar los procesos al arranque del sistema
Keymetrics, los creadores de PM2 tienen un servicio que ofrece una cantidad de estadísticas detalladas sobre el funcionamiento de la aplicación, en tiempo real. Veremos qué ofrece Keymetrics y cómo usar Keymetrics para obtener información de uso de la app.
Deploy en cloud con Heroku
Cómo usar Heroku para el despliegue de una aplicación NodeJS en cloud, sin necesidad de un servidor.
Vemos qué es Heroku, las diferencias con respecto a otras alternativas para despliegue de aplicaciones NodeJS y los motivos que nos pueden hacer decidirnos, o no, por esta empresa de infraestructura.
Conocemos su dashboard y creamos una primera aplicación en Heroku.
Una vez creada nuestra primera aplicación, vamos a mostrar los pasos que podemos hacer para configurar el deploy de una aplicación.
Usaremos un repositorio de GitHub en el que hayamos colocado nuestro código. El primer deploy se activa de manera manual y a partir de ahí, en las siguientes ocasiones que se publique código en la rama concreta del repositorio, el deploy se realizará de manera automática.
En este vídeo repasamos diversos conceptos y terminología que son propios de Heroku y que conviene saber, pues ellos tienen una manera particular de llamar a las cosas, que usan en el dashboard y en la documentación.
Conocemos el archivo Procfile, que informa a Heroku características concretas de nuestra aplicación. Vemos cómo crear servicios que se pueden acceder de manera pública, a través de HTTP.
A través del dashboard podemos acceder al registro de actividad y los logs de las aplicaciones Heroku. Esto es importante, ya que al servidor no se puede acceder mediante consola y es la forma que ellos nos aportan para poder observar las cosas que están pasando dentro.
Como demostración se realizan algunos deploys automatizados y se observa el registro de actividad de la app. A través del registro de logs se observa qué salida se ha enviado a la consola mediante los típicos console.log de Node.
En esta sección vemos qué cosas se pueden configurar en una aplicación, en la pestaña de settings, haciendo especial énfasis en dos asuntos importantes:
-
Las variables de entorno del sistema, mediante las cuales podemos configurar cosas diversas e importantes que no queremos que estén en el código enviado a GitHub, como es el caso de las claves de acceso a servicios y bases de datos.
-
El dominio personalizado de la aplicación. Se muestra cómo configurar nuestro propio dominio para que el servidor responda a él.
En este punto se tratan toda una serie de servicios relacionados con aplicaciones Heroku, que no sería adecuado instalar en los propios Dynos, ya que el sistema de archivos de un Dyno es efímero.
Heroku y una serie de proveedores asociados ofrecen cantidad de servicios en la nube, no solo para aplicaciones NodeJS, sino para cualquier lenguaje. Ejemplos son bases de datos, sistemas de almacenamiento, manipulación de archivos, sistemas de logs, monitorización y un largo etc.
Aunque no se trata como contenido de esta clase, sí que se explica qué se necesita para implementar un balanceo de carga de nuestra aplicación en Heroku. Heroku en los planes profesionales cuenta con un autoescalado que se puede configurar de manera sencilla.
Se finaliza la clase resolviendo dudas diversas.
Amazon AWS y automatización del despliegue
Creación de infraestructura en Amazon y automatización de los deploys de las aplicaciones NodeJS con Jenkins. Funciones Lambda (Serverless en Amazon).
En esta clase se crea de manera manual infraestructura en Amazon, para entender los conceptos y la arquitectura de cloud de este proveedor. En este vídeo se configurarán las cosas básicas necesarias para comenzar.
- VPC: Creamos una red privada para nuestras máquinas virtuales.
- Subnet: En este paso tenemos que realizar una agrupación de recursos dentro de la red privada. Por ejemplo para tener una subnet pública y otra subnet privada. Es una forma de separar las capas de la aplicación, manteniendo públicas solamente aquellas que sea conveniente.
En esta sección vamos a crear máquinas virtuales en la infraestructura de red anterior. En los siguientes pasos veremos cómo se crean máquinas virtuales gratuitas, basadas en Linux para nuestras aplicaciones Amazon.
En las máquinas creadas definimos un script de configuración, que se ejecutará la primera vez que arranca la máquina y que automáticamente descargará una aplicación de su repositorio y la desplegará en el servidor recién creado.
Veremos cómo es un script básico para el despliegue automatizado, como se instalan dependencias y cómo se clona un repositorio de Git.
También se configura el security group para indicar qué puertos van a estar abiertos.
Conocemos el lenguaje Terraform, que nos permite crear infraestructura en varios proveedores de cloud, incluido Amazon, mediante código. Veremos cómo podemos hacer todo el proceso anterior visto en clase, en pocos instantes, mediante la ejecución de un script automatizado.
En esta sección creamos con Terraform nuevos scripts que nos permiten automatizar procesos un poco más complejos, enfocados en el escalado de servicios. En Amazon es posible definir un autoescalado, de manera que, cuando sea necesario, creará nuevas máquinas y cuando ya las máquinas no se necesiten, las dará de baja.
El autoescalado se puede configurar manualmente desde la página de Amazon, pero nosotros lo vamos a ver realizar de manera automatizada mediante scripts de Terraform.
En este punto usamos un script para realizar un test de stress en la aplicación, lo que nos permitirá ver si está funcionando nuestro balanceo de carga.
Veremos los tiempos de ejecución, tiempos de respuesta, etc. de nuestra aplicación, lo que es muy interesante para medir el rendimiento de la aplicación.
Explicamos Elastic Beanstalk de Amazon, una forma automática de crear y configurar todos los puntos vistos anteriormente en esta clase. Útil para aplicaciones sencillas que no interactúan con otros servicios de Amazon.
Veremos cómo podremos definir en el sitio de Amazon, de manera manual pero muy sencilla, un sistema de servidores con autoescalado y otra serie de cosas muy interesantes, sin tener que lidiar con diversas complejidades del proveedor cloud.
Luego veremos un script pipeline de Jenkins en el que podremos ver cómo realizar toda la automatización del deploy sobre los servidores de Amazon provisionados con Elastic Beanstalk.
En el último bloque de esta clase de automatización de despliegues en NodeJS vamos a abordar otro de los servicios de Amazon como las Lambda functions. Básicamente nos permite ejecutar funciones de NodeJS pero sin la necesidad de un servidor, algo conocido con el concepto de "serverless".
En la clase también usamos Jenkins para realizar el despliegue de las funciones lambda a Amazon.
Usar Docker para desplegar aplicaciones Node
Qué es Docker y Kubernetes, cómo usarlos para el despliegue de aplicaciones NodeJS en cluster.
Docker permite una verdadera independencia entre las aplicaciones y la infraestructura, amistoso para los desarrolladores.
En este vídeo se explica brevemente qué es Docker y algunos de los conceptos básicos relacionados, con los contenedores.
Explicamos qué es una imagen de Docker, cómo obtener imágenes y cómo crear contenedores a partir de ellas.
Mostramos diversos ejemplos en los que se crean contenedores y se ejecutan comandos a través de scripts en el archivo Dockerfile.
Docker ofrece una serie de comandos básicos para la gestión de contenedores. Existen muchos comandos que se pueden usar, para saber qué contenedores existen, o existieron en el sistema, cuáles se están ejecutando, qué imágenes están disponibles, etc.
Veremos algunos ejemplos de gestión de contenedores por comandos de terminal, usando Docker.
El repositorio público de imágenes es Docker hub https://hub.docker.com/.
Las imágenes son importantes porque nos permiten guardar el estado de contenedores en un momento dado, de modo que se pueda recuperar ese estado para la creación de nuevos contenedores en cualquier momento.
Es posible tener un repositorio privado para almacenar la imágenes de las aplicaciones privadas.
Explicamos cómo configurar el networking en contenedores Docker.
Cuando Docker se inicia, se crea una interfaz virtual llamada docker0 en el equipo host. Se asigna al azar una dirección y subred del rango privado definido por RFC 1918 que no están en uso en la máquina host, y lo asigna a docker0.
En este vídeo se muestran varios ejemplos de configuración de red que pueden ser útiles en múltiples y habituales situaciones.
Qué son los "Volumes" en Docker, espacios de almacenamiento que no se destruyen aunque los contenedores desaparezcan. Por qué son importantes en el trabajo con contenedores y Docker. Mostramos cómo crear un volumen y cómo crear un contenedor que hace uso de ese volumen. Mostramos que, a pesar que el contenedor se destruya en un momento dado, podemos seguir accediendo al volumen y su contenido.
En este vídeo vamos a ver qué es Kubernetes, herramienta esencial para desplegar aplicaciones en contenedores, aprovechando todas las ventajas de Docker. Se resumen algunas de las funciones de Kubernetes y los motivos por los que esta herramienta forma una parte tan fundamental del tooling con Docker. Además se ve otra herramienta que usa Kubernetes para crear un cluster de contenedores de una manera sencilla y visual: Tectonic. En los siguientes vídeos usaremos Kubernetes a través de Tectonic.
Cómo se crea un cluster de contenedores con Kubernetes, ayudados mediante la interfaz gráfica y de administración que nos proporciona Tectonic.
Vemos también el proceso de escalar y reducir el número de contenedores del cluster.
En este segundo vídeo de Kubernetes vemos otro ejemplo de despliegue de una aplicación NodeJS. Además vemos cómo realizar una prueba de carga y visualizar los valores que nos ofrece Tectonic de una forma gráfica, sobre los contenedores y su uso.
Finalizamos la clase con una serie de preguntas diversas.
Firebase Cloud Functions
Qué ofrecen las Cloud Functions de Firebase, cómo desarrollar y desplegar funciones cloud NodeJS en los servidores de Google.
Qué es Cloud Functions, qué necesidades resuelve en el marco del desarrollo de apps y Firebase. Qué ventajas obtenemos al usar Cloud Functions y que tipos de usos podemos darle a esta alternativa para la creación de código NodeJS para Backend.
Este vídeo es más bien teórico, por lo que si ya conoces Cloud Functions te lo podrías saltar. Aunque seguramente aún así sería útil, pues da una buena cantidad de ideas interesantes para las que vendría bien usar tu propio backend con Cloud Functions.
Cómo comenzar a usar Cloud Functions en un proyecto de app Firebase, instalando las dependencias necesarias en el proyecto mediante las herramientas Firebase-Tools. Cómo instalarlo en nuestro sistema, cómo generar código de una primera función. Cómo desplegar cloud functions y ver los logs (registros) en la consola de Firebase.
Firebase Admin es un módulo de NodeJS que contiene el código para poder usar la aplicación de Firebase desde el lado del backend, con permisos de super-usuario. Permite funciones especiales que no puedes hacer desde el frontend, y no necesita permisos de reglas de seguridad para poder trabajar.
Vemos cómo importar las firebase admin y cómo hacer un ejemplo de escritura en la base de datos, como respuesta a una request HTTPS.
En este vídeo introducimos el uso de eventos de servicios de Firebase y cómo reaccionar a ellos desde las Cloud Functions. Vemos un ejemplo sobre cómo reaccionar a eventos surgidos en la base de datos en tiempo real de Firebase. Esos eventos pueden ser de varios tipos, creaciones, escrituras, borrados y vemos un par de ejemplos diferentes en nuevas funciones.
En este vídeo se muestra cómo administrar eventos de usuarios desde Cloud Functions, de modo que podamos guardar sus datos en la base de datos cuando se registran, o marcar a los usuarios como borrados cuando sus cuentas se dan de baja.
Veremos que este paso facilita mucho el código frontend, ya que nos aligera una parte importante dentro de los procesos de login, que antes deberíamos de implementar en cada plataforma frontal de desarrollo.
Este es el último vídeo de la parte de Cloud Functions, en el que se muestra cómo realizar un flujo de trabajo más optimizado en el día a día de desarrollo. Ejecutar las funciones en local permite probar nuestra cloud function antes de desplegarla, lo que es especialmente interesante, debido a que el proceso de despliegue es a veces un poco lento. Además, mediante este mecanismo podríamos hacer testing de funciones, tanto como respuesta a endpoints HTTPS como a eventos de servicios de Firebase.
Valoraciones
Francisco José Reyes
Javier Riera Peiro
Erik Ramírez
Bernat tomas pujadas
Marcelino Dosil Arcos
¿Conoces nuestra tarifa plana?
Toda la formación de EscuelaIT, con más de 200 cursos completos para aprender las más variadas tecnologías de programación, diseño y marketing online. Todo! con tu suscripción.