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¶
- O cron lê
/etc/cron.d/braggo-backupe executa o script às 3h como root. - O script roda
pg_dumpcomo usuáriopostgres, grava em um arquivo.tmp, valida compg_restore --liste só então renomeia para.dump. Assim nunca sobra um backup pela metade com nome definitivo. - Remove os
.dumpcom mais de 14 dias. - 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.dprecisa ser de root e não pode ser gravável por outros. - O nome do arquivo não pode ter ponto (
braggo-backupestá 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)¶
- Parar a API:
sudo systemctl stop braggo-api. - Recriar o banco vazio se necessário:
sudo -u postgres createdb braggo_db(oudropdbecreatedbpara substituir o atual). - Restaurar:
sudo bash -c 'sudo -u postgres pg_restore -d braggo_db < /var/backups/braggo/ARQUIVO.dump'. - Subir a API:
sudo systemctl start braggo-apie conferirjournalctl -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.jsone 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.