- O Que Você Vai Precisar
- Passo 1: Preparar o Servidor
- Passo 2: Instalar o Node.js com NVM
- Passo 3: Enviar o Projeto para o VPS
- Passo 4: Instalar e Configurar o PM2
- Passo 5: Instalar e Configurar o Nginx
- Passo 6: Configurar HTTPS com Certbot
- Passo 7: Ajustar o Firewall
- Verificando se Tudo Está Funcionando
- Considerações de Performance e Segurança
- FAQs
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
| Comando | O que faz |
|---|---|
pm2 list | Lista todos os processos ativos |
pm2 logs minha-app | Exibe os logs em tempo real |
pm2 restart minha-app | Reinicia o processo |
pm2 stop minha-app | Para o processo |
pm2 monit | Painel 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.



