Introdução: Por que mover seu Node.js para uma VPS?
Migrar um aplicativo Node.js do ambiente de desenvolvimento local para um servidor na nuvem é um passo fundamental para qualquer profissional de TI ou desenvolvedor backend. Embora o npm start funcione perfeitamente no laptop, a produção exige robustez, segurança e disponibilidade 24/7. Neste tutorial, vamos configurar uma infraestrutura completa utilizando uma VPS (Virtual Private Server) com Linux Ubuntu, banco de dados PostgreSQL otimizado e um gerenciador de processos PM2 para garantir que sua aplicação Node.js permaneça online mesmo após reinicializações ou crashes.
A configuração correta não apenas garante a estabilidade da aplicação, mas também protege seus dados sensíveis e facilita o escalonamento futuro. Vamos cobrir desde a criação do servidor até o deploy final com SSL e firewall configurado.
Etapa 1: Preparação do Ambiente na Nuvem
O primeiro passo é garantir que você tenha acesso root ou sudo ao seu servidor Linux. A maioria das distribuições populares, como Ubuntu 22.04 LTS ou Debian 11, são ideais para este setup. Conecte-se ao seu servidor via SSH:
ssh root@seu_ip_servidor
Antes de instalar qualquer ferramenta, atualize o índice dos pacotes do sistema operacional para garantir que estamos baixando as versões mais recentes e seguras:
apt update && apt upgrade -y
Este comando pode levar alguns minutos dependendo da largura de banda do seu servidor cloud. É uma prática essencial de segurança manter o sistema base atualizado.
Etapa 2: Instalação e Configuração do Node.js
A instalação do Node.js pode ser feita de várias formas, mas a maneira mais controlada para ambientes de produção é utilizando o nvm (Node Version Manager) ou instalando via repositório oficial. Para este tutorial, utilizaremos o método direto via repositório LTS (Long Term Support), que oferece estabilidade máxima.
Primeiro, instale as dependências necessárias para baixar certificados e pacotes:
apt install curl gnupg -y
Agora, importe a chave GPG do repositório NodeSource e adicione o repositório LTS:
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
Com o repositório adicionado, instale o Node.js:
apt install nodejs -y
Verifique as versões instaladas para confirmar a operação:
node --version
npm --version
Você deve ver a versão v20.x.x (ou superior, dependendo do lançamento atual) e uma versão npm compatível. Com isso, seu ambiente de execução está pronto.
Etapa 3: Configuração do Banco de Dados PostgreSQL
O PostgreSQL é amplamente considerado o banco de dados relacional mais avançado do mercado, oferecendo conformidade ACID e extensibilidade. Vamos instalá-lo diretamente no mesmo servidor ou em um servidor dedicado (recomendado para alta carga).
apt install postgresql postgresql-contrib -y
O serviço PostgreSQL deve estar rodando automaticamente após a instalação. Verifique o status:
systemctl status postgresql
Agora, precisamos criar um usuário e um banco de dados específicos para sua aplicação Node.js. Nunca use o usuário padrão 'postgres' em produção.
Acesse o shell do PostgreSQL:
sudo -u postgres psql
Dentro do console SQL, execute os seguintes comand para criar o banco e o usuário:
CREATE DATABASE minha_app_db;
CREATE USER admin_app WITH ENCRYPTED PASSWORD 'senha_forte_aqui';
GRANT ALL PRIVILEGES ON DATABASE minha_app_db TO admin_app;
Saia do console com \q. Em seguida, precisamos configurar o arquivo pg_hba.conf para permitir conexões locais (se a app e db estiverem na mesma VPS) ou restringir acesso externo. Para uma instalação padrão em localhost, a configuração padrão geralmente permite conexões Unix Socket, o que é seguro.
Etapa 4: Preparação do Projeto Node.js
Agora que a infraestrutura está pronta, vamos preparar o código. Em seu ambiente local, certifique-se de ter um projeto básico com Express e uma conexão PG configurada. Instale as dependências necessárias:
npm install express pg dotenv
Crie um arquivo .env na raiz do projeto para armazenar variáveis sensíveis:
PORT=3000
DB_HOST=localhost
DB_PORT=5432
DB_USER=admin_app
DB_PASS=senha_forte_aqui
DB_NAME=minha_app_db
No seu arquivo principal (ex: app.js ou server.js), configure a conexão com o banco usando o driver nativo do PostgreSQL:
const express = require('express');
const { Pool } = require('pg');
require('dotenv').config();
const app = express();
const pool = new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: process.env.DB_PASS,
port: process.env.DB_PORT,
});
app.get('/', async (req, res) => {
try {
const result = await pool.query('SELECT NOW()');
res.json({ message: 'Conexão com PostgreSQL estabelecida!', time: result.rows[0].now });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Erro na conexão' });
}
});
app.listen(process.env.PORT, () => {
console.log(`Servidor rodando na porta ${process.env.PORT}`);
});
Teste localmente com node app.js. Se a resposta for bem-sucedida, estamos prontos para o deploy.
Etapa 5: Transferência de Arquivos para a VPS
Existem várias formas de transferir os arquivos, mas o método mais eficiente para projetos Git-based é clonar o repositório diretamente no servidor. Certifique-se de que o git está instalado na VPS:
apt install git -y
Crie um diretório dedicado para sua aplicação e clone o projeto:
mkdir -p /var/www/minha-app
cd /var/www/minha-app
git clone https://seu-repositorio.com/minha-app.git .
Instale as dependências do Node.js no servidor. Importante: use o comando npm ci em vez de npm install. O npm ci ignora o package-lock.json e instala exatamente as versões definidas, garantindo consistência entre desenvolvimento e produção.
npm ci --production
O flag --production garante que dependências de desenvolvimento (como testes ou ferramentas de build) não sejam instaladas, economizando espaço e tempo.
Etapa 6: Gerenciamento de Processos com PM2
Executar o Node.js diretamente via terminal é perigoso para produção. Se você fechar o terminal ou ocorrer um erro crítico, a aplicação cairá. Para resolver isso, utilizaremos o PM2, um gerenciador de processos robusto.
npm install -g pm2
Inicie sua aplicação com o PM2:
pm2 start app.js --name "node-app-prod"
O PM2 agora gerencia o processo. Se a aplicação crashar, ele reinicia automaticamente. Verifique o status:
pm2 list
Para garantir que o PM2 inicie junto com o servidor Linux após uma reinicialção, configure o startup script:
pm2 startup systemd
pm2 save
O comando pm2 startup gera um script específico para sua distribuição (Systemd no caso do Ubuntu). Copie e execute o comando gerado pelo terminal. O pm2 save salva o estado atual dos processos.
Etapa 7: Configuração de Firewall e Segurança
A segurança é primordial em qualquer configuração de servidor cloud. Vamos usar o UFW (Uncomplicated Firewall) para liberar apenas as portas necessárias.
apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
Liberamos a porta 22 (SSH) para que não nos bloqueemos:
ufw allow ssh
E a porta da sua aplicação. Se você estiver usando PM2 com uma porta específica (ex: 3000), libere-a. No entanto, o ideal é usar um proxy reverso (Nginx) na porta 80/443 e encaminhar para a porta interna do Node.js.
ufw allow 3000/tcp
ufw enable
Confirme a ativação digitando y. Verifique o status com ufw status.
Etapa 8: Configuração do Nginx como Proxy Reverso
Embora possamos acessar a app via http://seu_ip:3000, isso não é elegante nem seguro para expor diretamente. O Nginx atuará como uma fachada, recebendo requisições na porta 80 (HTTP) e encaminhando para o Node.js.
apt install nginx -y
Crie um novo arquivo de configuração no diretório sites-available:
nano /etc/nginx/sites-available/node-app
Insira a seguinte configuração, substituindo seu_dominio.com pelo seu domínio real:
server {
listen 80;
server_name seu_dominio.com www.seu_dominio.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_cache_bypass $http_upgrade;
}
}
Ative a configuração criando um link simbólico para sites-enabled:
ln -s /etc/nginx/sites-available/node-app /etc/nginx/sites-enabled/
Teste a configuração do Nginx antes de aplicar:
nginx -t
Se o teste for bem-sucedido, recarregue o serviço:
systemctl reload nginx
Etapa 9: Habilitação de SSL com Let's Encrypt
Para garantir criptografia e confiança, instale o Certbot para obter certificados SSL gratuitos:
apt install certbot python3-certbot-nginx -y
Execute o Certbot, selecionando a opção correspondente ao seu domínio:
certbot --nginx -d seu_dominio.com -d www.seu_dominio.com
O assistente configurará automaticamente o redirecionamento HTTP para HTTPS e renovará os certificados. Sua aplicação agora está acessível via https://seu_dominio.com.
Conclusão: Monitoramento e Manutenção
Você concluiu o setup completo de uma aplicação Node.js com PostgreSQL em um servidor Linux VPS. Para manter a saúde do sistema, acostume-se a usar comandos como:
pm2 logs node-app-prod: Para visualizar erros em tempo real.systemctl status postgresql: Para checar o banco de dados.df -h: Para monitorar o uso de disco.
Lembre-se de fazer backups regulares do banco de dados PostgreSQL e de manter seu servidor atualizado. Esta configuração serve como base sólida para escalar seus serviços na cloud, oferecendo performance e segurança profissionais.