¿Cómo desplegar una aplicación Nest.js?

How to Deploy a Nest.js Application_
How to Deploy a Nest.js Application_

Elegir la estrategia de despliegue adecuada es importante para garantizar que tu aplicación funciona sin problemas y es capaz de escalar según sea necesario. Este artículo explora las diferentes opciones de despliegue disponibles para las aplicaciones Nest.js. En concreto, se centra en cómo implementar aplicaciones Nest.js en un contenedor Back4app.

Principales conclusiones

  • Elegir la estrategia de despliegue adecuada para una aplicación Nest.js es crucial para la escalabilidad y el buen funcionamiento.
  • Las opciones de despliegue incluyen Infraestructura como Servicio (IaaS) y Contenedor como Servicio (CaaS).
  • Back4app Containers es un popular proveedor de CaaS para desplegar aplicaciones Nest.js, que ofrece una mayor abstracción y una gestión simplificada.

¿Qué es Nest.js?

Nest.js es un framework Node.js para construir aplicaciones escalables del lado del servidor. Resuelve el problema de arquitectura que la mayoría de los frameworks y librerías modernas no abordan mediante el uso de un marco arquitectónico modular. Esta arquitectura permite a los desarrolladores crear bases de código bien organizadas, escalables y mantenibles.

Ventajas de utilizar Nest.js

A continuación se indican algunas de las ventajas de utilizar Nest.js:

  • Next.js tiene una fuerte opinión sobre cómo debe estructurarse el código. Por lo tanto, elimina la carga de averiguar cómo organizar el código por su cuenta.
  • Es compatible con TypeScript por defecto, pero también permite escribir código JavaScript puro.
  • Utiliza el framework Express por defecto, pero puede configurarse para utilizar Fastify, que es más rápido.
  • Nest.js se integra sin problemas con bibliotecas frontales como React y Angular.
  • Cuenta con una herramienta de utilidad de línea de comandos llamada NestCLI. Genera automáticamente código preescrito para partes importantes de su aplicación, como controladores, módulos y middleware, lo que contribuye a mejorar la experiencia del desarrollador.
  • Nest.js tiene soporte integrado para microservicios. Ofrece varios transportadores para intercambiar mensajes entre diferentes microservicios.
  • Nest.js admite la integración con cualquier base de datos SQL o NoSQL.
  • Proporciona integraciones con bibliotecas de pruebas populares como Supertest y Jest. Esto facilita la escritura de pruebas unitarias, pruebas de integración y pruebas de extremo a extremo.
  • Nest.js ofrece una documentación completa y organizada, con ejemplos de código.

Desventajas del uso de Nest.js

A continuación se indican algunos de los inconvenientes de utilizar Nest.js:

  • El patrón de diseño de las aplicaciones Nest.js puede no ajustarse a las preferencias de todo el mundo o a los requisitos del proyecto.
  • Nest.js abstrae la complejidad de varios procesos y su funcionamiento interno. Esta abstracción permite a los desarrolladores concentrarse en la lógica central de la aplicación sin preocuparse de los intrincados detalles. Sin embargo, este nivel de abstracción puede llevar a una sensación de dependencia, ya que los desarrolladores tienen una visibilidad limitada de los detalles específicos de implementación.
  • Nest.js incluye muchas funciones y capacidades. Existe el riesgo potencial de que los desarrolladores diseñen soluciones demasiado complejas y afecten a los plazos del proyecto.
  • Nest.js tiene una curva de aprendizaje más pronunciada debido a su compleja arquitectura y al uso de TypeScript,

El uso de Nest.js para su proyecto depende en última instancia de los requisitos del proyecto, la experiencia del equipo y las preferencias personales.

Considera las ventajas de Nest.js, sus características, sus inconvenientes y la envergadura de tu proyecto antes de tomar una decisión.

Opciones de implantación de Nest.js

A la hora de desplegar aplicaciones Nest.js, tienes varias opciones, entre ellas la Infraestructura como Servicio (IaaS) y el Contenedor como Servicio (CaaS). Analicemos estos dos enfoques.

Infraestructura como servicio

La infraestructura como servicio (IaaS) es una forma de computación en nube que proporciona infraestructura de servidores a través de Internet. Esta infraestructura incluye recursos de almacenamiento, red y computación que están disponibles bajo demanda, lo que le permite escalar su infraestructura según sea necesario.

Una de las principales ventajas de IaaS es el nivel de control que ofrece. Al desplegar su aplicación, tiene libertad para configurar máquinas virtuales (computación), gestionar la red y asegurarse de que su aplicación escala y está disponible. Esta flexibilidad le permite personalizar la infraestructura para adaptarla a los requisitos de su aplicación.

El inconveniente de tener tanto control es que tu equipo tiene que gestionarlo todo. Esto puede resultar costoso.

Algunos de los proveedores de IaaS más populares son:

  • Microsoft Azure
  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)

Contenedores como servicio

Container as a Service (CaaS) es un servicio en la nube para gestionar contenedores. Proporciona un mayor nivel de abstracción sobre los recursos de computación, red y almacenamiento en comparación con IaaS.

Con CaaS, empaquetas el código de tu aplicación Nest.js, sus dependencias, el tiempo de ejecución y la configuración necesaria para ejecutar la aplicación en un contenedor.

Este contenedor se crea utilizando herramientas de contenedorización como Docker. Una vez que el contenedor está listo, puede desplegarlo en un proveedor de CaaS. El proveedor de CaaS se encarga de gestionar y supervisar la aplicación desplegada en su nombre.

Dado que el contenedor está aislado, puede desplegarse en distintos entornos sin problemas de compatibilidad. Además, como el entorno de ejecución de tu Nest.js está estandarizado, tu aplicación se comporta de forma coherente en distintos entornos, independientemente de la infraestructura subyacente.

El alto nivel de abstracción elimina la necesidad de que los desarrolladores manejen detalles de infraestructura de bajo nivel, lo que les permite centrarse en la lógica de una aplicación. Esto mejora la productividad y permite iteraciones más rápidas.

Algunos de los proveedores de CaaS más conocidos son:

  • Back4app Containers
  • Amazon Elastic Container Service (ECS)
  • Google Kubernetes Engine (GKE)

Cómo implementar aplicaciones Nest.js en un contenedor Back4app

Requisitos previos

Para seguir este tutorial, asegúrate de tener lo siguiente:

  • Node.js (versión >= 16) instalado en tu sistema operativo.
  • Una cuenta de GitHub con Git configurado en tu sistema operativo.
  • Docker instalado en tu máquina. Puede instalar Docker desktop desde el sitio oficial de Docker.
  • Conocimientos prácticos de Nest.js.

Visión general de los contenedores Back4app

Back4app Containers es un proveedor de CaaS que gestiona el proceso de despliegue por usted. Gestiona la infraestructura del servidor, eliminando la necesidad de configuración manual.

Back4app se integra con GitHub y te permite añadir repositorios dockerizados a tu aplicación. Esta integración hace que mantener tu aplicación actualizada sea más fácil.

Con la función de despliegue automático, Back4app escucha en tiempo real tu repositorio y vuelve a desplegar la aplicación cada vez que fusionas commits en la rama desplegada.

También puede supervisar su despliegue desde el panel de control y solucionar cualquier problema que pueda surgir.

Introducción del proyecto

En esta guía, recorreremos el proceso de despliegue de una aplicación Nest.js en Back4app. Para empezar, vamos a crear una aplicación Nest.js básica que vamos a dockerizar y luego empujar a GitHub. Finalmente, desplegaremos la aplicación en un contenedor Back4app.

Creación de una aplicación Nest.js

Sigue los siguientes pasos para crear una aplicación Nest.js:

  • Ejecute el siguiente comando en su terminal para instalar el Nest.js CLI globalmente.
npm install -g @nestjs/cli
  • Ejecuta el siguiente comando para generar una nueva aplicación Nest.js.
nest new project-name

Siéntase libre de reemplazar “project-name” con el nombre de su aplicación. Este tutorial utiliza nestjs-deploy-back4app.

nest new  nestjs-deploy-back4app

Este comando creará todos los archivos y carpetas necesarios para empezar.

  • Navegue hasta el directorio del proyecto creado y ejecute el siguiente comando para iniciar el servidor de desarrollo.
npm run start:dev

Esto vigilará cualquier cambio en su código y reiniciará automáticamente el servidor cuando guarde un archivo.

Dockerización de la aplicación Nest.js

Para desplegar la aplicación Nest.js en un contenedor Back4app, necesitas dockerizar tu aplicación usando Docker.

Dockerizar una aplicación significa crear una imagen de contenedor para una aplicación. Esta imagen de contenedor es un paquete de software aislado y ejecutable que incluye todo lo necesario para ejecutar la aplicación.

Para crear una imagen de contenedor necesitas añadir un Dockerfile a tu proyecto.

Un Dockerfile es un archivo de texto que proporciona instrucciones sobre cómo construir la imagen Docker. Especifica la imagen base a partir de la cual construirás la imagen.

También contiene instrucciones para establecer el directorio de trabajo, instalar dependencias y define el comando para ejecutar la aplicación.

Sigue las siguientes instrucciones para dockerizar un proyecto Nest.js:

  • Asegúrese de que tiene Docker instalado en su máquina. Si no lo tiene, siga la guía oficial de instalación de Docker.
  • Navega hasta la raíz del directorio de tu proyecto Nest.js y crea un archivo llamado Dockerfile.
touch Dockerfile
  • Con tu editor de código preferido, abre Dockerfile y define la imagen base. Esta es la imagen a partir de la cual construirás tu imagen de producción. Este tutorial utiliza la imagen Node 20. Viene con Node y npm instalados.
FROM node:18-alpine
  • A continuación, cree el directorio de trabajo dentro de la imagen. Aquí es donde se almacenará el código de su aplicación.
 WORKDIR /usr/src/app
  • Copia los archivos package.json y package-lock.json en el contenedor. A continuación, ejecuta el comando npm install para instalar las dependencias del proyecto.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./

# Install project dependencies
RUN npm install
  • Copie el resto del código de su aplicación en el contenedor.
COPY ..
  • Ejecuta el comando build para empaquetar tu aplicación. Este comando compila el código TypeScript a JavaScript y lo almacena en la carpeta dist.
RUN npm run build
  • Exponer puerto 3000. Especifica qué puerto deben utilizar otras aplicaciones para comunicarse con esta aplicación en contenedor.
EXPOSE 3000/tcp
  • Ejecute su aplicación. Aquí, usaremos node dist/main.js. La carpeta dist contiene el código compilado mientras que main.js es el punto de entrada de la aplicación.
CMD [ "node", "dist/main.js" ]

En total, tu Dockerfile debería tener este aspecto:

FROM node:20-alpine

WORKDIR /usr/src/app

COPY package*.json  ./

RUN npm ci

COPY . .

RUN npm run build

EXPOSE 3000/tcp

CMD [ "node", "dist/main.js" ]

Añadir un archivo .dockerignore

Un archivo .dockerignore funciona como un archivo .gitignore. Especifica qué archivos debe ignorar Docker. Evita que añadas archivos grandes e innecesarios o datos confidenciales a la imagen.

Para crearlo, añade un nuevo archivo llamado .dockerignore en la base de la carpeta de tu proyecto Nest.js y añade lo siguiente.

.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*

Ahora, tus módulos node, archivos markdown, variables env y registros de depuración no serán copiados a tu imagen Docker.

Cree la imagen Docker localmente

Ejecute el siguiente comando en su terminal para asegurarse de que el Dockerfile funciona.

docker build -t nestjs-back4app .

La bandera -t te permite etiquetar tu imagen con un nombre. En este caso, nestjs-back4app.

Si ejecutas docker images en el terminal, deberías ver la imagen creada.

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
nestjs-back4app   latest    afcba89613fc   39 seconds ago   333MB

Para ejecutar la aplicación localmente, utilice el siguiente comando.

docker run -p 49160:3000 -d nestjs-back4app

Esto redirige el puerto 49160 al puerto 3000 que especificamos en el Dockerfile. Si visitas localhost:49160, deberías poder acceder a la página de inicio de tu aplicación.

Implementar una aplicación Nest.js en un contenedor Back4app

Una vez que te hayas asegurado de que el Dockerfile funciona, ya estás listo para desplegar la aplicación en Back4app.

Empujar la aplicación a GitHub

Back4app accede a tu aplicación a través de GitHub. Crea un nuevo repositorio que contenga la aplicación Nest.js siguiendo los pasos que se indican a continuación:

  • Visita GitHub y accede a tu cuenta.
  • Una vez que hayas iniciado sesión, haz clic en el icono “+” de la esquina superior derecha de la página y selecciona “Nuevo repositorio” en el menú desplegable.
  • En la página “Crear un nuevo repositorio”, dale un nombre a tu repositorio. A continuación, haz clic en “Crear nombre de repositorio”. Anota la URL del repositorio en la página siguiente.

De vuelta en la carpeta de tu proyecto en tu máquina local, ejecuta el siguiente comando para enviar tu código al repositorio que acabas de crear.

git remote add origin <https://github.com/remigathoni/nestjs-deploy-back4app.git>
git branch -M main
git push -u origin main

Tras ejecutar estos comandos, los archivos de tu aplicación se añadirán al repositorio de GitHub.

Despliega tu aplicación Nest.js

Ahora puedes desplegar tu aplicación en Back4app siguiendo los siguientes pasos:

Regístrese para obtener una cuenta en Back4App si aún no lo ha hecho o, de lo contrario, inicie sesión en su cuenta. Se le redirigirá al panel de control.

En el panel de control, haz clic en Crear una nueva aplicación.

Despliega Nest.js en Back4app


Back4app ofrece dos opciones para construir una aplicación. Puedes utilizar Backend as a Service (BaaS) o Container as a Service (CaaS).

BaaS gestiona todo el backend por ti, mientras que CaaS te permite desplegar una aplicación dockerizada. Solo queremos desplegar la aplicación Nest.js dockerizada, así que selecciona Containers as a Service.

Captura de pantalla que muestra cómo crear una Back4app. Ya sea un Backend como app de servicio o un contenedor como app de servicio.

Back4app te pedirá que conectes tu cuenta a GitHub y le concedas permiso para acceder a tus repositorios.

Captura de pantalla que muestra cómo instalar y autorizar los contenedores Back4app

Selecciona el repositorio Nest.js.

Captura de pantalla que muestra cómo seleccionar un repositorio de GitHub para subirlo a Back4app

En las opciones de despliegue, añade un nombre para tu aplicación. También puedes establecer la rama por defecto, el directorio raíz, activar o desactivar el despliegue automático y establecer variables de entorno. Aquí, sólo tenemos que establecer el nombre.

Captura de pantalla que muestra cómo configurar el despliegue inicial de la aplicación Nestjs en Back4app.

Haga clic en el botón Crear aplicación para desplegar la aplicación. Este proceso puede tardar unos minutos.

¡Eso es básicamente todo! Has desplegado con éxito una aplicación Nest.js en Back4app de forma gratuita.

Optimización de la implantación mediante una compilación en varias fases

Ahora mismo el tamaño de la imagen docker es bastante grande, 333 MB.

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
nestjs-back4app   latest    afcba89613fc   39 seconds ago   333MB

Para agilizar los tiempos de despliegue, es esencial reducir el tamaño de la imagen. Una imagen más pequeña también reducirá los costes de almacenamiento en la nube y le permitirá optimizar sus recursos. Además, reducirá las vulnerabilidades de seguridad al disminuir la superficie de ataque.

Para reducir el tamaño de nuestra imagen, podemos aprovechar las construcciones multietapa.

Las compilaciones multietapa permiten separar el entorno de compilación del entorno de ejecución. Esto le permite instalar dependencias y compilar la aplicación en un contenedor separado. Más tarde, puedes copiar sólo los archivos necesarios en la imagen de producción final.

Para empezar, abre el Dockerfile de la aplicación Nest.js con tu editor de código y borra su contenido.

En el Dockerfile, tendremos dos etapas:

  • La etapa de compilación responsable de crear la aplicación. Incluye la instalación de las dependencias y la compilación de TypeScript a JavaScript.
  • La página de producción que crea la imagen de ejecución. Contiene todos los archivos necesarios para ejecutar la aplicación.

Una etapa se nombra añadiendo AS *nombre-de-la-etapa* a la instrucción FROM.

Definición de la fase de construcción

Siga las instrucciones siguientes para utilizar la construcción multietapa:

  • En tu DockerFile, define una etapa de la imagen base de Node y nómbrala build.
FROM node:20-alpine as build

Observe que las imágenes de base del nodo: -alpine son mucho más delgadas que las imágenes del nodo:.

  • Definir el directorio de trabajo.
WORKDIR /usr/src/app
  • Copie los archivos package.json y package-lock.json en el contenedor.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
  • Instalar las dependencias
RUN npm ci

En lugar de npm install estamos usando npm ci. Estos dos comandos son los mismos pero npm ci asegura una instalación limpia de las dependencias cada vez que se ejecuta.

  • Copie el código de la aplicación en la fase de compilación.
COPY . .
  • Construye la aplicación ejecutando el comando npm build.
npm run build

Definición de la fase de producción

Una vez que haya creado la aplicación, defina la fase de producción.

  • Añade la imagen base de Node.js y nómbrala producción.
FROM node:20-alpine AS build
  • Defina el directorio de trabajo como lo hizo en la etapa de construcción.
WORKDIR /usr/src/app
  • Utilice la etiqueta from=build para copiar la carpeta dist y los módulos de nodo de la imagen de compilación a la imagen de producción actual.
COPY  --from=build usr/src/app/dist ./dist
COPY  --from=build usr/src/app/node_modules ./node_modules
  • Exponer el puerto 3000
EXPOSE 3000/tcp 
  • Inicie la aplicación utilizando el comando CMD.
CMD ["node", "dist/main.js"]

En total, tu Dockerfile debería tener este aspecto:

# Build
FROM node:20-alpine AS build
WORKDIR /usr/src/app
COPY package*.json  ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --production

# Production
FROM node:20-alpine AS production
WORKDIR /usr/src/app

COPY  --from=build usr/src/app/dist ./dist
COPY  --from=build usr/src/app/node_modules ./node_modules

EXPOSE 3000/tcp
CMD [ "node", "dist/main.js" ]

Si construyes la imagen docker ahora, notarás que su tamaño se ha reducido significativamente.

REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
nestjs-back4app-opt    latest    d29aedae9bef   5 seconds ago   186MB

Al reducir el tamaño, habrás aumentado los tiempos de despliegue y también habrás reducido la cantidad de almacenamiento que necesitas.

Conclusión

Nest.js es un framework Node.js que tiene una arquitectura opinable y modular. Permite a los desarrolladores crear bases de código escalables y mantenibles.

Tienes varias opciones para desplegar una aplicación Nest.js, incluidas las plataformas Infraestructura como servicio (IaaS) y Contenedor como servicio (CaaS).

Uno de los mejores proveedores de CaaS es Back4app Containers. Los contenedores de Back4app gestionan y supervisan el despliegue, lo que facilita la transición del desarrollo a la producción.

En esta guía, has aprendido a desplegar una aplicación Nest.js en un contenedor Back4app utilizando Docker. Además, has explorado los beneficios de optimizar tu despliegue utilizando compilaciones multietapa.

Ahora deberías ser capaz de crear una aplicación Nest.js, dockerizarla y desplegarla en Back4app. El código fuente está disponible en este repositorio de GitHub y para obtener más información, visita la documentación de contenedores de Back4app.

PREGUNTAS FRECUENTES

¿Qué es Nest.js?

Nest.js es un framework opinado de Node.js construido con TypeScript. Sigue un enfoque de diseño modular, lo que permite a los desarrolladores crear bases de código bien organizadas, escalables y mantenibles.

¿Cuáles son las opciones de implementación para Docker?

– IaaS (AWS, GCP, Azure)
– CaaS (Back4app Containers, AWS ECS, Google Kubernetes Engine (GKE))

¿Cómo desplegar una aplicación Nest.js?

– Crea una aplicación Nest.js.
– Dockeriza la aplicación Nest.js.
– Sube la aplicación dockerizada a GitHub.
– Crea una cuenta en Back4app.
– Crea un contenedor en Back4app.
– Da acceso de Back4app a tu GitHub.
– Selecciona el repositorio de Nest.js y despliega tu aplicación.


Leave a reply

Your email address will not be published.