Introdução: Da Estação de Trabalho à Nuvem
Levar uma aplicação Node.js para produção é um dos momentos mais críticos no ciclo de vida do desenvolvimento de software. Enquanto o desenvolvimento local oferece conveniência, a produção exige robustez, segurança e escalabilidade. Neste tutorial, vamos guiar você através do processo completo de configuração de um VPS (Virtual Private Server) com Linux para hospedar uma aplicação Node.js integrada ao banco de dados PostgreSQL.
O objetivo não é apenas fazer o código rodar, mas estabelecer uma infraestrutura sólida, preparada para lidar com tráfego real e garantir a persistência dos seus dados. Vamos utilizar um ambiente Ubuntu Server como base, pois é o padrão da indústria para serviços de cloud modernos. Se você estiver utilizando outro sistema Debian-based, os comandos serão praticamente idênticos.
Fase 1: Preparação do Ambiente Cloud
Antes de escrever uma única linha de código ou instalar bibliotecas, precisamos garantir que o servidor esteja seguro e atualizado. A primeira ação após receber as credenciais de acesso do seu provedor de cloud é fazer login via SSH.
ssh root@seu_ip_do_servidor
Uma vez conectado, o primeiro passo lógico é atualizar os pacotes do sistema operacional. Isso garante que você esteja rodando com as versões mais recentes dos kernels e bibliotecas de segurança.
apt update && apt upgrade -y
Agora, vamos criar um usuário não-root para executar suas tarefas diárias. Rodar serviços como root é uma prática de segurança desaconselhada em ambientes de produção. Vamos criar o usuário deploy, adicionar às permissões sudo e gerar chaves SSH para autenticação segura.
adduser deploy
usermod -aG sudo deploy
Navegue até o diretório home do novo usuário e crie a estrutura de chaves SSH:
su - deploy
mkdir ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
Cole sua chave pública local neste arquivo. Salve e saia, depois ajuste as permissões:
chmod 600 ~/.ssh/authorized_keys
Para finalizar esta fase, desativamos o login de root via SSH para forçar o uso da conta privilegiada com autenticação por chave. Edite o arquivo de configuração do SSH:
sudo nano /etc/ssh/sshd_config
Altere as seguintes linhas para garantir que apenas chaves públicas sejam aceitas e que o root não faça login direto:
PermitRootLogin no
PubkeyAuthentication yes
Reinicie o serviço SSH para aplicar as mudanças:
sudo systemctl restart sshd
Fase 2: Instalando o Servidor Node.js e NPM
A instalação do Node.js em servidores Linux geralmente é feita através de repositórios gerenciados por versões específicas (LTS). Isso evita problemas de compatibilidade que podem surgir ao usar a versão mais recente não testada.
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
Com este comando, adicionamos o repositório da versão 20 (atual LTS) e instalamos o Node.js junto com o NPM. Verifique as instalações:
node --version
npm --version
Para gerenciar processos em produção, não podemos confiar apenas no comando node app.js. Se o processo cair ou se houver uma atualização de código, precisamos de um gerenciador de processos. Vamos instalar o PM2, a solução padrão da indústria para manter aplicações Node.js vivas.
sudo npm install -g pm2
O PM2 permite que sua aplicação rode em segundo plano (daemon), reinicie automaticamente após falhas e faça logs centralizados. Vamos configurar o PM2 para iniciar automaticamente quando o servidor bootar:
pm2 startup systemd
sudo env PATH=$PATH:/usr/bin pm2 dump
Fase 3: Configurando o Banco de Dados PostgreSQL
O PostgreSQL é um dos bancos de dados relacionais mais robustos e modernos disponíveis. Sua instalação em Ubuntu é direta, mas requer atenção na configuração de autenticação.
sudo apt install postgresql postgresql-contrib
Inicie o serviço e verifique se está ativo:
sudo systemctl status postgresql
Agora, precisamos criar um usuário e um banco de dados dedicados para sua aplicação. Nunca use o usuário postgres (superusuário) diretamente na sua conexão de produção.
sudo -u postgres psql
Dentro do shell do PostgreSQL, execute os seguintes comandos SQL:
CREATE DATABASE appdb;
CREATE USER appuser WITH PASSWORD 'senha_forte_aqui';
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;
Saia do prompt SQL digitando \q. Agora, precisamos configurar o arquivo de acesso pg_hba.conf para permitir que conexões locais ou remotas (se necessário) sejam autenticadas corretamente. Para uma configuração segura em VPS única, vamos focar na autenticação local e trust/md5.
sudo nano /etc/postgresql/16/main/pg_hba.conf
Verifique se há linhas configurando a autenticação para o usuário appuser. Para produção, recomenda-se usar método md5 ou scram-sha-256, evitando trust.
Fase 4: Configurando o Firewall e Segurança
Nenhum servidor em produção deve ficar exposto sem um firewall ativo. Vamos usar o UFW (Uncomplicated Firewall), que vem pré-instalado na maioria das distribuições Linux.
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Habilite o firewall e verifique o status:
sudo ufw enable
sudo ufw status
Se você estiver rodando o banco de dados na mesma VPS, não é necessário abrir a porta 5432 para o mundo externo. Mantenha-a fechada para IPs externos e permita apenas conexões do loopback ou da sua aplicação local.
Fase 5: Configurando o Nginx como Reverse Proxy
Aplicações Node.js rodam em portas HTTP simples (como 3000 ou 8080). Para produção, usamos o Nginx para atuar como um proxy reverso. Ele lida com as conexões HTTPS, compressão de arquivos estáticos e roteamento de requisições para o seu servidor Node.
sudo apt install nginx
Crie um arquivo de configuração de host virtual:
sudo nano /etc/nginx/sites-available/meu-app
Cole a seguinte configuração básica, ajustando o domínio e a porta do seu app Node.js:
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 o site criando um link simbólico e teste a configuração:
sudo ln -s /etc/nginx/sites-available/meu-app /etc/nginx/sites-enabled/
sudo nginx -t
Se o teste for bem-sucedido, reinicie o Nginx:
sudo systemctl restart nginx
Fase 6: Deploy da Aplicação e Variáveis de Ambiente
Agora que a infraestrutura está pronta, vamos preparar sua aplicação Node.js para subir. Em produção, é crucial separar configurações do código. Utilize variáveis de ambiente para conectar ao banco de dados.
Crie um arquivo .env na raiz do seu projeto local (e depois envie para o servidor via Git ou SCP):
NODE_ENV=production
PORT=3000
DB_HOST=localhost
DB_PORT=5432
DB_USER=appuser
DB_PASSWORD=sua_senha_segura
DB_NAME=appdb
No seu código Node.js, utilize o pacote dotenv para carregar essas variáveis. Instale a dependência:
npm install dotenv pg
Exemplo de conexão segura no index.js:
require('dotenv').config();
const { Pool } = require('pg');
const pool = new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: process.env.DB_PASSWORD,
port: process.env.DB_PORT,
});
// Teste de conexão
pool.query('SELECT NOW()', (err, res) => {
console.log(err ? err.message : 'Conexão estabelecida com sucesso!');
pool.end();
});
Fase 7: Iniciando o Serviço com PM2
Com tudo configurado, é hora de iniciar a aplicação. Primeiro, transfira seus arquivos para o servidor (via Git pull ou SCP). Em seguida, instale as dependências:
cd /caminho/para/seu/projeto
npm install --production
Agora, inicie a aplicação com o PM2. É altamente recomendável nomear o processo para facilitar a identificação no futuro:
pm2 start index.js --name "meu-app-node"
Verifique se o processo está rodando:
pm2 list
Você verá o status online. Se houver erros, consulte os logs detalhados:
pm2 logs meu-app-node
Conclusão e Próximos Passos
Você acabou de configurar um ambiente de produção profissional para sua aplicação Node.js com PostgreSQL. Esta base inclui segurança (firewall, usuário não-root), monitoramento (PM2) e escalabilidade (Nginx proxy).
Para dar o próximo nível, considere implementar certificados SSL gratuitos usando Let's Encrypt para ativar HTTPS, garantindo criptografia ponta a ponta. Além disso, configure backups automáticos do PostgreSQL utilizando scripts cron que realizam dumps da base de dados diariamente.
Lembre-se: monitoramento contínuo é essencial. Utilize as ferramentas de logs do PM2 e monitore o consumo de memória e CPU do seu VPS para garantir que a aplicação permaneça estável sob carga. Com esta configuração, sua aplicação está pronta para receber usuários reais com confiança e performance.