DEV Community 👩‍💻👨‍💻

Wanderson Alves Rodrigues
Wanderson Alves Rodrigues

Posted on

Preparar servidor para deploy NodeJs com PM2

No post anterior Preparar servidor para deploy NodeJs foi apresentado como preparar seu servidor http com NGINx.

Obs.: Para continuar nessa postagem de pm2 é obrigatório a leitura e execução dos passos da primeira(Preparar servidor para deploy NodeJs).

Hoje se o servidor reiniciar temos que manualmente subir a aplicação, isso é ruim e trabalhoso para facilitar a nossa vida existe o pacote pm2.

Para mais detalhes sugiro:

Pacote PM2

Executando o PM2 e o Node.js em ambientes de produção

PM2: Como utilizar no NodeJS e funcionalidades secretas

1 – O que é PM2?

O PM2(Process Manager 2) é um gerenciador de processos automatizados para aplicações NodeJs em ambiente de produção. Nossa aplicação será completamente gerenciada pelo PM2 isso quer dizer:

  • logs para auditoria e gerenciamento de erros;
  • automatização de reinicialização e muitas outras vantagens;

Nessa postagem vamos nos atentar a inicialização automática de processos e logs.

2 – Instalar pm2

No terminal execute o comandos:

sudo npm install -g pm2
Enter fullscreen mode Exit fullscreen mode

O comando acima vai baixar o pacote pm2 e instalar globalmente para acesso ao comando pm2 no terminal.

3 – Criar o serviço no pm2

Para criar o nosso serviço que executar a API que definimos no primeiro post:

pm2 start dist/server.js --name [INFORMAR_NOME_APLICACAO]
Enter fullscreen mode Exit fullscreen mode

Onde INFORMAR_NOME_APLICACAO* é o nome que devemos informar da nossa aplicação, isso fica mais fácil para identificá-la.
No meu exemplo irei chamar a aplicação de **api_deploy
que se encontra no caminho app/deploy/.
O comando completo pode ser visto abaixo:

pm2 start app/deploy/dist/server.js --name api_deploy
Enter fullscreen mode Exit fullscreen mode

Ao executar o comando acima para criar um serviço no pm2 referente a nossa aplicação será apresentado uma saída igual à imagem abaixo:
Alt Text

Na imagem podemos ver as informações:

  • id: Identificado único da nossa aplicação;
  • name: Nome que informamos ao criar;
  • pid: Caso precisar matar o processo só executar um kill;
  • uptime: Tempo decorrido da nossa aplicação;
  • status: Situação do processo;
  • cpu: Informação do CPU que nossa aplicação está usando;
  • mem: Memória usada pela nossa aplicação;

Para observar a lista de processos outra vez só executar o comando:

pm2 list
Enter fullscreen mode Exit fullscreen mode

4 – inicialização automática de processos

Para que nossa aplicação seja reiniciada caso ocorra um restart do servidor, seguem os passos:

pm2 startup systemd
Enter fullscreen mode Exit fullscreen mode

Primeiramente execute o comando acima, isso irá resultar em uma saída descrita abaixo:

[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u deploy --hp /home/deploy
Enter fullscreen mode Exit fullscreen mode

Para efetuar a configuração execute o comando gerado acima:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u deploy --hp /home/deploy
Enter fullscreen mode Exit fullscreen mode

Para finalizar a adição do serviço na lista de processos do pm2, execute:

pm2 save
Enter fullscreen mode Exit fullscreen mode

5 – Logs

Um coisa muito interessante do pm2 é a possibilidade de verificar os logs gerados por nossa aplicação para isso existe o comando:

pm2 logs
Enter fullscreen mode Exit fullscreen mode

Saída referente ao comando acima:

deploy@wanderson:~$ pm2 logs
[TAILING] Tailing last 15 lines for [all] processes (change the value with --lines option)
/home/deploy/.pm2/pm2.log last 15 lines:
PM2 | 2020-09-07T15:40:20: PM2 log: PM2 version : 4.4.1
PM2 | 2020-09-07T15:40:20: PM2 log: Node.js version : 12.18.3
PM2 | 2020-09-07T15:40:20: PM2 log: Current arch : x64
PM2 | 2020-09-07T15:40:20: PM2 log: PM2 home : /home/deploy/.pm2
PM2 | 2020-09-07T15:40:20: PM2 log: PM2 PID file : /home/deploy/.pm2/pm2.pid
PM2 | 2020-09-07T15:40:20: PM2 log: RPC socket file : /home/deploy/.pm2/rpc.sock
PM2 | 2020-09-07T15:40:20: PM2 log: BUS socket file : /home/deploy/.pm2/pub.sock
PM2 | 2020-09-07T15:40:20: PM2 log: Application log path : /home/deploy/.pm2/logs
PM2 | 2020-09-07T15:40:20: PM2 log: Worker Interval : 30000
PM2 | 2020-09-07T15:40:20: PM2 log: Process dump file : /home/deploy/.pm2/dump.pm2
PM2 | 2020-09-07T15:40:20: PM2 log: Concurrent actions : 2
PM2 | 2020-09-07T15:40:20: PM2 log: SIGTERM timeout : 1600
PM2 | 2020-09-07T15:40:20: PM2 log: ===============================================================================
PM2 | 2020-09-07T15:41:44: PM2 log: App [api_deploy:0] starting in -fork mode-
PM2 | 2020-09-07T15:41:44: PM2 log: App [api_deploy:0] online

/home/deploy/.pm2/logs/api-deploy-error.log last 15 lines:
/home/deploy/.pm2/logs/api-deploy-out.log last 15 lines:
0|api_depl | Server started on port 3333
Enter fullscreen mode Exit fullscreen mode

Porém existe a possibilidade de verifica logs de forma gráfica que é muito mais amigável, para isso execute:

pm2 monit
Enter fullscreen mode Exit fullscreen mode

O executar o comando acima será apresentado a saída:
Alt Text

Top comments (2)

Collapse
 
xavierjece profile image
Jecé Xavier

Tem como eu fazer um log que eu recebo no email que avisa se o server cair?

Collapse
 
wandealves profile image
Wanderson Alves Rodrigues Author

Vc pode capturar eventos em sua aplicação quando shutdown, agora para enviar email vai ter que pensar em uma solução que esteja fora do seu ambiente controlado pelo pm2

pm2.io/docs/runtime/best-practices...

In defense of the modern web

I expect I'll annoy everyone with this post: the anti-JavaScript crusaders, justly aghast at how much of the stuff we slather onto modern websites; the people arguing the web is a broken platform for interactive applications anyway and we should start over;

React users; the old guard with their artisanal JS and hand authored HTML; and Tom MacWright, someone I've admired from afar since I first became aware of his work on Mapbox many years ago. But I guess that's the price of having opinions.