Deploy Node.js em VPS: Guia PM2 e systemd

11 min de leitura Infraestrutura
Deploy Node.js em VPS: Guia PM2 e systemd

Introdução ao Deploy de Aplicações Node.js em Ambiente Linux

Ter uma aplicação Node.js funcionando no seu ambiente local é apenas o primeiro passo. Para colocar sua solução em produção, você precisa garantir que ela seja estável, segura e capaz de se recuperar automaticamente em caso de falhas ou reinicializações do servidor. Neste tutorial, vamos guiar você pelo processo completo de configuração de um servidor VPS (Virtual Private Server) Linux para hospedar sua aplicação Node.js utilizando as melhores práticas da indústria.

O foco principal deste guia é o uso conjunto do PM2 (um gerenciador de processos em produção para Node.js) e do systemd (o sistema de inicialização padrão da maioria das distribuições Linux modernas). Essa combinação oferece robustez, monitoramento de logs e reinicialização automática, transformando um script simples em um serviço profissional de infraestrutura.

Abaixo, detalhamos o passo a passo desde a instalação do ambiente até a criação de serviços automatizados. Siga as instruções com atenção para garantir que sua aplicação esteja pronta para receber tráfego real.

1. Preparação do Ambiente no Servidor

Antes de lidar com o código da sua aplicação, é essencial preparar o sistema operacional. Vamos assumir que você já possui acesso SSH à sua VPS e está conectado como usuário root ou um usuário com privilégios sudo.

Atualização do Sistema

O primeiro passo em qualquer configuração de servidor é garantir que os pacotes do sistema estejam atualizados. Isso corrige vulnerabilidades de segurança e garante compatibilidade.

apt update && apt upgrade -y
# Para usuários CentOS/RHEL/AlmaLinux:
# yum update -y

Instalação das Dependências Necessárias

Você precisará do Node.js para executar sua aplicação e do PM2 para gerenciá-lo. Embora seja possível instalar o Node.js via gerenciador de pacotes do sistema, a recomendação oficial da comunidade para ambientes de produção é utilizar o nvm (Node Version Manager) ou baixar os binários diretamente do site oficial, pois isso evita conflitos com bibliotecas do sistema operacional.

Neste tutorial, utilizaremos o método mais direto e estável: a instalação via repositório NodeSource.

curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs

Após a instalação, verifique as versões instaladas:

node -v
npm -v

Agora, instale o PM2 globalmente. Isso permite que você execute o comando pm2 de qualquer diretório no servidor.

npm install -g pm2

2. Transferência e Configuração da Aplicação

Agora que o ambiente está pronto, precisamos colocar sua aplicação na VPS. Você pode fazer isso via git clone, SCP ou SFTP.

Criação do Diretório de Deploy

É uma boa prática separar os dados da aplicação dos binários do sistema. Vamos criar um diretório dedicado, por exemplo, em /var/www/meu-app.

mkdir -p /var/www/meu-app
cd /var/www/meu-app

Transfira seus arquivos para este diretório. Se você usa Git:

git clone https://seu-repositorio.com/app.git .

Instalação das Dependências da Aplicação

Navegue até o diretório raiz do seu projeto e instale as dependências listadas no seu package.json. Em produção, é crucial usar o comando npm ci em vez de npm install, pois ele utiliza o arquivo package-lock.json para garantir uma instalação idêntica à que foi testada.

npm ci --production

O flag --production ignora as dependências de desenvolvimento (devDependencies), economizando espaço e tempo de carregamento.

3. Inicialização com PM2

Com a aplicação instalada, vamos iniciá-la usando o PM2. Diferente de rodar node index.js, o PM2 mantém o processo em segundo plano (daemon) e monitora sua saúde.

Iniciar a Aplicação

Execute o seguinte comando, substituindo app.js pelo nome do seu arquivo principal de entrada:

pm2 start app.js --name "minha-aplicacao"

O flag --name é importante para identificar facilmente o processo na lista de gerenciamento. Você pode verificar se a aplicação está rodando com:

pm2 list

Você também deve verificar os logs para garantir que não há erros de inicialização:

pm2 logs minha-aplicacao

Configuração de Arquivos Específicos

Em projetos complexos, é recomendável usar um arquivo ecosystem.config.js para definir variáveis de ambiente, número de instâncias e outras configurações. Para este tutorial básico, mantivemos a simplicidade com o comando direto.

4. Persistência com systemd

Aqui reside a diferença entre um hobbyista e um profissional. Se você reiniciar o servidor agora, a aplicação Node.js será desligada. O PM2 possui um recurso chamado startup, mas a integração nativa com systemd é mais robusta e padronizada em distribuições Linux.

O objetivo é criar um serviço systemd que inicie o PM2, e o PM2 por sua vez inicia a aplicação Node.js. No entanto, a abordagem moderna e mais limpa é fazer com que o systemd gerencie diretamente o processo pm2 do usuário, garantindo que ele seja reiniciado se falhar.

Criando o Arquivo de Serviço

Crie um novo arquivo de serviço no diretório de configurações do systemd. Vamos nomeá-lo pm2-minha-aplicacao.service.

nano /etc/systemd/system/pm2-minha-aplicacao.service

Cole a seguinte configuração, ajustando os caminhos conforme necessário:

[Unit]
Description=PM2 instance manager service for minha-aplicacao
After=network.target

[Service]
Type=forking
User=seu-usuario-linux
Group=seu-usuario-linux
ExecStart=/usr/bin/pm2 start /var/www/meu-app/app.js --name minha-aplicacao --interactive
ExecStop=/usr/bin/pm2 stop minha-aplicacao
ExecReload=/usr/bin/pm2 reload minha-aplicacao --interactive
Restart=on-failure

[Install]
WantedBy=multi-user.target

Explicação das diretrizes:

  • User/Group: Substitua seu-usuario-linux pelo usuário que possui acesso ao diretório da aplicação. Nunca rode como root.
  • ExecStart: Define o comando para iniciar a aplicação. O caminho completo do binário pm2 é importante para evitar erros de PATH.
  • Restart=on-failure: Garante que, se a aplicação cair por um erro não tratado, o sistema tente reiniciá-la automaticamente.

Habilitando e Iniciando o Serviço

Agora, recarregue o daemon do systemd para reconhecer o novo arquivo:

systemctl daemon-reload

Habilite o serviço para que ele inicie automaticamente durante o boot do servidor:

systemctl enable pm2-minha-aplicacao.service

Inicie o serviço pela primeira vez:

systemctl start pm2-minha-aplicacao.service

Verifique o status para garantir que tudo está correto:

systemctl status pm2-minha-aplicacao.service

Se houver erros, consulte os logs do systemd com journalctl -u pm2-minha-aplicacao.service -e.

5. Segurança e Otimização

Com a aplicação rodando e persistente, precisamos garantir que ela seja acessível de forma segura e eficiente.

Configuração do Firewall (UFW)

A maioria das VPS utiliza o UFW (Uncomplicated Firewall) no Ubuntu/Debian ou firewalld no CentOS. Vamos liberar apenas as portas necessárias (geralmente a 80 para HTTP e 443 para HTTPS).

ufw allow 'Nginx Full'
ufw enable

Importante: Não libere a porta onde sua aplicação Node.js está rodando internamente (ex: 3000, 8080). Deixe essa porta acessível apenas localmente (localhost) ou via um proxy reverso.

Proxy Reverso com Nginx

Rodar o Node.js diretamente expondo a porta não é recomendado para produção. Utilize o Nginx como um proxy reverso para lidar com conexões SSL, compressão e roteamento, encaminhando apenas o tráfego interno para o processo do PM2.

Crie um arquivo de configuração no Nginx:

nano /etc/nginx/sites-available/meu-app

Exemplo de configuração básica:

server {
    listen 80;
    server_name seu-dominio.com www.seu-dominio.com;

    location / {
        proxy_pass http://localhost:3000; # Porta onde o node app roda
        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;
    }
}

Ative o site e teste a configuração:

ln -s /etc/nginx/sites-available/meu-app /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx

6. Manutenção e Monitoramento Contínuo

Agora que seu ambiente está configurado, é importante saber como manter a aplicação saudável.

Logs e Diagnóstico

Para ver os logs da sua aplicação geridos pelo PM2:

pm2 logs minha-aplicacao --lines 100

Para monitorar o uso de CPU e memória em tempo real:

pm2 monit

Atualizações de Código

Quando você fizer alterações no código, não precisa parar o serviço manualmente. O PM2 permite reiniciar a aplicação com um único comando ou até mesmo automaticamente após mudanças nos arquivos (com a flag --watch, embora em produção seja preferível reiniciar manualmente para garantir transições limpas).

git pull origin main
npm ci --production
pm2 restart minha-aplicacao

Se você estiver usando o gerenciamento via systemd, pode recarregar a configuração do serviço se houver alterações no arquivo .service, mas para reiniciar a aplicação Node em si, basta usar o PM2 ou parar/iniciar o serviço systemd.

Backup de Configurações

Mantenha um backup das configurações do PM2. Isso facilita a restauração em caso de desastre:

pm2 save

O comando salva o estado atual dos processos no arquivo ~/.pm2/dump.pm2, permitindo que o PM2 restaure exatamente os mesmos processos ao ser iniciado.

Conclusão

Ao seguir este tutorial, você transformou um simples script Node.js em um serviço profissional de infraestrutura. A combinação de Node.js, PM2 e systemd oferece a estabilidade necessária para ambientes de produção, garantindo que sua aplicação esteja sempre disponível e pronta para escalar.

Lembre-se de monitorar regularmente o uso de recursos da sua VPS e atualizar as dependências do seu projeto periodicamente para manter a segurança. Com essa base sólida, você está preparado para lidar com os próximos desafios de escalabilidade e alta disponibilidade em suas aplicações web.

Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000