Como Hospedar um Projeto Node.js em VPS: Configuracao Completa com PM2 e Nginx

eb2473d9-0dc1-489a-9b12-cf58df8707a6

Hospedar uma aplicação Node.js em hospedagem compartilhada quase nunca funciona bem. Você não tem controle sobre o ambiente, não pode instalar versões específicas do Node, e processos em background simplesmente não sobrevivem. Um VPS resolve tudo isso.

Neste guia você vai ver o passo a passo completo para colocar um projeto Node.js em produção em um VPS Linux, usando PM2 para gerenciar o processo e Nginx como proxy reverso. O resultado é uma aplicação estável, que reinicia automaticamente após falhas e responde em uma URL pública com HTTPS.


O Que Você Vai Precisar

Antes de começar, tenha em mãos:

  • Um VPS com Ubuntu 22.04 ou 24.04 (mínimo 1 vCPU e 1 GB de RAM para projetos pequenos)
  • Acesso SSH ao servidor como root ou usuário com sudo
  • Um domínio apontando para o IP do VPS
  • Seu projeto Node.js funcionando localmente

Se você ainda não tem um servidor, a Napoleon oferece VPS com armazenamento NVMe e datacenters no Brasil e nos EUA — o que faz diferença real na latência para usuários brasileiros.


Passo 1: Preparar o Servidor

Conecte ao VPS via SSH:

ssh root@SEU_IP

Antes de qualquer coisa, atualize os pacotes do sistema:

apt update && apt upgrade -y

Crie um usuário dedicado para rodar a aplicação — isso é boa prática de segurança e vai fazer sentido mais adiante:

adduser deploy
usermod -aG sudo deploy

Passo 2: Instalar o Node.js com NVM

Evite instalar o Node.js pelo repositório padrão do Ubuntu. As versões costumam estar desatualizadas. Use o NVM (Node Version Manager) para ter controle total sobre qual versão está rodando.

Mude para o usuário deploy:

su - deploy

Instale o NVM:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

Recarregue o shell e instale a versão LTS do Node:

source ~/.bashrc
nvm install --lts
nvm use --lts

Confirme que tudo foi instalado corretamente:

node -v
npm -v

Passo 3: Enviar o Projeto para o VPS

Você pode usar git clone diretamente no servidor — a forma mais limpa — ou transferir os arquivos via SCP.

Opção A: Git Clone

cd /home/deploy
git clone https://github.com/seu-usuario/seu-projeto.git
cd seu-projeto
npm install --production

Opção B: SCP (da sua máquina local)

scp -r ./seu-projeto deploy@SEU_IP:/home/deploy/

Depois de enviar os arquivos, instale as dependências no servidor:

cd /home/deploy/seu-projeto
npm install --production

Variáveis de Ambiente

Nunca suba arquivos .env para o repositório. Crie o arquivo diretamente no servidor:

nano /home/deploy/seu-projeto/.env

Adicione suas variáveis — porta, credenciais de banco, chaves de API — e salve.


Passo 4: Instalar e Configurar o PM2

O PM2 é um gerenciador de processos para Node.js. Ele mantém sua aplicação rodando em background, reinicia automaticamente em caso de crash e sobe o processo junto com o sistema operacional.

Instale globalmente:

npm install -g pm2

Inicie sua aplicação (substitua server.js pelo arquivo de entrada do seu projeto):

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

Se o seu projeto usa um script npm como npm start:

pm2 start npm --name "minha-app" -- start

Comandos Úteis do PM2

ComandoO que faz
pm2 listLista todos os processos ativos
pm2 logs minha-appExibe os logs em tempo real
pm2 restart minha-appReinicia o processo
pm2 stop minha-appPara o processo
pm2 monitPainel de monitoramento no terminal

Fazer o PM2 Iniciar com o Sistema

Para garantir que a aplicação volte automaticamente após reinicializações do servidor:

pm2 startup

O comando vai gerar uma linha que você precisa executar como sudo. Copie e rode essa linha. Depois salve o estado atual:

pm2 save

Passo 5: Instalar e Configurar o Nginx

Por padrão, o Node.js roda em uma porta alta como 3000 ou 8080. O Nginx vai receber as requisições nas portas 80 e 443 e repassá-las para o processo Node.js — isso é o que chamamos de proxy reverso.

Instale o Nginx:

sudo apt install nginx -y

Crie um arquivo de configuração para o seu site:

sudo nano /etc/nginx/sites-available/minha-app

Cole a configuração abaixo, ajustando o domínio e a porta:

server {
    listen 80;
    server_name seudominio.com.br www.seudominio.com.br;

    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_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;
    }
}

Ative o site e teste a configuração:

sudo ln -s /etc/nginx/sites-available/minha-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Se nginx -t retornar syntax is ok e test is successful, está tudo certo.


Passo 6: Configurar HTTPS com Certbot

Rodar sem HTTPS não é uma opção. Além do impacto na segurança, navegadores marcam sites HTTP como inseguros — o que afeta diretamente a confiança de quem acessa.

Instale o Certbot:

sudo apt install certbot python3-certbot-nginx -y

Gere o certificado SSL para o seu domínio:

sudo certbot --nginx -d seudominio.com.br -d www.seudominio.com.br

O Certbot vai modificar automaticamente a configuração do Nginx para redirecionar HTTP para HTTPS e configurar a renovação automática do certificado. Para confirmar que o timer está ativo:

sudo systemctl status certbot.timer

Passo 7: Ajustar o Firewall

Libere apenas as portas necessárias:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

O perfil Nginx Full libera as portas 80 e 443. Certifique-se de liberar o SSH antes de ativar o firewall — caso contrário, você perde o acesso ao servidor.


Verificando se Tudo Está Funcionando

Com tudo configurado, acesse https://seudominio.com.br no navegador. Sua aplicação Node.js deve estar respondendo normalmente.

Para confirmar o status dos processos:

pm2 list                        # Verifica se a app está online
sudo systemctl status nginx     # Verifica o Nginx

Se algo não funcionar, comece pelos logs:

pm2 logs minha-app
sudo tail -f /var/log/nginx/error.log

Considerações de Performance e Segurança

Alguns ajustes simples que fazem diferença em produção:

Use um arquivo ecosystem do PM2 para projetos maiores. Um ecosystem.config.js na raiz do projeto centraliza as configurações de ambiente, número de instâncias e estratégia de reinicialização — muito mais fácil de manter do que flags na linha de comando.

Ative o modo cluster se o servidor tiver múltiplos núcleos. Substitua pm2 start server.js por pm2 start server.js -i max para distribuir a carga entre todos os CPUs disponíveis.

Não rode o Node.js como root. O usuário deploy que criamos no início serve exatamente para isso. Processos com privilégios mínimos limitam o impacto de eventuais vulnerabilidades.

Monitore o uso de recursos. O pm2 monit mostra CPU e memória em tempo real. Para uma visão mais completa do servidor, o htop ajuda a identificar gargalos antes que virem problema.


FAQs

Qual a diferença entre PM2 e rodar node server.js diretamente?
Rodar node server.js no terminal encerra o processo quando você fecha a sessão SSH. O PM2 mantém a aplicação ativa em background, reinicia automaticamente em caso de erro e persiste entre reinicializações do servidor.

Preciso abrir a porta 3000 no firewall para o Node.js funcionar com Nginx?
Não. O Nginx se comunica com o Node.js internamente via localhost, então a porta 3000 não precisa estar acessível externamente. Mantê-la fechada é mais seguro.

Posso hospedar mais de uma aplicação Node.js no mesmo VPS?
Sim. Cada aplicação roda em uma porta diferente — 3000, 3001, 4000 etc. — e você cria um bloco server separado no Nginx para cada domínio ou subdomínio, cada um apontando para a porta correspondente.

O que fazer se o Nginx retornar erro 502 Bad Gateway?
Esse erro geralmente indica que o Nginx não consegue se conectar ao processo Node.js. Verifique se a aplicação está rodando com pm2 list e se a porta configurada no Nginx bate com a porta que o Node.js está usando.

Como atualizar a aplicação ao fazer deploy de uma nova versão?
Faça o pull das alterações com git pull, instale dependências novas se houver com npm install --production, e reinicie o processo com pm2 restart minha-app. O PM2 garante que a aplicação volte imediatamente.

Qual tamanho de VPS é recomendado para uma aplicação Node.js em produção?
Depende do tráfego e da complexidade da aplicação. Para projetos pequenos ou APIs com baixo volume, 1 vCPU e 1 GB de RAM são suficientes para começar. Aplicações com mais usuários simultâneos ou processamento intenso se beneficiam de 2 vCPUs e 2 GB ou mais.

O Certbot renova o certificado SSL automaticamente?
Sim. O Certbot instala um timer no systemd que tenta renovar os certificados antes de expirarem. Você pode verificar com sudo certbot renew --dry-run para confirmar que a renovação automática está funcionando.


Seguindo esses passos, sua aplicação Node.js vai estar rodando em produção com gerenciamento de processos, proxy reverso e HTTPS configurados corretamente. Para quem está começando com infraestrutura própria, um VPS com bom suporte e armazenamento NVMe faz toda a diferença no dia a dia. Conheça as opções disponíveis em napoleon.com.br.

Compartilhe

Facebook
WhatsApp
Email
LinkedIn

Redes Sociais

Mais Populares

Receba as Últimas Novidades

Inscreva em Nossa Newsletter Semanal

Não realizamos spam, apenas novidades sobre produtos, dicas e tutoriais do universo online.

Categorias

Fique Ligado

Posts Relacionados