10 min de leitura · Guia técnico
Migrar aplicação Node.js do Heroku para VPS Ubuntu 22.04 é o processo de transferir uma aplicação JavaScript do servidor em nuvem Heroku para um servidor virtual privado com sistema Ubuntu. Para realizar esta migração sem downtime, siga estes passos:
- Preparar o ambiente Ubuntu 22.04 com Node.js e dependências
- Configurar Nginx como proxy reverso
- Transferir código fonte e configurar variáveis de ambiente
- Instalar e configurar PM2 para gerenciamento de processos
- Configurar SSL com Let's Encrypt
- Alterar registros DNS para apontar para o novo servidor
Pré-requisitos
- VPS Ubuntu 22.04 LTS com acesso root via SSH
- Aplicação Node.js funcionando no Heroku
- Domínio configurado com acesso aos registros DNS
- Heroku CLI instalado localmente
- Git configurado no ambiente local
- Conhecimento básico de linha de comando Linux
Preparando o ambiente Ubuntu 22.04 para Node.js
O primeiro passo para migrar Node.js do Heroku para VPS é preparar o ambiente do servidor. Conecte-se ao VPS via SSH e atualize o sistema:
sudo apt update && sudo apt upgrade -y
Instale o Node.js usando o NodeSource repository para obter a versão mais recente:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
Verifique se a instalação foi bem-sucedida:
node --version
npm --version
Output esperado:
v18.17.0
9.6.7
Instale dependências essenciais para compilação de módulos nativos:
sudo apt install -y build-essential git curl
Crie um usuário específico para a aplicação Node.js por questões de segurança:
sudo adduser nodeapp
sudo usermod -aG sudo nodeapp
Configurando Nginx como proxy reverso
A configuração do Nginx é fundamental para servir a aplicação Node.js em produção. Instale o Nginx:
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
Crie um arquivo de configuração para sua aplicação:
sudo nano /etc/nginx/sites-available/meuapp
Adicione a seguinte configuração, substituindo seudominio.com pelo seu domínio:
server {
listen 80;
server_name seudominio.com www.seudominio.com;
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_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
Ative a configuração e remova o site padrão:
sudo ln -s /etc/nginx/sites-available/meuapp /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
Transferindo código fonte e configurando variáveis de ambiente
Para transferir sua aplicação Node.js do Heroku para VPS, primeiro exporte as configurações do Heroku. No seu ambiente local, execute:
heroku config -a nome-da-sua-app
Output esperado:
DATABASE_URL: postgres://user:pass@host:5432/dbname
NODE_ENV: production
PORT: 3000
Clone o repositório da aplicação no VPS:
su - nodeapp
git clone https://github.com/seuusuario/sua-aplicacao.git
cd sua-aplicacao
Crie o arquivo de variáveis de ambiente:
nano .env
Adicione as variáveis exportadas do Heroku:
NODE_ENV=production
PORT=3000
DATABASE_URL=postgres://user:pass@host:5432/dbname
Atenção: Nunca commite o arquivo .env no repositório Git. Adicione-o ao .gitignore.
Instale as dependências da aplicação:
npm install --production
Teste se a aplicação inicia corretamente:
npm start
Instalando e configurando PM2 para gerenciamento de processos
O PM2 é essencial para manter aplicações Node.js rodando em produção no VPS. Instale o PM2 globalmente:
sudo npm install -g pm2
Crie um arquivo de configuração do PM2:
nano ecosystem.config.js
Configure o PM2 para sua aplicação:
module.exports = {
apps: [{
name: 'meuapp',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/err.log',
out_file: './logs/out.log',
log_file: './logs/combined.log',
time: true
}]
};
Crie o diretório de logs e inicie a aplicação:
mkdir logs
pm2 start ecosystem.config.js
pm2 save
pm2 startup
Execute o comando gerado pelo PM2 startup como root para configurar o auto-start:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u nodeapp --hp /home/nodeapp
Verifique se a aplicação está rodando:
pm2 status
Configurando SSL com Let's Encrypt
A configuração de SSL gratuito é crucial para aplicações em produção. Instale o Certbot:
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
Crie um link simbólico para o comando certbot:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Obtenha o certificado SSL para seu domínio:
sudo certbot --nginx -d seudominio.com -d www.seudominio.com
O Certbot irá modificar automaticamente a configuração do Nginx. Verifique se a configuração está correta:
sudo nginx -t
sudo systemctl reload nginx
Configure a renovação automática do certificado:
sudo crontab -e
Adicione a linha para renovação automática:
0 12 * * * /usr/bin/certbot renew --quiet
Alterando registros DNS para completar a migração
O último passo da migração Node.js do Heroku para VPS é alterar os registros DNS. Acesse o painel de controle do seu provedor de domínio e altere o registro A:
- Tipo: A
- Nome: @ (ou deixe em branco)
- Valor: IP do seu VPS
- TTL: 300 (5 minutos)
Altere também o registro CNAME para www:
- Tipo: CNAME
- Nome: www
- Valor: seudominio.com
- TTL: 300
Aguarde a propagação DNS (5 a 30 minutos) e teste o acesso ao seu domínio. Monitore os logs da aplicação durante a transição:
pm2 logs meuapp
Para verificar se o DNS propagou completamente:
dig seudominio.com
nslookup seudominio.com
Problemas comuns e como resolver
Aplicação não inicia após migração
Causa: Variáveis de ambiente não configuradas corretamente ou dependências faltando.
Solução: Verifique o arquivo .env, compare com as variáveis do Heroku usando heroku config e reinstale dependências com npm install.
Erro 502 Bad Gateway no navegador
Causa: Aplicação Node.js não está rodando na porta configurada no Nginx ou PM2 não iniciou corretamente.
Solução: Verifique se a aplicação está rodando com pm2 status e confirme se a porta no Nginx corresponde à porta da aplicação.
SSL não funciona após configuração
Causa: Certificado não foi gerado corretamente ou configuração do Nginx está incorreta.
Solução: Execute sudo certbot certificates para verificar certificados válidos e sudo nginx -t para validar a configuração.
Performance inferior ao Heroku
Causa: Aplicação rodando em modo single-thread ou recursos do VPS insuficientes.
Solução: Configure o PM2 em modo cluster com instances: 'max' no ecosystem.config.js e monitore recursos com htop.
Perguntas frequentes sobre migração Node.js do Heroku para VPS
É possível migrar Node.js do Heroku para VPS sem downtime?
Sim, é possível migrar sem downtime usando estratégia de DNS switching. Configure primeiro o VPS completamente, teste a aplicação, depois altere os registros DNS para apontar para o novo servidor. O processo leva de 5 a 30 minutos dependendo da propagação DNS.
Quais são os principais benefícios de migrar do Heroku para VPS?
Os principais benefícios incluem redução de custos (até 70% menos), controle total sobre o ambiente, sem limitações de dyno hours, possibilidade de usar qualquer versão do Node.js, acesso root completo e capacidade de instalar dependências específicas do sistema.
Como garantir que as variáveis de ambiente sejam migradas corretamente?
Exporte as variáveis do Heroku usando 'heroku config' e recrie-as no VPS através de arquivo .env ou configuração do PM2. Nunca exponha credenciais em código fonte e sempre use arquivos de configuração separados para produção.
O PM2 é obrigatório para rodar Node.js em produção no VPS?
Embora não seja obrigatório, o PM2 é altamente recomendado para produção. Ele oferece restart automático em caso de crash, clustering para usar múltiplos cores da CPU, logs centralizados e monitoramento de recursos. Sem ele, você precisaria configurar manualmente systemd ou supervisor.
Como configurar SSL gratuito após a migração para VPS?
Use Let's Encrypt com Certbot para SSL gratuito. Instale o Certbot, configure o Nginx como proxy reverso, execute 'certbot --nginx -d seudominio.com' e configure renovação automática via cron. O processo é totalmente automatizado e o certificado renova a cada 90 dias.
Conclusão
- Configure o ambiente Ubuntu 22.04 com Node.js, Nginx e PM2 antes de alterar o DNS
- Use PM2 em modo cluster para aproveitar todos os cores da CPU e garantir alta disponibilidade
- Monitore logs e performance após a migração para identificar possíveis otimizações
Leia também
- Instalando painel de gerenciamento de hospedagem VirtualMin.
- Como usar a ferramenta oficial de acesso remoto do Windows no PC e celular
- Como acessar o painel de gerenciamento dos meus Serviços.
Precisa de ajuda com migração para VPS?
A AviraHost oferece VPS Ubuntu 22.04 otimizados para aplicações Node.js com suporte técnico especializado. Nossa equipe pode auxiliar na migração e configuração do ambiente de produção.