Deploy Node.js + PostgreSQL em VPS: Guia Completo

9 min de leitura Infraestrutura
Deploy Node.js + PostgreSQL em VPS: Guia Completo

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.

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