Comment déployer une application Nest.js ?

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

Le choix de la bonne stratégie de déploiement est important pour garantir le bon fonctionnement de votre application et sa capacité à évoluer en fonction des besoins. Cet article explore les différentes options de déploiement disponibles pour les applications Nest.js. Plus précisément, il se concentre sur la façon de déployer les applications Nest.js dans un conteneur Back4app.

Principaux enseignements

  • Le choix de la bonne stratégie de déploiement pour une application Nest.js est crucial pour l’évolutivité et le bon fonctionnement.
  • Les options de déploiement comprennent l’infrastructure en tant que service (IaaS) et les conteneurs en tant que service (CaaS).
  • Back4app Containers est un fournisseur CaaS populaire pour le déploiement d’applications Nest.js, offrant une plus grande abstraction et une gestion simplifiée.

Qu’est-ce que Nest.js ?

Nest.js est un framework Node.js permettant de construire des applications côté serveur évolutives. Il résout le problème d’architecture que la plupart des frameworks et bibliothèques modernes n’abordent pas en utilisant un cadre architectural modulaire. Cette architecture permet aux développeurs de créer des bases de code bien organisées, évolutives et faciles à maintenir.

Avantages de l’utilisation de Nest.js

Voici quelques-uns des avantages de l’utilisation de Nest.js :

  • Next.js a une opinion bien arrêtée sur la façon dont le code devrait être structuré. Il vous évite donc d’avoir à trouver par vous-même comment organiser votre code.
  • Il prend en charge TypeScript par défaut, mais il vous permet également d’écrire du code JavaScript pur.
  • Il utilise par défaut le framework Express, mais peut être configuré pour utiliser Fastify, qui est plus rapide.
  • Nest.js s’intègre en douceur avec des bibliothèques frontales comme React et Angular.
  • Il dispose d’un outil utilitaire en ligne de commande appelé NestCLI. Il génère automatiquement du code pré-écrit pour les parties importantes de votre application, comme les contrôleurs, les modules et les intergiciels, ce qui contribue à améliorer l’expérience des développeurs.
  • Nest.js intègre la prise en charge des microservices. Il propose différents transporteurs pour l’échange de messages entre différents microservices.
  • Nest.js permet l’intégration de n’importe quelle base de données SQL ou NoSQL.
  • Il offre des intégrations avec des bibliothèques de test populaires telles que Supertest et Jest. Cela facilite l’écriture de tests unitaires, de tests d’intégration et de tests de bout en bout.
  • Nest.js offre une documentation complète et organisée, avec des exemples de code.

Inconvénients de l’utilisation de Nest.js

Voici quelques-uns des inconvénients de l’utilisation de Nest.js :

  • Le modèle de conception des applications Nest.js peut ne pas correspondre aux préférences de chacun ou aux exigences du projet.
  • Nest.js fait abstraction de la complexité des différents processus et de leur fonctionnement interne. Cette abstraction permet aux développeurs de se concentrer sur la logique de base de l’application sans se soucier des détails complexes. Cependant, ce niveau d’abstraction peut conduire à un sentiment de dépendance, car les développeurs n’ont qu’une visibilité limitée sur les détails spécifiques de la mise en œuvre.
  • Nest.js est livré avec un grand nombre de fonctionnalités et de capacités. Il existe un risque potentiel pour les développeurs de sur-ingénieriser les solutions et d’avoir un impact sur les délais des projets.
  • Nest.js a une courbe d’apprentissage plus raide en raison de son architecture complexe et de l’utilisation de TypeScript dès le départ,

L’utilisation de Nest.js pour votre projet dépend en fin de compte des exigences du projet, de l’expertise de l’équipe et des préférences personnelles.

Prenez en compte les avantages de Nest.js, ses caractéristiques, ses inconvénients et l’ampleur de votre projet avant de prendre une décision.

Options de déploiement de Nest.js

Lorsque vous déployez des applications Nest.js, plusieurs options s’offrent à vous, notamment l’infrastructure en tant que service (IaaS) et le conteneur en tant que service (CaaS). Examinons ces deux approches.

Infrastructure en tant que service

L’infrastructure en tant que service (IaaS) est une forme d’informatique en nuage qui fournit une infrastructure de serveur sur l’internet. Cette infrastructure comprend des ressources de stockage, de réseau et de calcul qui sont disponibles à la demande, ce qui vous permet de faire évoluer votre infrastructure en fonction de vos besoins.

L’un des principaux avantages de l’IaaS est le niveau de contrôle qu’il offre. Lors du déploiement de votre application, vous avez la liberté de configurer les machines virtuelles (compute), de gérer le réseau et de vous assurer que votre application est évolutive et disponible. Cette flexibilité vous permet de personnaliser l’infrastructure en fonction des besoins de votre application.

L’inconvénient d’un tel contrôle est que votre équipe doit tout gérer. Cela peut s’avérer coûteux.

Parmi les fournisseurs IaaS les plus populaires, on peut citer

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

Conteneurs en tant que service

Container as a Service (CaaS ) est un service en nuage pour la gestion des conteneurs. Il offre un niveau d’abstraction plus élevé sur les ressources de calcul, de réseau et de stockage par rapport à l’IaaS.

Avec CaaS, vous emballez le code de votre application Nest.js, ses dépendances, le moteur d’exécution et la configuration nécessaire à l’exécution de l’application dans un conteneur.

Ce conteneur est créé à l’aide d’outils de conteneurisation tels que Docker. Une fois le conteneur prêt, vous pouvez le déployer vers un fournisseur CaaS. Le fournisseur CaaS se charge de la gestion et de la surveillance de l’application déployée en votre nom.

Le conteneur étant isolé, il peut être déployé dans différents environnements sans problème de compatibilité. De plus, comme l’environnement d’exécution de votre Nest.js est normalisé, votre application se comporte de manière cohérente dans différents environnements, quelle que soit l’infrastructure sous-jacente.

Le haut niveau d’abstraction évite aux développeurs de devoir gérer des détails d’infrastructure de bas niveau, ce qui leur permet de se concentrer sur la logique de l’application. Cela améliore la productivité et permet des itérations plus rapides.

Parmi les fournisseurs de CaaS les plus populaires, on peut citer

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

Comment déployer des applications Nest.js dans un conteneur Back4app ?

Conditions préalables

Pour suivre ce tutoriel, assurez-vous d’avoir les éléments suivants :

  • Node.js (version >= 16) installé sur votre système d’exploitation.
  • Un compte GitHub avec Git configuré sur votre système d’exploitation.
  • Docker installé sur votre machine. Vous pouvez installer Docker desktop à partir du site officiel de Docker.
  • Connaissance pratique de Nest.js.

Aperçu des conteneurs Back4app

Back4app Containers est un fournisseur CaaS qui gère le processus de déploiement pour vous. Il gère l’infrastructure du serveur, supprimant ainsi la nécessité d’une configuration manuelle.

Back4app s’intègre à GitHub et vous permet d’ajouter des dépôts dockerisés à votre application. Cette intégration facilite la mise à jour de votre application.

Avec la fonction de déploiement automatique, Back4app écoute en temps réel votre référentiel et redéploie l’application à chaque fois que vous fusionnez des commits sur la branche déployée.

Vous pouvez également surveiller votre déploiement à partir du tableau de bord et résoudre les problèmes éventuels.

Introduction du projet

Dans ce guide, nous allons parcourir le processus de déploiement d’une application Nest.js sur Back4app. Pour commencer, nous allons créer une application Nest.js de base que nous allons dockeriser et ensuite pousser sur GitHub. Enfin, nous allons déployer l’application dans un conteneur Back4app.

Création d’une application Nest.js

Suivez les étapes ci-dessous pour créer une application Nest.js :

  • Exécutez la commande ci-dessous dans votre terminal pour installer globalement le CLI Nest.js.
npm install -g @nestjs/cli
  • Exécutez la commande suivante pour générer une nouvelle application Nest.js.
nest new project-name

N’hésitez pas à remplacer “project-name” par le nom de votre application. Ce tutoriel utilise nestjs-deploy-back4app.

nest new  nestjs-deploy-back4app

Cette commande créera tous les fichiers et dossiers dont vous aurez besoin pour commencer.

  • Naviguez jusqu’au répertoire du projet créé et exécutez la commande suivante pour lancer le serveur de développement.
npm run start:dev

Cette fonction surveille les modifications apportées à votre code et redémarre automatiquement le serveur lorsque vous enregistrez un fichier.

Dockeriser l’application Nest.js

Afin de déployer l’application Nest.js dans un conteneur Back4app, vous devez docker votre application à l’aide de Docker.

Dockeriser une application consiste à créer une image de conteneur pour une application. Cette image de conteneur est un logiciel isolé et exécutable qui comprend tout ce qui est nécessaire à l’exécution de l’application.

Pour créer une image de conteneur, vous devez ajouter un fichier Docker à votre projet.

Un Dockerfile est un fichier texte qui fournit des instructions sur la façon de construire l’image Docker. Il spécifie l’image de base à partir de laquelle vous allez construire l’image.

Il contient également des instructions pour définir le répertoire de travail, installer les dépendances et définir la commande d’exécution de l’application.

Suivez les instructions ci-dessous pour dockeriser un projet Nest.js :

  • Assurez-vous que Docker est installé sur votre machine. Si ce n’est pas le cas, suivez le guide d’installation officiel de Docker.
  • Naviguez jusqu’à la racine de votre répertoire de projet Nest.js et créez un fichier nommé Dockerfile.
touch Dockerfile
  • Avec votre éditeur de code préféré, ouvrez Dockerfile et définissez l’image de base. C’est l’image à partir de laquelle vous construirez votre image de production. Ce tutoriel utilise l’image Node 20. Elle est livrée avec Node et npm installés.
FROM node:18-alpine
  • Ensuite, créez le répertoire de travail à l’intérieur de l’image. C’est là que sera stocké le code de votre application.
 WORKDIR /usr/src/app
  • Copiez les fichiers package.json et package-lock.json dans le conteneur. Exécutez ensuite la commande npm install pour installer les dépendances du projet.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./

# Install project dependencies
RUN npm install
  • Copiez le reste du code de votre application dans le conteneur.
COPY ..
  • Exécutez la commande build pour regrouper votre application. Cette commande compile le code TypeScript en JavaScript et le stocke dans le dossier dist.
RUN npm run build
  • Exposer le port 3000. Ceci indique le port que les autres applications doivent utiliser pour communiquer avec cette application conteneurisée.
EXPOSE 3000/tcp
  • Exécutez votre application. Ici, nous utiliserons node dist/main.js. Le dossier dist contient le code compilé tandis que le dossier main.js est le point d’entrée de l’application.
CMD [ "node", "dist/main.js" ]

Au total, votre fichier Docker devrait ressembler à ceci :

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" ]

Ajouter un fichier .dockerignore

Un fichier .dockerignore fonctionne comme un fichier .gitignore. Il spécifie les fichiers que Docker doit ignorer. Il vous empêche d’ajouter des fichiers volumineux et inutiles ou des données sensibles à l’image.

Pour le créer, ajoutez un nouveau fichier nommé .dockerignore à la base de votre dossier de projet Nest.js et ajoutez ce qui suit.

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

Maintenant, vos modules node, fichiers markdown, variables env et journaux de débogage ne seront pas copiés dans votre image Docker.

Construire l’image Docker localement

Exécutez la commande ci-dessous dans votre terminal pour vous assurer que le fichier Docker fonctionne.

docker build -t nestjs-back4app .

L’option -t vous permet de donner un nom à votre image. Dans ce cas, nestjs-back4app.

Si vous lancez docker images dans le terminal, vous devriez voir l’image créée.

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

Pour exécuter l’application localement, utilisez la commande suivante.

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

Cela redirige le port 49160 vers le port 3000 que nous avons spécifié dans le fichier Docker. Si vous visitez localhost:49160, vous devriez pouvoir accéder à la page d’accueil de votre application.

Déployer une application Nest.js dans un conteneur Back4app

Une fois que vous vous êtes assuré que le fichier Docker fonctionne, vous êtes maintenant prêt à déployer l’application sur Back4app.

Pousser l’application vers GitHub

Back4app accède à votre application via GitHub. Créez un nouveau dépôt contenant l’application Nest.js en suivant les étapes ci-dessous :

  • Visitez GitHub et connectez-vous à votre compte.
  • Une fois connecté, cliquez sur l’icône “+” dans le coin supérieur droit de la page et sélectionnez “Nouveau dépôt” dans le menu déroulant.
  • Sur la page “Créer un nouveau référentiel”, donnez un nom à votre référentiel. Cliquez ensuite sur “Créer un nom de référentiel”. Notez l’URL du référentiel sur la page suivante.

De retour dans le dossier de votre projet sur votre machine locale, exécutez la commande suivante pour pousser votre code vers le dépôt que vous venez de créer.

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

Après avoir exécuté ces commandes, les fichiers de votre application seront ajoutés au dépôt GitHub.

Déployez votre application Nest.js

Vous pouvez maintenant déployer votre application sur Back4app en suivant les étapes ci-dessous :

Créez un compte sur Back4App si vous ne l’avez pas encore fait, sinon connectez-vous à votre compte. Vous serez redirigé vers le tableau de bord.

Sur le tableau de bord, cliquez sur Construire une nouvelle application.

Déployer Nest.js sur Back4app


Back4app offre deux options pour construire une application. Vous pouvez utiliser le Backend as a Service (BaaS) ou le Container as a Service (CaaS).

BaaS gère l’ensemble de votre backend pour vous, tandis que CaaS vous permet de déployer une application dockerisée. Nous voulons seulement déployer l’application Nest.js dockerisée, donc nous sélectionnons Containers as a Service.

Capture d'écran montrant comment créer une Back4app. Soit un Backend en tant qu'application de service, soit un conteneur en tant qu'application de service.

Back4app vous demandera de connecter votre compte à GitHub et de lui donner la permission d’accéder à vos dépôts.

Capture d'écran montrant comment installer et autoriser les conteneurs Back4app

Sélectionnez le dépôt Nest.js.

Capture d'écran montrant comment sélectionner un dépôt GitHub à télécharger dans Back4app

Dans les options de déploiement, ajoutez un nom pour votre application. Vous pouvez également définir la branche par défaut, le répertoire racine, activer ou désactiver le déploiement automatique et définir des variables d’environnement. Ici, nous n’avons besoin que de définir le nom.

Capture d'écran montrant comment configurer le déploiement initial de l'application Nestjs sur Back4app

Cliquez sur le bouton Créer une application pour déployer l’application. Ce processus peut prendre quelques minutes.

Voilà, c’est fait ! Vous avez déployé avec succès une application Nest.js sur Back4app gratuitement.

Optimiser le déploiement à l’aide d’une construction en plusieurs étapes

Pour l’instant, la taille de l’image docker est assez importante (333 Mo).

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

Pour un déploiement plus rapide, il est essentiel de réduire la taille de l’image. Une image plus petite réduira également les coûts de stockage dans le nuage et vous permettra d’optimiser vos ressources. En outre, elle réduira les vulnérabilités en matière de sécurité en diminuant la surface d’attaque.

Pour réduire la taille de notre image, nous pouvons utiliser des constructions en plusieurs étapes.

Les constructions en plusieurs étapes vous permettent de séparer l’environnement de construction de l’environnement d’exécution. Vous pouvez ainsi installer les dépendances et compiler l’application dans un conteneur distinct. Par la suite, vous pouvez copier uniquement les fichiers nécessaires dans l’image de production finale.

Pour commencer, ouvrez le fichier Docker dans l’application Nest.js avec votre éditeur de code et supprimez son contenu.

Dans le fichier Docker, nous aurons deux étapes :

  • L’étape de construction responsable de la construction de l’application. Elle comprend l’installation des dépendances et la compilation de TypeScript en JavaScript.
  • La page de production qui crée l’image d’exécution. Elle contient tous les fichiers nécessaires à l’exécution de l’application.

Une étape est nommée en ajoutant AS *nom de l'étape* à l’instruction FROM.

Définir la phase de construction

Suivez les instructions ci-dessous pour utiliser la construction en plusieurs étapes :

  • Dans votre fichier DockerFile, définissez une étape à partir de l’image de base de Node et nommez-la build.
FROM node:20-alpine as build

Notez que les images de node : -alpine base sont beaucoup plus fines que celles de node :.

  • Définir le répertoire de travail.
WORKDIR /usr/src/app
  • Copiez les fichiers package.json et package-lock.json dans le conteneur.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
  • Installer les dépendances
RUN npm ci

Au lieu de npm install, nous utilisons npm ci. Ces deux commandes sont identiques mais npm ci assure une installation propre des dépendances à chaque fois qu’il est exécuté.

  • Copier le code de l’application dans l’étape de construction.
COPY . .
  • Construisez l’application en lançant la commande npm build.
npm run build

Définir la phase de production

Une fois l’application construite, définissez la phase de production.

  • Ajoutez l’image de base Node.js et nommez-la production.
FROM node:20-alpine AS build
  • Définissez le répertoire de travail comme vous l’avez fait lors de la phase de construction.
WORKDIR /usr/src/app
  • Utilisez l’étiquette from=build pour copier le dossier dist et les modules node de l’image build vers l’image de production actuelle.
COPY  --from=build usr/src/app/dist ./dist
COPY  --from=build usr/src/app/node_modules ./node_modules
  • Exposer le port 3000
EXPOSE 3000/tcp 
  • Lancez l’application à l’aide de la commande CMD.
CMD ["node", "dist/main.js"]

Au total, votre fichier Docker devrait ressembler à ceci :

# 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 vous construisez l’image docker maintenant, vous remarquerez que sa taille a considérablement diminué.

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

En réduisant la taille, vous augmentez les délais de déploiement et vous réduisez également la quantité de stockage nécessaire.

Conclusion

Nest.js est un framework Node.js doté d’une architecture modulaire. Il permet aux développeurs de construire des bases de code évolutives et faciles à maintenir.

Vous disposez de plusieurs options pour déployer une application Nest.js, notamment les plateformes Infrastructure as a Service (IaaS) et Container as a Service (CaaS).

Back4app Containers est l’un des meilleurs fournisseurs de CaaS. Les conteneurs Back4app gèrent et surveillent votre déploiement, ce qui facilite le passage du développement à la production.

Dans ce guide, vous avez appris à déployer une application Nest.js dans un conteneur Back4app en utilisant Docker. En outre, vous avez exploré les avantages de l’optimisation de votre déploiement en utilisant des constructions en plusieurs étapes.

Vous devriez maintenant être en mesure de créer une application Nest.js, de la dockeriser et de la déployer sur Back4app. Le code source est disponible sur ce repo GitHub et pour en savoir plus, visitez la documentation sur les conteneurs Back4app.

FAQ

Qu’est-ce que Nest.js ?

Nest.js est un framework Node.js opinioné construit avec TypeScript. Il suit une approche de conception modulaire, permettant aux développeurs de créer des bases de code bien organisées, évolutives et faciles à maintenir.

Quelles sont les options de déploiement pour Docker ?

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

Comment déployer une application Nest.js ?

– Créez une application Nest.js.
– Dockerisez l’application Nest.js.
– Poussez l’application dockerisée sur GitHub.
– Créez un compte Back4app.
– Créez un conteneur Back4app.
– Autorisez Back4app à accéder à votre GitHub.
– Sélectionnez le dépôt Nest.js et déployez votre application.


Leave a reply

Your email address will not be published.