Como hospedar um banco de dados (e conectar sua aplicação)

Hospedar um banco é criar uma instância do motor escolhido e apontar sua aplicação para ela por uma string de conexão. Guarde essa string em variável de ambiente e teste com uma consulta simples.

Atualizado em 6 min de leitura

Objetivos de aprendizado

Depois de ler este artigo, você vai conseguir:

  • Escolher onde o banco roda: na sua máquina, num servidor próprio ou num serviço de hospedagem
  • Montar a string de conexão e guardá-la em variável de ambiente
  • Conectar uma aplicação Node.js e confirmar que a conexão funciona
Nesta página

Hospedar um banco de dados significa manter um servidor de banco (PostgreSQL, MySQL, MongoDB ou Redis) ligado o tempo todo, com disco, rede e credenciais, e fazer a sua aplicação falar com ele. Instalar o motor raramente é a parte difícil. O trabalho está em decidir onde ele roda, quem pode se conectar e como a aplicação recebe a senha sem que ela vá parar no repositório.

Os passos abaixo vão da escolha do lugar até a verificação da conexão. Os exemplos usam PostgreSQL e Node.js, mas a lógica vale para os outros motores.

DATABASE_URLvariável de ambientepostgresql://user:***@host/db?sslmode=require1lê a variávelAplicaçãoServidordo banco2conexão TLS3SELECT NOW()hora do servidor
A aplicação lê a string de DATABASE_URL, conecta com TLS e valida a conexão com SELECT NOW().

Onde posso hospedar um banco de dados?#

Há três caminhos comuns:

  • Na sua máquina: ótimo para desenvolver. Para produção não serve, porque o banco sai do ar quando o computador desliga e ninguém de fora consegue alcançá-lo.
  • Num servidor que você administra (VPS): você instala o motor e cuida de firewall, atualizações, disco e rotina de cópias. Você ganha controle total e também todo o trabalho.
  • Num serviço de hospedagem de banco: o provedor sobe a instância e entrega o endereço e as credenciais. Você cuida do esquema e dos dados, não do sistema operacional.

Se ainda não escolheu o motor, leia antes Qual banco de dados escolher. Para o impacto no orçamento, veja Quanto custa um banco de dados na nuvem.

O que preciso decidir antes de criar o banco?#

Cinco decisões definem o tamanho e o custo:

  1. Motor: relacional (PostgreSQL, MySQL), documentos (MongoDB) ou chave-valor em memória (Redis).
  2. Memória: o Redis guarda o conjunto de dados na RAM. Os demais usam RAM como cache e disco para o resto.
  3. Espaço em disco: tamanho atual dos dados mais a folga de crescimento.
  4. Localização: o mais perto possível da aplicação, porque cada consulta paga a latência da rede.
  5. Cópias: com que frequência você vai fazer cópias e como vai testar a restauração. Detalhes em Como fazer backup do banco de dados.

Como é uma string de conexão?#

Para PostgreSQL, a documentação do libpq define o formato de URI:

text
postgresql://usuario:senha@host:5432/nome_do_banco?sslmode=require

Cada parte tem um papel: o esquema (postgresql:// ou postgres://), usuario:senha, o host, a porta (5432 é o padrão usual do PostgreSQL), o nome do banco e parâmetros depois de ?. O sslmode=require obriga a conexão a usar TLS, mas sem um certificado raiz configurado o cliente não verifica a identidade do servidor (isso exige verify-ca ou verify-full).

Cuidado com caracteres especiais. Segundo a documentação, símbolos com significado próprio na URI precisam de percent-encoding. Uma senha p@ss precisa virar p%40ss. Se a conexão falha com erro de autenticação e a senha parece certa, comece por aí. No Node.js, encodeURIComponent("p@ss") faz a conversão.

MySQL (mysql://), MongoDB (mongodb:// ou mongodb+srv://) e Redis (redis://) seguem a mesma ideia: uma URL com usuário, senha, host e porta.

Como guardar a string de conexão com segurança?#

Nunca escreva a senha no código. Coloque a string numa variável de ambiente, por exemplo DATABASE_URL, e leia-a em tempo de execução.

No arquivo .env (nunca faça commit dele):

bash
DATABASE_URL="postgresql://usuario:senha@host:5432/nome_do_banco?sslmode=require"

Adicione .env ao .gitignore. Em produção, defina a variável no painel da hospedagem em vez de enviar o arquivo. O conceito está em O que são variáveis de ambiente.

Como conectar uma aplicação Node.js?#

Instale o cliente pg (node-postgres):

bash
npm install pg

Os exemplos usam ES modules (import), então o package.json precisa ter "type": "module". Crie o db.js. O Pool reaproveita conexões em vez de abrir uma por consulta e aceita a string de conexão direto:

js
import pg from "pg";

const { Pool } = pg;

export const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});

E um script de teste, testar.js:

js
import { pool } from "./db.js";

const { rows } = await pool.query("SELECT NOW() AS agora");
console.log("Conectado. Hora do servidor:", rows[0].agora);
await pool.end();

Rode com node --env-file=.env testar.js (a flag exige uma versão recente do Node.js). O pg também lê PGHOST, PGUSER, PGPASSWORD, PGPORT e PGDATABASE quando você cria o Pool sem argumentos, as mesmas variáveis do psql.

Um cuidado com o TLS: por padrão, o pg não segue a regra do libpq descrita acima. Com sslmode=require ele verifica o certificado do servidor, e um certificado que o Node.js não reconhece (autoassinado, por exemplo) gera erro. Se o provedor fornece o certificado da CA, aponte-o com sslrootcert; para a semântica do libpq, acrescente uselibpqcompat=true à string.

Crie uma única instância do Pool e importe essa instância nos outros arquivos. Abrir um Pool por requisição esgota as conexões do banco rapidamente.

Como verificar que a conexão funcionou?#

Três testes, do mais simples ao mais completo:

  1. Consulta mínima: SELECT NOW(), como no script acima. Se voltou resultado, rede, credenciais e TLS estão certos.
  2. Cliente de linha de comando: psql "$DATABASE_URL" mostra se o banco responde fora da sua aplicação, o que separa problema de rede de problema de código.
  3. Escrita e leitura: crie uma tabela de teste, insira uma linha, leia e apague. Isso confirma que o usuário tem permissão de escrita, não só de leitura.

Quais erros aparecem com mais frequência?#

Sintoma Causa provável
ECONNREFUSED Host ou porta errados, ou o banco não aceita conexões desse endereço
password authentication failed Senha errada ou caractere especial sem percent-encoding
ENOTFOUND Erro de digitação no host
Conexão que fica pendurada Firewall ou lista de acesso bloqueando a sua origem
Erro de TLS ou certificado Servidor exige TLS e a string não pede, ou o contrário, ou o cliente não reconhece o certificado do servidor
sorry, too many clients already Muitos Pool abertos ou conexões vazando

Em quase todos os casos, a causa está na string, no firewall ou no uso das conexões. Leia a mensagem completa antes de mudar qualquer coisa.

Como fazer isso na Square Cloud#

Na Square Cloud, o banco segue o terceiro caminho da lista: você cria a instância e cuida do esquema e dos dados. A hospedagem de MongoDB, PostgreSQL, MySQL e Redis começa no plano Standard (o Hobby não inclui bancos). Das decisões acima, motor e memória são campos do painel: o motor vem sempre numa versão recente, e a memória começa em 512 MB no Redis e 1024 MB nos outros. A localização já vem resolvida, porque o banco é provisionado em segundos no mesmo datacenter das aplicações, com cerca de 1 ms de latência média.

O painel entrega a URL de conexão completa (mostrada uma vez na criação; redefinir a senha mostra de novo) e os certificados para baixar. O TLS é obrigatório: o cliente confia na CA baixada e, no PostgreSQL e no MongoDB, também apresenta o certificado .pem. No pg, esses arquivos entram na opção ssl do Pool (ca, cert e key); nesse caso, tire o sslmode da URL, porque os parâmetros da string substituem essa opção. A URL vira variável de ambiente da aplicação, pelo painel, API, CLI ou extensão do VS Code, e a mudança vale no próximo restart, sem rebuild. Como o banco aceita conexões de fora, os três testes da seção anterior rodam também da sua máquina ou do CI, com os mesmos certificados.

Para a decisão sobre cópias, você tira snapshots manuais quando quiser, e todo plano com bancos faz também um snapshot automático diário, guardado por 7 dias. O snapshot restaura no mesmo banco, em outro do mesmo motor ou num banco novo. O PostgreSQL é o nativo, sem extensões, e o Redis tem persistência.

Comece pela hospedagem de PostgreSQL, o motor dos exemplos, ou veja os bancos disponíveis hoje em Bancos de dados.

Hospedagem de bancos

MongoDB, PostgreSQL, MySQL e Redis no mesmo datacenter do app

Saiba mais

Perguntas frequentes

Posso hospedar o banco no mesmo lugar da minha aplicação?

Pode, e costuma ser o melhor arranjo: aplicação e banco no mesmo datacenter reduzem a latência de cada consulta. O importante é que o banco aceite conexões só de quem precisa delas.

O que é uma string de conexão?

É um texto, como postgresql://usuario:senha@host:5432/banco, que reúne usuário, senha, endereço, porta e nome do banco. A maioria das bibliotecas aceita esse formato direto.

Minha senha tem caracteres especiais e a conexão falha. Por quê?

Na URI, símbolos como @, / e : têm significado próprio e precisam de percent-encoding. Uma senha p@ss vira p%40ss dentro da string de conexão.

Preciso abrir o banco para a internet inteira?

Não. Libere só o necessário, exija TLS e use usuário e senha fortes. Banco exposto sem restrição é um alvo frequente de varreduras automáticas.

Próximo passo · Passo 4 de 5Checklist para colocar uma API em produçãoChecklist para colocar uma API em produção: variáveis de ambiente, health check, shutdown limpo, erros padronizados, autenticação, rate limit, CORS e logs.

Mais em Bancos de dados

Ver todos os 24 artigos