Como implantar um aplicativo Nest.js?
A escolha da estratégia de implantação correta é importante para garantir que seu aplicativo funcione sem problemas e possa ser dimensionado conforme necessário. Este artigo explora as diferentes opções de implantação disponíveis para os aplicativos Nest.js. Especificamente, ele se concentra em como implantar aplicativos Nest.js em um contêiner Back4app.
Contents
- 1 Principais conclusões
- 2 O que é Nest.js?
- 3 Vantagens de usar o Nest.js
- 4 Desvantagens de usar o Nest.js
- 5 Opções de implantação do Nest.js
- 6 Como implantar aplicativos Nest.js em um contêiner Back4app
- 7 Criação de um aplicativo Nest.js
- 8 Dockerização do aplicativo Nest.js
- 9 Implantar um aplicativo Nest.js em um contêiner Back4app
- 10 Otimização da implementação usando uma compilação em vários estágios
- 11 Conclusão
- 12 PERGUNTAS FREQUENTES
- 13 O que é Nest.js?
- 14 Quais são as opções de deployment para Docker?
- 15 Como fazer o deploy de uma aplicação Nest.js?
Principais conclusões
- A escolha da estratégia de implementação correta para um aplicativo Nest.js é crucial para a escalabilidade e a operação tranquila.
- As opções de implantação incluem Infraestrutura como Serviço (IaaS) e Contêiner como Serviço (CaaS).
- O Back4app Containers é um provedor de CaaS popular para a implantação de aplicativos Nest.js, oferecendo maior abstração e gerenciamento simplificado.
O que é Nest.js?
O Nest.js é uma estrutura do Node.js para a criação de aplicativos dimensionáveis no lado do servidor. Ele resolve o problema de arquitetura que a maioria das estruturas e bibliotecas modernas não aborda usando uma estrutura arquitetônica modular. Essa arquitetura permite que os desenvolvedores criem bases de código bem organizadas, dimensionáveis e de fácil manutenção.
Vantagens de usar o Nest.js
Veja a seguir algumas das vantagens de usar o Nest.js:
- O Next.js tem uma forte opinião sobre como o código deve ser estruturado. Portanto, ele elimina o ônus de descobrir como organizar seu código por conta própria.
- Ele é compatível com TypeScript por padrão, mas também permite que você escreva código JavaScript puro.
- Ele usa a estrutura Express por padrão, mas pode ser configurado para usar o Fastify, que é mais rápido.
- O Nest.js se integra perfeitamente a bibliotecas de front-end como React e Angular.
- Ele tem uma ferramenta utilitária de linha de comando chamada NestCLI. Ela gera automaticamente código pré-escrito para partes importantes do seu aplicativo, como controladores, módulos e middleware, contribuindo para uma melhor experiência do desenvolvedor.
- O Nest.js tem suporte integrado para microsserviços. Ele oferece vários transportadores para troca de mensagens entre diferentes microsserviços.
- O Nest.js é compatível com a integração com qualquer banco de dados SQL ou NoSQL.
- Ele fornece integrações com bibliotecas de teste populares, como Supertest e Jest. Isso facilita a criação de testes de unidade, testes de integração e testes de ponta a ponta.
- O Nest.js oferece uma documentação abrangente e organizada, completa com exemplos de código.
Desvantagens de usar o Nest.js
Veja a seguir algumas das desvantagens de usar o Nest.js:
- O padrão de design dos aplicativos Nest.js pode não estar alinhado com as preferências de todos ou com os requisitos do projeto.
- O Nest.js abstrai a complexidade de vários processos e seu funcionamento interno. Essa abstração permite que os desenvolvedores se concentrem na lógica central do aplicativo sem se preocupar com os detalhes intrincados. No entanto, esse nível de abstração pode levar a uma sensação de dependência, pois os desenvolvedores têm visibilidade limitada dos detalhes específicos da implementação.
- O Nest.js vem com muitos recursos e capacidades. Há um risco potencial de os desenvolvedores criarem soluções com excesso de engenharia e afetarem os cronogramas dos projetos.
- O Nest.js tem uma curva de aprendizado mais acentuada devido à sua arquitetura complexa e ao uso do TypeScript pronto para uso,
A decisão de usar o Nest.js no seu projeto depende, em última análise, dos requisitos do projeto, da experiência da equipe e da preferência pessoal.
Considere os benefícios do Nest.js, seus recursos, suas desvantagens e a escala do seu projeto antes de tomar uma decisão.
Opções de implantação do Nest.js
Ao implantar aplicativos Nest.js, você tem várias opções, incluindo a infraestrutura como serviço (IaaS) e o contêiner como serviço (CaaS). Vamos discutir essas duas abordagens.
Infraestrutura como serviço
A infraestrutura como serviço (IaaS) é uma forma de computação em nuvem que fornece infraestrutura de servidor pela Internet. Essa infraestrutura inclui recursos de armazenamento, rede e computação que estão disponíveis sob demanda, permitindo que você dimensione sua infraestrutura conforme necessário.
Um dos principais benefícios da IaaS é o nível de controle que ela oferece. Ao implantar seu aplicativo, você tem a liberdade de configurar máquinas virtuais (computação), gerenciar a rede e garantir que seu aplicativo seja dimensionado e esteja disponível. Essa flexibilidade permite que você personalize a infraestrutura para atender aos requisitos do seu aplicativo.
A desvantagem de ter tanto controle é que sua equipe precisa gerenciar tudo. Isso pode custar caro.
Alguns dos provedores populares de IaaS incluem:
- Microsoft Azure
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
Contêineres como serviço
O Container as a Service (CaaS) é um serviço de nuvem para gerenciar contêineres. Ele fornece um nível mais alto de abstração sobre os recursos de computação, rede e armazenamento em comparação com o IaaS.
Com o CaaS, você empacota o código do aplicativo Nest.js, suas dependências, o tempo de execução e a configuração necessária para executar o aplicativo em um contêiner.
Esse contêiner é criado usando ferramentas de conteinerização como o Docker. Quando o contêiner estiver pronto, você poderá implantá-lo em um provedor de CaaS. O provedor de CaaS se encarrega de gerenciar e monitorar o aplicativo implantado em seu nome.
Como o contêiner é isolado, ele pode ser implantado em diferentes ambientes sem problemas de compatibilidade. Além disso, como o ambiente de execução do Nest.js é padronizado, seu aplicativo se comporta de forma consistente em diferentes ambientes, independentemente da infraestrutura subjacente.
O alto nível de abstração elimina a necessidade de os desenvolvedores lidarem com detalhes de infraestrutura de baixo nível, permitindo que eles se concentrem na lógica de um aplicativo. Isso aumenta a produtividade e permite iterações mais rápidas.
Alguns dos provedores populares de CaaS incluem:
- Back4app Containers
- Amazon Elastic Container Service (ECS)
- Google Kubernetes Engine (GKE)
Como implantar aplicativos Nest.js em um contêiner Back4app
Pré-requisitos
Para acompanhar este tutorial, verifique se você tem o seguinte:
- Node.js (versão >= 16) instalado em seu sistema operacional.
- Uma conta do GitHub com o Git configurado em seu sistema operacional.
- Docker instalado em sua máquina. Você pode instalar o Docker Desktop a partir do site oficial do Docker.
- Conhecimento prático do Nest.js.
Visão geral dos contêineres do Back4app
O Back4app Containers é um provedor de CaaS que cuida do processo de implementação para você. Ele gerencia a infraestrutura do servidor, eliminando a necessidade de configuração manual.
O Back4app se integra ao GitHub e permite que você adicione repositórios dockerizados ao seu aplicativo. Essa integração facilita a manutenção de seu aplicativo atualizado.
Com o recurso de implantação automática, o Back4app escuta em tempo real o seu repositório e reimplanta o aplicativo sempre que você mescla commits no branch implantado.
Você também pode monitorar sua implementação a partir do painel e resolver quaisquer problemas que possam surgir.
Introdução ao projeto
Neste guia, vamos percorrer o processo de implantação de um aplicativo Nest.js no Back4app. Para começar, criaremos um aplicativo Nest.js básico que será dockerizado e, em seguida, enviado para o GitHub. Por fim, implantaremos o aplicativo em um contêiner do Back4app.
Criação de um aplicativo Nest.js
Siga as etapas abaixo para criar um aplicativo Nest.js:
- Execute o comando abaixo em seu terminal para instalar a CLI do Nest.js globalmente.
npm install -g @nestjs/cli
- Execute o seguinte comando para gerar um novo aplicativo Nest.js.
nest new project-name
Sinta-se à vontade para substituir “project-name” pelo nome do seu aplicativo. Este tutorial usa o nestjs-deploy-back4app.
nest new nestjs-deploy-back4app
Esse comando criará todos os arquivos e pastas necessários para você começar.
- Navegue até o diretório do projeto criado e execute o seguinte comando para iniciar o servidor de desenvolvimento.
npm run start:dev
Isso observará quaisquer alterações em seu código e reiniciará automaticamente o servidor quando você salvar um arquivo.
Dockerização do aplicativo Nest.js
Para implantar o aplicativo Nest.js em um contêiner do Back4app, é necessário dockerizar o aplicativo usando o Docker.
Dockerizar um aplicativo significa criar uma imagem de contêiner para um aplicativo. Essa imagem de contêiner é um pacote de software isolado e executável que inclui tudo o que é necessário para executar o aplicativo.
Para criar uma imagem de contêiner, é necessário adicionar um Dockerfile
ao seu projeto.
Um Dockerfile é um arquivo de texto que fornece instruções sobre como criar a imagem do Docker. Ele especifica a imagem base a partir da qual você criará a imagem.
Ele também contém instruções para configurar o diretório de trabalho, instalar dependências e definir o comando para executar o aplicativo.
Siga as instruções abaixo para dockerizar um projeto Nest.js:
- Certifique-se de ter o Docker instalado em seu computador. Siga o guia oficial de instalação do Docker para instalar o Docker, caso não o tenha.
- Navegue até a raiz do diretório do projeto Nest.js e crie um arquivo chamado
Dockerfile
.
touch Dockerfile
- Com seu editor de código preferido, abra o Dockerfile e defina a imagem de base. Essa é a imagem a partir da qual você criará sua imagem de produção. Este tutorial usa a imagem do Node 20. Ela vem com o Node e o npm instalados.
FROM node:18-alpine
- Em seguida, crie o diretório de trabalho dentro da imagem. É nesse diretório que o código do aplicativo será armazenado.
WORKDIR /usr/src/app
- Copie os arquivos package.json e package-lock.json para o contêiner. Em seguida, execute o comando npm install para instalar as dependências do projeto.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
# Install project dependencies
RUN npm install
- Copie o restante do código do aplicativo para o contêiner.
COPY ..
- Execute o comando build para empacotar seu aplicativo. Esse comando compila o código TypeScript para JavaScript e o armazena na pasta dist.
RUN npm run build
- Expor a porta 3000. Isso especifica qual porta outros aplicativos devem usar para se comunicar com esse aplicativo em contêiner.
EXPOSE 3000/tcp
- Execute seu aplicativo. Aqui, usaremos
node dist/main.js
. A pasta dist contém o código compilado, enquanto o main.js é o ponto de entrada do aplicativo.
CMD [ "node", "dist/main.js" ]
No total, seu Dockerfile deve ter a seguinte aparência:
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" ]
Adicionar um arquivo .dockerignore
Um arquivo .dockerignore funciona como um arquivo .gitignore. Ele especifica quais arquivos o Docker deve ignorar. Ele impede que você adicione arquivos grandes e desnecessários ou dados confidenciais à imagem.
Para criá-lo, adicione um novo arquivo chamado .dockerignore na base da pasta do projeto Nest.js e adicione o seguinte.
.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*
Agora, os módulos do nó, os arquivos markdown, as variáveis de ambiente e os registros de depuração não serão copiados para a imagem do Docker.
Criar a imagem do Docker localmente
Execute o comando abaixo em seu terminal para garantir que o Dockerfile funcione.
docker build -t nestjs-back4app .
O sinalizador -t
permite que você marque sua imagem com um nome. Nesse caso, nestjs-back4app.
Se você executar imagens do docker
no terminal, verá a imagem criada.
REPOSITORY TAG IMAGE ID CREATED SIZE
nestjs-back4app latest afcba89613fc 39 seconds ago 333MB
Para executar o aplicativo localmente, use o seguinte comando.
docker run -p 49160:3000 -d nestjs-back4app
Isso redireciona a porta 49160 para a porta 3000 que especificamos no Dockerfile. Se você visitar localhost:49160, poderá acessar a página inicial do seu aplicativo.
Implantar um aplicativo Nest.js em um contêiner Back4app
Depois de ter certeza de que o Dockerfile funciona, você está pronto para implantar o aplicativo no Back4app.
Enviar aplicativo para o GitHub
O Back4app acessa seu aplicativo por meio do GitHub. Crie um novo repositório contendo o aplicativo Nest.js seguindo as etapas abaixo:
- Visite o GitHub e faça login em sua conta.
- Quando estiver conectado, clique no ícone “+” no canto superior direito da página e selecione “New repository” (Novo repositório) no menu suspenso.
- Na página “Create a new repository” (Criar um novo repositório), dê um nome ao seu repositório. Em seguida, clique em “Criar nome do repositório”. Anote a URL do repositório na próxima página.
De volta à pasta do projeto em seu computador local, execute o seguinte comando para enviar seu código para o repositório que você acabou de criar.
git remote add origin <https://github.com/remigathoni/nestjs-deploy-back4app.git>
git branch -M main
git push -u origin main
Depois de executar esses comandos, os arquivos do seu aplicativo serão adicionados ao repositório do GitHub.
Implante seu aplicativo Nest.js
Agora você pode implementar seu aplicativo no Back4app seguindo as etapas abaixo:
Inscreva-se em uma conta na Back4App, caso ainda não o tenha feito, ou faça login em sua conta. Você será redirecionado para o painel de controle.
No painel, clique em Criar um novo aplicativo.
O Back4app oferece duas opções para criar um aplicativo. Você pode usar o Backend como um serviço (BaaS) ou o Container como um serviço (CaaS).
O BaaS lida com todo o backend para você, enquanto o CaaS permite que você implemente um aplicativo em docker. Queremos implantar apenas o aplicativo Nest.js dockerizado, portanto, selecione Containers as a Service.
O Back4app solicitará que você conecte sua conta ao GitHub e conceda a ele permissão para acessar seus repositórios.
Selecione o repositório Nest.js.
Nas opções de implementação, adicione um nome para seu aplicativo. Você também pode definir o branch padrão, o diretório raiz, ativar ou desativar a implantação automática e definir variáveis de ambiente. Aqui, só precisamos definir o nome.
Clique no botão Criar aplicativo para implantar o aplicativo. Esse processo pode levar alguns minutos.
Basicamente é isso! Você implantou com sucesso um aplicativo Nest.js no Back4app gratuitamente.
Otimização da implementação usando uma compilação em vários estágios
No momento, o tamanho da imagem do docker é bastante grande, com 333 MB.
REPOSITORY TAG IMAGE ID CREATED SIZE
nestjs-back4app latest afcba89613fc 39 seconds ago 333MB
Para agilizar o tempo de implementação, é essencial reduzir o tamanho da imagem. Uma imagem menor também reduzirá os custos de armazenamento em nuvem e permitirá que você otimize seus recursos. Além disso, ela reduzirá as vulnerabilidades de segurança ao diminuir a área de superfície do ataque.
Para reduzir o tamanho da nossa imagem, podemos aproveitar as compilações em vários estágios.
As compilações em vários estágios permitem que você separe o ambiente de compilação do ambiente de tempo de execução. Isso permite instalar dependências e compilar o aplicativo em um contêiner separado. Posteriormente, você pode copiar apenas os arquivos necessários para a imagem de produção final.
Para começar, abra o Dockerfile no aplicativo Nest.js com seu editor de código e exclua seu conteúdo.
No Dockerfile, teremos dois estágios:
- O estágio de compilação responsável pela criação do aplicativo. Isso inclui a instalação das dependências e a compilação do TypeScript para JavaScript
- A página de produção que cria a imagem de tempo de execução. Ela contém todos os arquivos necessários para executar o aplicativo.
Um estágio é nomeado anexando AS *nome-do-estágio*
à instrução FROM
.
Definição do estágio de construção
Siga as instruções abaixo para usar a construção em vários estágios:
- Em seu DockerFile, defina um estágio da imagem de base do Node e nomeie-o como
build
.
FROM node:20-alpine as build
Observe que as imagens do node: -alpine base são muito mais finas do que as imagens do node:.
- Defina o diretório de trabalho.
WORKDIR /usr/src/app
- Copie os arquivos package.json e package-lock.json para o contêiner.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
- Instalar as dependências
RUN npm ci
Em vez do npm install
, estamos usando o npm ci
. Esses dois comandos são iguais, mas o npm ci garante uma instalação limpa das dependências sempre que for executado.
- Copie o código do aplicativo para o estágio de compilação.
COPY . .
- Compile o aplicativo executando o comando npm build.
npm run build
Definição da etapa de produção
Depois de criar o aplicativo, defina o estágio de produção.
- Adicione a imagem de base do Node.js e nomeie-a como produção.
FROM node:20-alpine AS build
- Defina o diretório de trabalho como você fez no estágio de compilação.
WORKDIR /usr/src/app
- Use o rótulo
from=build
para copiar a pastadist
e os módulos de nós da imagem de compilação para a imagem de produção atual.
COPY --from=build usr/src/app/dist ./dist
COPY --from=build usr/src/app/node_modules ./node_modules
- Expor a porta 3000
EXPOSE 3000/tcp
- Inicie o aplicativo usando o comando
CMD
.
CMD ["node", "dist/main.js"]
No total, seu Dockerfile deve ter a seguinte aparência:
# 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" ]
Se você compilar a imagem do docker agora, perceberá que seu tamanho foi significativamente reduzido.
REPOSITORY TAG IMAGE ID CREATED SIZE
nestjs-back4app-opt latest d29aedae9bef 5 seconds ago 186MB
Ao reduzir o tamanho, você aumentará o tempo de implementação e também reduzirá a quantidade de armazenamento necessária.
Conclusão
O Nest.js é uma estrutura do Node.js que tem uma arquitetura modular e opinativa. Ele permite que os desenvolvedores criem bases de código escalonáveis e de fácil manutenção.
Você tem várias opções para implantar um aplicativo Nest.js, incluindo plataformas de infraestrutura como serviço (IaaS) e contêiner como serviço (CaaS).
Um dos melhores provedores de CaaS é o Back4app Containers. Os contêineres da Back4app gerenciam e monitoram sua implementação, facilitando a transição do desenvolvimento para a produção.
Neste guia, você aprendeu a implantar um aplicativo Nest.js em um contêiner Back4app usando o Docker. Além disso, você explorou os benefícios de otimizar sua implementação usando compilações em vários estágios.
Agora você deve ser capaz de criar um aplicativo Nest.js, dockerizá-lo e implantá-lo no Back4app. O código-fonte está disponível neste repositório do GitHub e, para saber mais, visite a documentação sobre contêineres do Back4app.
PERGUNTAS FREQUENTES
O que é Nest.js?
Nest.js é um framework opinativo para Node.js construído com TypeScript. Ele segue uma abordagem de design modular, permitindo que os desenvolvedores criem bases de código bem organizadas, escaláveis e fáceis de manter.
Quais são as opções de deployment para Docker?
– IaaS (AWS, GCP, Azure)
– CaaS (Back4app Containers, AWS ECS, Google Kubernetes Engine (GKE))
Como fazer o deploy de uma aplicação Nest.js?
– Crie uma aplicação Nest.js.
– Dockerize a aplicação Nest.js.
– Envie a aplicação dockerizada para o GitHub.
– Crie uma conta no Back4app.
– Crie um container no Back4app.
– Dê acesso do Back4app ao seu GitHub.
– Selecione o repositório do Nest.js e faça o deploy da sua aplicação.