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
- Onde posso hospedar um banco de dados?
- O que preciso decidir antes de criar o banco?
- Como é uma string de conexão?
- Como guardar a string de conexão com segurança?
- Como conectar uma aplicação Node.js?
- Como verificar que a conexão funcionou?
- Quais erros aparecem com mais frequência?
- Como fazer isso na Square Cloud
- Perguntas frequentes
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.
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:
- Motor: relacional (PostgreSQL, MySQL), documentos (MongoDB) ou chave-valor em memória (Redis).
- Memória: o Redis guarda o conjunto de dados na RAM. Os demais usam RAM como cache e disco para o resto.
- Espaço em disco: tamanho atual dos dados mais a folga de crescimento.
- Localização: o mais perto possível da aplicação, porque cada consulta paga a latência da rede.
- 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:
postgresql://usuario:senha@host:5432/nome_do_banco?sslmode=requireCada 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):
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):
npm install pgOs 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:
import pg from "pg";
const { Pool } = pg;
export const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});E um script de teste, testar.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:
- Consulta mínima:
SELECT NOW(), como no script acima. Se voltou resultado, rede, credenciais e TLS estão certos. - 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. - 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
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.
Mais em Bancos de dados
Ver todos os 24 artigos- Quanto custa um banco de dados na nuvem?Um banco de dados na nuvem custa de zero a centenas de dólares por mês. Veja o que define o preço: instância, disco, tráfego, snapshots e como estimar o seu.
- O que é Redis e para que serveRedis é um banco de dados em memória que guarda pares chave-valor e estruturas de dados. Veja como funciona, para que serve e quando não usar.
- Como fazer backup do banco de dados (MySQL, PostgreSQL, MongoDB)Faça backup de MySQL, PostgreSQL e MongoDB com mysqldump, pg_dump e mongodump, e restaure o dump. Veja os comandos, como verificar e os erros comuns.
- O que é PostgreSQL e para que servePostgreSQL é um banco de dados relacional open source que usa SQL e garante transações ACID. Veja como funciona, para que serve e quando escolher outro banco.