Node.js com PostgreSQL: Setup Completo na Nuvem

9 min de leitura Infraestrutura

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.

Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000
WhatsApp