postgresqlbanco de dadosvpsdockerbackuptutorial

Como instalar o PostgreSQL numa VPS com Docker e backup automático (passo a passo)

Seu próprio banco Postgres rodando com segurança, sem porta aberta para a internet e com backup diário que se apaga sozinho depois de 7 dias.

Por NullNinja7 min de leitura
Como instalar o PostgreSQL numa VPS com Docker e backup automático (passo a passo)

Banco de dados é a parte que não pode dar errado

Site fora do ar volta com um restart. Banco perdido não volta. Por isso, ao subir um PostgreSQL na sua VPS, três coisas importam mais do que qualquer ajuste de desempenho:

  • não deixar a porta do banco aberta para a internet, porque robôs varrem a porta 5432 o tempo todo;
  • ter backup automático, todos os dias, sem depender de alguém lembrar;
  • saber restaurar, porque backup que nunca foi testado não é backup.

Este passo a passo cobre as três.

O que você vai precisar

  • Uma VPS Linux (Ubuntu ou Debian) com 2 GB de RAM ou mais.
  • Acesso root por SSH.

1. Instale o Docker

ssh root@IP_DA_VPS
curl -fsSL https://get.docker.com | sh

2. Crie o projeto

mkdir -p /opt/postgres && cd /opt/postgres

Gere uma senha forte e guarde num arquivo .env, que só o root pode ler:

echo "POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=')" > .env
chmod 600 .env

Crie o docker-compose.yml:

services:
  postgres:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: app
      POSTGRES_DB: app
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "127.0.0.1:5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data

volumes:
  pg_data:

Repare no 127.0.0.1:5432:5432: o banco só aceita conexão de dentro da própria VPS. Para a internet, a porta 5432 continua fechada.

3. Suba o banco

docker compose up -d
docker compose exec postgres psql -U app -c "select version();"

Se aparecer a versão do PostgreSQL, está no ar.

4. Conecte do seu computador sem abrir a porta

Para usar DBeaver, pgAdmin ou o psql do seu computador, crie um túnel SSH:

ssh -N -L 5433:127.0.0.1:5432 root@IP_DA_VPS

Deixe esse terminal aberto e conecte no seu programa em localhost, porta 5433, usuário app, banco app e a senha do .env. O tráfego vai criptografado pelo SSH, e a porta do banco nunca fica exposta.

Se a sua aplicação roda na mesma VPS, ela conecta direto em 127.0.0.1:5432. Se roda em Docker no mesmo docker-compose.yml, use o nome do serviço: postgres:5432.

5. Backup diário automático

Crie o script /opt/postgres/backup.sh:

#!/bin/bash
set -euo pipefail
DESTINO=/opt/postgres/backups
mkdir -p "$DESTINO"
ARQUIVO="$DESTINO/app-$(date +%F-%H%M).sql.gz"
docker compose -f /opt/postgres/docker-compose.yml exec -T postgres \
  pg_dump -U app app | gzip > "$ARQUIVO"
find "$DESTINO" -name 'app-*.sql.gz' -mtime +7 -delete
echo "backup ok: $ARQUIVO"

Dê permissão e rode uma vez para testar:

chmod +x /opt/postgres/backup.sh
/opt/postgres/backup.sh
ls -lh /opt/postgres/backups

Agora agende todos os dias às 3h da manhã:

(crontab -l 2>/dev/null; echo "0 3 * * * /opt/postgres/backup.sh >> /var/log/backup-postgres.log 2>&1") | crontab -

O script guarda os últimos 7 dias e apaga os mais antigos sozinho.

⚠️ Backup que fica só na mesma VPS não protege de tudo: se o servidor tiver um problema sério, vai junto. Copie os arquivos para outro lugar de tempos em tempos, como outro servidor ou um storage de objetos.

6. Como restaurar (teste antes de precisar)

Para restaurar um backup num banco novo, sem mexer no original:

cd /opt/postgres
docker compose exec postgres createdb -U app app_restaurado
gunzip -c backups/app-AAAA-MM-DD-HHMM.sql.gz | \
  docker compose exec -T postgres psql -U app app_restaurado

Confira se as tabelas voltaram com \dt dentro do psql. Faça esse teste uma vez por mês: é o único jeito de ter certeza de que o backup funciona.

Problemas comuns

"connection refused" ao conectar do meu computador. É o esperado sem o túnel: a porta não está aberta para a internet. Use o túnel SSH do passo 4.

"password authentication failed". A senha do .env só vale na primeira vez que o volume é criado. Se você trocou a senha depois, troque também dentro do banco com ALTER USER app WITH PASSWORD '...';.

O backup ficou com 20 bytes. O pg_dump falhou. Rode o backup.sh à mão e leia o erro. Geralmente o container estava parado ou o nome do banco está errado.

Onde rodar

Na NullNinja, o VPS Start custa R$ 54,98/mês, com 1 vCPU, 2 GB de RAM, 20 GB NVMe, acesso root e IP fixo incluso, em datacenter em São Paulo. É mensal, sem fidelidade e com reembolso integral em até 7 dias.

👉 Ver planos de VPS

Prefere não cuidar de servidor? O Banco Postgres gerenciado da NullNinja tem plano grátis (1 banco, 256 MB) e planos pagos a partir de R$ 14,90/mês.

👉 Ver o Banco de Dados

Travou em algum passo? Chama no WhatsApp: (65) 99233-0983.