Pular para conteúdo

Backup e restauração do banco de dados

Backup automático do PostgreSQL (braggo_db) na VM servidor (192.168.1.14).

Sem cópia externa por enquanto

O backup fica dentro da própria VM. Se o disco do PC ou a VM se perder, ele vai junto. A cópia externa ainda está pendente.

Visão geral

Item Valor
Banco braggo_db (PostgreSQL local)
Script /usr/local/bin/backup-braggo.sh
Agendamento /etc/cron.d/braggo-backup (todo dia às 03:00)
Destino dos arquivos /var/backups/braggo/ (modo 700, só root)
Nome do arquivo braggo_db_AAAA-MM-DD_HHMM.dump
Retenção 14 dias (arquivos mais antigos são apagados)
Log /var/log/braggo-backup.log
Formato pg_dump -Fc (custom, restaurado com pg_restore)

Como funciona

  1. O cron lê /etc/cron.d/braggo-backup e executa o script às 3h como root.
  2. O script roda pg_dump como usuário postgres, grava em um arquivo .tmp, valida com pg_restore --list e só então renomeia para .dump. Assim nunca sobra um backup pela metade com nome definitivo.
  3. Remove os .dump com mais de 14 dias.
  4. Escreve uma linha de resultado no log.

Formato da linha do cron (/etc/cron.d):

minuto hora dia-do-mês mês dia-da-semana usuário comando
0      3    *          *   *             root    /usr/local/bin/backup-braggo.sh >> /var/log/braggo-backup.log 2>&1

Instalação (uma vez)

sudo mkdir -p /var/backups/braggo && sudo chmod 700 /var/backups/braggo

sudo tee /usr/local/bin/backup-braggo.sh >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
DEST=/var/backups/braggo
KEEP_DAYS=14
FILE="$DEST/braggo_db_$(date +%F_%H%M).dump"

sudo -u postgres pg_dump -Fc braggo_db > "$FILE.tmp"
pg_restore --list "$FILE.tmp" >/dev/null
mv "$FILE.tmp" "$FILE"
find "$DEST" -name 'braggo_db_*.dump' -mtime +$KEEP_DAYS -delete
echo "$(date -Is) ok $FILE ($(du -h "$FILE" | cut -f1))"
EOF

sudo chmod 700 /usr/local/bin/backup-braggo.sh
echo '0 3 * * * root /usr/local/bin/backup-braggo.sh >> /var/log/braggo-backup.log 2>&1' | sudo tee /etc/cron.d/braggo-backup

Verificar que está agendado

systemctl is-active cron              # deve responder: active
ls -l /etc/cron.d/braggo-backup       # dono root, modo -rw-r--r--
sudo tail /var/log/braggo-backup.log  # após a primeira madrugada, mostra linhas "ok"
  • O arquivo em /etc/cron.d precisa ser de root e não pode ser gravável por outros.
  • O nome do arquivo não pode ter ponto (braggo-backup está correto).
  • O cron só executa se a VM estiver ligada às 3h.

Executar um backup manual

sudo /usr/local/bin/backup-braggo.sh
sudo ls -lh /var/backups/braggo

A pasta é 700: sem sudo, o ls dá "Permission denied".

Testar a restauração

Restaura o backup mais recente em um banco temporário, sem tocar no braggo_db. Faça periodicamente.

sudo bash -c '
ARQ=$(ls -t /var/backups/braggo/*.dump | head -1)
echo "Restaurando: $ARQ"
sudo -u postgres createdb braggo_teste
sudo -u postgres pg_restore -d braggo_teste < "$ARQ"
sudo -u postgres psql -d braggo_teste -c "\dt"
sudo -u postgres dropdb braggo_teste
'

Resultado esperado: lista das 14 tabelas (agendamento, barbearia, cliente, plano, usuario etc.). Avisos sobre role does not exist são inofensivos; erros de tabela não.

O glob dentro de sudo bash -c é necessário porque a pasta é 700 e o shell comum não consegue expandir *.dump.

Recuperação real (desastre)

  1. Parar a API: sudo systemctl stop braggo-api.
  2. Recriar o banco vazio se necessário: sudo -u postgres createdb braggo_db (ou dropdb e createdb para substituir o atual).
  3. Restaurar: sudo bash -c 'sudo -u postgres pg_restore -d braggo_db < /var/backups/braggo/ARQUIVO.dump'.
  4. Subir a API: sudo systemctl start braggo-api e conferir journalctl -u braggo-api.

Antes de fazer isso em produção, tire um snapshot da VM.

O que o backup não cobre

  • /etc/braggo-api.env (Jwt__Key, Setup__Secret, Resend__ApiKey, etc.): guardar cópia em gerenciador de senhas.
  • /opt/braggo/api/appsettings.Production.json e o build da API/Angular.
  • Configuração do Nginx e do cloudflared.

Pendente

  • Cópia externa (rclone para Google Drive/Backblaze B2, ou rsync para outro PC).
  • Revisar a retenção quando o banco crescer.