Como implantar um aplicativo NestJS com Nginx no Ubuntu VPS
Introdução
Os aplicativos da web modernos contam com um back-end firme e seguro. Assim, é essencial criar aplicações backend que sejam escaláveis, seguras e arquitetonicamente sofisticadas para serem gerenciadas por pequenas e/ou grandes equipes de desenvolvedores.
Os desenvolvedores modernos preferem usar JavaScript tanto no front quanto no back-end. Express.js é uma excelente estrutura de back-end JavaScript usada pela maioria dos desenvolvedores. No entanto, sua arquitetura mínima o torna inadequado para escalabilidade e manutenção por grandes equipes. É aqui que o Nest.js entra em ação. Nest.js possui uma arquitetura integrada, o que o torna altamente adequado para escalabilidade e implantação. Além disso, seu suporte nativo para TypeScript o torna mais produtivo para os desenvolvedores do que o JavaScript básico.
Neste tutorial, você aprenderá como implantar uma aplicação NestJS usando o servidor web Nginx, em um VPS. Você aprenderá como colocar seu aplicativo na web com a segurança necessária.
Pré-requisitos
Antes de prosseguir com o tutorial, você deve atender aos seguintes requisitos:
- Um Ubuntu 20.04+ VPS ou uma máquina Ubuntu física. (Usaremos Ubuntu 22.04 em um VPS neste tutorial)
- Gerenciador de pacotes Node.js e npm (ou yarn). Você pode consultar este tutorial DO sobre Como instalar o Node.js no Ubuntu | DigitalOcean para instalar as versões mais recentes do Node.js e npm em sua máquina._
- Servidor Web Nginx. Use este excelente guia DO sobre como instalar o Nginx no Ubuntu | DigitalOcean para instalar o Nginx em seu sistema Ubuntu.
Etapa 1 – Preparando e implantando um aplicativo NestJS
Nesta seção, você instalará a CLI NestJS e criará um aplicativo NestJS básico, que aprenderá a implantar usando Nginx em seções posteriores.
Instalando NestJS CLI globalmente
Para instalar o NestJS CLI em sua máquina Ubuntu, abra um terminal e digite o seguinte comando.
npm i -g @nestjs/cli
Isso instalará a interface de linha de comando NestJS em sua máquina. A seguir, você aprenderá como criar um novo projeto NestJS.
Criando um novo projeto NestJS
Agora, NestJS oferece duas maneiras de iniciar um novo projeto. Você pode escolher o método que melhor se adapta a você.
Usando a CLI NestJS
Para criar um projeto NestJS com a CLI, digite o seguinte comando.
nest new <project-name>
? Which package manager would you ❤️ to use? (Use arrow keys)
❯ npm
yarn
pnpm
Você obteria uma saída como a seguinte após a conclusão.
CREATE node_app/.eslintrc.js (663 bytes)
CREATE node_app/.prettierrc (51 bytes)
CREATE node_app/README.md (3340 bytes)
CREATE node_app/nest-cli.json (171 bytes)
CREATE node_app/package.json (1947 bytes)
CREATE node_app/tsconfig.build.json (97 bytes)
CREATE node_app/tsconfig.json (546 bytes)
CREATE node_app/src/app.controller.ts (274 bytes)
CREATE node_app/src/app.module.ts (249 bytes)
CREATE node_app/src/app.service.ts (142 bytes)
CREATE node_app/src/main.ts (208 bytes)
CREATE node_app/src/app.controller.spec.ts (617 bytes)
CREATE node_app/test/jest-e2e.json (183 bytes)
CREATE node_app/test/app.e2e-spec.ts (630 bytes)
Isso criará um novo projeto no diretório de trabalho atual. Você também pode fornecer o caminho absoluto para um diretório diferente, em vez de
.
Clonando o modelo inicial
NestJS oferece uma maneira alternativa de iniciar um novo projeto. É um repositório git que serve como modelo padrão. Você pode clonar esse repositório e iniciar o projeto com os seguintes comandos.
git clone https://github.com/nestjs/typescript-starter.git <project-directory >
Assim que a clonagem for concluída, você precisa cd
para o diretório do projeto e então executar npm install
para instalar as dependências de package.json
cd <project-directory>
npm install
Quando o projeto estiver pronto, você poderá iniciar o servidor de aplicativos usando o seguinte comando:
npm run start
Isso executará o aplicativo em http://localhost:3000. Agora você tem um aplicativo NestJS básico pronto para ser executado no host local.
Testando o aplicativo
Depois de desenvolver seu aplicativo, você pode executar testes nele para verificar se o aplicativo está funcionando conforme o esperado ou não. NestJS fornece testes Jest padrão, que executam testes em seu aplicativo. Você pode iniciar o teste usando o seguinte comando:
npm run test
Isso testará seu aplicativo e retornará resultados semelhantes aos seguintes:
> node_app@0.0.1 test
> jest
PASS src/app.controller.spec.ts
AppController
root
✓ should return "Hello World!" (24 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 2.895 s
Ran all test suites.
Na seção a seguir, você aprenderá como implantar este aplicativo NestJS em seu servidor web usando Nginx como proxy reverso.
Etapa 2 - Configurando o Nginx para servir o aplicativo NestJS
Agora, podemos prosseguir com a configuração do servidor web para hospedar este aplicativo NestJS. Estaremos usando a abordagem de proxy reverso. Nesta abordagem, executaremos nosso aplicativo no host local em uma determinada porta e, em seguida, usaremos o servidor Nginx para fazer proxy de quaisquer solicitações ao endereço IP público VPS ou domínio para o aplicativo no host local. O uso de servidores proxy reversos é uma prática do setor, pois aumenta a segurança do servidor web, criando uma barreira entre as solicitações recebidas e o próprio aplicativo backend. Além disso, os proxies reversos permitem um melhor gerenciamento de carga no servidor, especialmente ao usar o servidor para hospedar vários aplicativos da web.
Começaremos instalando o gerenciador de pacotes pm2
, que gerenciará a aplicação em tempo de execução.
Instalando o gerenciador de processos pm2
Você pode instalar o gerenciador de processos pm2
usando o seguinte comando.
npm install -g pm2
Isso instalará o pm2 globalmente em sua máquina.
Criando configuração Nginx para o aplicativo NestJS
Agora, configure o Nginx para executar o aplicativo. Certifique-se de ter permitido o aplicativo Nginx em seu firewall para HTTP e HTTPS, conforme mencionado no tutorial de pré-requisitos. Se você estiver usando o firewall ufw
, poderá fazê-lo seguindo os comandos.
ufw enable
ufw allow ‘Nginx Full‘
Agora, você criará um bloco de configuração para nosso aplicativo NestJS. Recomenda-se criar novos blocos de configuração para novas aplicações, em vez de editar a configuração padrão. Para criar o bloco, digite o seguinte código em seu terminal.
sudo nano /etc/nginx/sites-available/your_domain
Aqui, usamos your_domain para o aplicativo, mas você alterará isso para o nome do seu aplicativo. Em seguida, no editor, digite o seguinte código:
server {
server_name your_domain www.your_domain;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Agora, você criará um link simbólico, que instrui o Nginx a procurar aplicativos da web disponíveis na pasta sites disponíveis:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
Além disso, você precisaria desabilitar o link simbólico padrão, caso contrário, o nginx redirecionará todas as solicitações para o site padrão. Use o seguinte comando para desvinculá-lo.
sudo unlink /etc/nginx/sites-enabled/default
Agora, reinicie o serviço Nginx usando o seguinte comando.
sudo systemctl restart nginx
Implantando o aplicativo NestJS usando Nginx
Agora, você configurará o gerenciador de pacotes pm2 para lidar com a execução de seu aplicativo NestJS. Altere o diretório de trabalho para o diretório do aplicativo Nestjs e digite o seguinte comando.
pm2 start npm --name "your_domain" – start
Você pode executar o seguinte comando para configurar o pm2 para ser executado nas reinicializações do servidor.
pm2 startup
Quando terminar de configurar o aplicativo no pm2, vá em frente e salve a lista de processos do pm2 com o seguinte:
pm2 save
Agora, configuramos o aplicativo da web para ser executado na inicialização e configuramos o Nginx para reverter o proxy para nosso aplicativo em execução no host local.
Testando o aplicativo da web
Você pode testar o aplicativo da web em seu console digitando o seguinte comando.
curl http://localhost
Como configuramos o proxy reverso no próprio endereço IP do servidor, qualquer solicitação ao endereço IP público para seu servidor, domínio ou solicitação no host local do servidor será redirecionada para o aplicativo NestsJS seu_domínio
.
Hello World!
Na próxima seção, você aprenderá como adicionar SSL ao seu aplicativo, o que permitirá usar o protocolo HTTPS para suas solicitações.
Etapa 3 - Adicionando SSL usando Let's Encrypt (opcional)
Até agora, você aprendeu como implantar um aplicativo NestJS totalmente funcional com o servidor Nginx. No entanto, esta implantação utiliza o protocolo HTTP, que não é recomendado em produção devido à sua vulnerabilidade de exploração. Portanto, você gostaria de migrar para o protocolo HTTPS, que é a versão criptografada do HTTP. HTTPS usa certificados SSL/TLS fornecidos por uma autoridade de certificação. Esses certificados são específicos para um site e criptografam a comunicação entre cliente e servidor.
Nesta seção, você aprenderá a adicionar o certificado Let’s Encrypt SSL/TLS ao seu site.
Observação:: para prosseguir com esta seção, você precisa ter um certificado A para seu domínio. Neste exemplo, usamos seu_domínio, mas você deve adicionar certificados SSL somente após adicionar seu domínio ao site.
Instalando o Certbot CLI do Let's Encrypt
Let’s Encrypt fornece uma CLI para gerenciar e automatizar certificados SSL para consumidores. Você pode instalar a ferramenta com o seguinte comando:
sudo apt install certbot python3-certbot-nginx
Isso instala o cliente certbot em seu Ubuntu VPS.
Buscando certificados SSL/TLS para seu domínio
Agora, você pode buscar os certificados SSL para o seu domínio usando o seguinte comando
sudo certbot --nginx -d <your_domain> -d <www.your_domain>
Você precisará substituir seu_domínio
pelo nome real do seu domínio. Se esta for a primeira vez que você está executando o certbot em seu VPS, você será solicitado a inserir seu e-mail e concordar com os termos do usuário. Forneça as informações necessárias e prossiga.
Nota: Isso só funcionará se você tiver um domínio legítimo e tiver associado seu domínio ao seu aplicativo NestJS.
Depois que os certificados forem instalados, você poderá redirecionar todas as solicitações para HTTPS. É recomendável que você redirecione todas as solicitações para garantir a integridade do seu site.
Informações: Os certificados instalados pelo certbot têm validade de 90 dias. No entanto, o certbot automatiza a renovação desses certificados por conta própria, portanto, você não precisa verificar sua validade com frequência.
Conclusão
Neste tutorial, você aprendeu como implantar um aplicativo NestJS em produção em um Ubuntu VPS usando o servidor web Nginx. Você também aprendeu como configurar um projeto NestJS e um proxy reverso para seu aplicativo usando Nginx. Por fim, você aprendeu como adicionar certificados SSL/TLS ao domínio do seu servidor, garantindo a integridade das comunicações entre seus clientes e servidor.
Você pode expandir esse conhecimento criando aplicativos NestJS complexos, incluindo, entre outros, integração de banco de dados, validadores de entrada, etc.
O autor selecionou a Fundação OWASP para receber uma doação como parte do programa Write for DOnations.