Preparar servidor para deploy NodeJs com PM2
Tags: javascript, node, pm2
Published: 2020-09-07 17:44:43

No post anterior [Preparar servidor para deploy NodeJs](https://dev.to/wandealves/preparar-servidor-para-deploy-nodejs-58pd) 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](https://www.npmjs.com/package/pm2)

[Executando o PM2 e o Node.js em ambientes de produção](https://imasters.com.br/back-end/executando-o-pm2-e-o-node-js-em-ambientes-de-producao)

[PM2: Como utilizar no NodeJS e funcionalidades secretas](https://blog.rocketseat.com.br/pm2-com-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:
```javascript
sudo npm install -g pm2
```
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:
```javascript
pm2 start dist/server.js --name [INFORMAR_NOME_APLICACAO]
```
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:
```javascript
pm2 start app/deploy/dist/server.js --name api_deploy
```
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](https://dev-to-uploads.s3.amazonaws.com/i/eczz9lucz02p4myulbce.png)

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:
```javascript
pm2 list
```

**4 – inicialização automática de processos**

Para que nossa aplicação seja reiniciada caso ocorra um **restart** do servidor, seguem os passos:
```javascript
pm2 startup systemd
```
Primeiramente execute o comando acima, isso irá resultar em uma saída descrita abaixo:
```javascript
[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
```
Para efetuar a configuração execute o comando gerado acima:
```javascript
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u deploy --hp /home/deploy
```
Para finalizar a adição do serviço na lista de processos do **pm2**, execute:
```javascript
pm2 save
```

**5 – Logs**

Um coisa muito interessante do **pm2** é a possibilidade de verificar os **logs** gerados por nossa aplicação para isso existe o comando:
```javascript
pm2 logs
```
Saída referente ao comando acima:
```javascript
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
```
Porém existe a possibilidade de verifica **logs** de forma gráfica que é muito mais amigável, para isso execute:
```javascript
pm2 monit
```
O executar o comando acima será apresentado a saída:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/y4x6jsu74v3iydqecy0k.png)