Pular para conteúdo

Backup e Restauracao do Banco

Politica de Backup

Atualmente, nao ha rotina automatica de backup do banco em producao. Backups sao manuais, executados antes de alteracoes estruturais (migrations grandes, refactors, limpezas).

Recomendacao: configurar cron job no host para backup diario em /home/ubuntu/backups/ + rotacao (manter ultimos 7 dias).

Localizacao dos Backups

Text Only
/home/ubuntu/backups/

Arquivos seguem o padrao: chatbot_YYYYMMDD_HHMMSS.sql

Backup Manual

Comando completo

Bash
1
2
3
4
5
6
7
mkdir -p /home/ubuntu/backups

BACKUP_FILE="/home/ubuntu/backups/chatbot_$(date +%Y%m%d_%H%M%S).sql"

docker compose exec -T db pg_dump -U chatbot chatbot > "$BACKUP_FILE"

ls -lah "$BACKUP_FILE"

Backup compactado (recomendado para arquivos maiores)

Bash
docker compose exec -T db pg_dump -U chatbot chatbot | gzip > "$BACKUP_FILE.gz"

Apenas estrutura (schema), sem dados

Bash
docker compose exec -T db pg_dump -U chatbot --schema-only chatbot > schema.sql

Apenas dados de tabelas especificas

Bash
1
2
3
4
5
6
7
docker compose exec -T db pg_dump -U chatbot \
  --data-only \
  -t contacts_contact \
  -t surveys_survey \
  -t surveys_surveyquestion \
  -t surveys_questioncondition \
  chatbot > dados_essenciais.sql

Restauracao

⚠️ CUIDADO: restauracao SOBRESCREVE dados existentes. Sempre faca backup do estado atual antes de restaurar um backup antigo.

Restauracao completa

Bash
1
2
3
4
5
6
# 1. Pega backup do estado atual (rollback safety net)
docker compose exec -T db pg_dump -U chatbot chatbot \
  > /home/ubuntu/backups/before_restore_$(date +%Y%m%d_%H%M%S).sql

# 2. Restaurar
docker compose exec -T db psql -U chatbot chatbot < /caminho/para/backup.sql

Restaurar em banco vazio

Bash
1
2
3
4
5
6
# 1. Drop e recria o banco (cuidado!)
docker compose exec -T db psql -U chatbot postgres -c "DROP DATABASE chatbot;"
docker compose exec -T db psql -U chatbot postgres -c "CREATE DATABASE chatbot;"

# 2. Restaura o backup
docker compose exec -T db psql -U chatbot chatbot < /caminho/para/backup.sql

Restauracao seletiva (apenas tabelas)

Bash
1
2
3
4
# Extrai apenas a tabela contacts_contact do backup
grep -E "(CREATE TABLE public.contacts_contact|COPY public.contacts_contact)" backup.sql > restore_contacts.sql

docker compose exec -T db psql -U chatbot chatbot < restore_contacts.sql

Validacao Pos-Restauracao

Bash
1
2
3
4
5
6
7
docker compose exec backend python manage.py shell -c "
from django.apps import apps
for model in apps.get_models():
    count = model.objects.count()
    if count > 0:
        print(f'{model._meta.app_label}.{model._meta.model_name}: {count}')
"

Espera-se ver pelo menos: - contacts.contact - surveys.survey - surveys.surveyquestion - auth.user (>=1)


Backup Recente

Data Arquivo Tamanho Contexto
2026-06-02 15:24 chatbot_20260602_152458.sql 255KB Antes de implementar sistema de expiracao

Configuracao de Backup Automatico (Sugerido)

Adicionar ao crontab do usuario root ou criar systemd timer:

Bash
# /etc/cron.d/chatbot-backup
0 3 * * * root /usr/local/bin/chatbot-backup.sh
Bash
#!/bin/bash
# /usr/local/bin/chatbot-backup.sh
set -e

BACKUP_DIR=/home/ubuntu/backups
RETENTION_DAYS=7
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

cd /home/ubuntu/projetos/chat_bot_evolution_drf

# Backup compactado
docker compose exec -T db pg_dump -U chatbot chatbot | gzip > \
  "$BACKUP_DIR/chatbot_$TIMESTAMP.sql.gz"

# Rotacao: remove backups com mais de RETENTION_DAYS dias
find "$BACKUP_DIR" -name "chatbot_*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "Backup concluido: chatbot_$TIMESTAMP.sql.gz"

Tornar executavel:

Bash
chmod +x /usr/local/bin/chatbot-backup.sh


Cenarios Especificos

Limpar mensagens antigas (preservando contatos/pesquisas)

Bash
docker compose exec backend python manage.py shell -c "
from whatsapp.models import MessageLog
from responses.models import SurveyRun, SurveyAnswer

# Limpa SurveyAnswer primeiro (FK para SurveyRun)
SurveyAnswer.objects.all().delete()
SurveyRun.objects.all().delete()  # MessageLog.run vira NULL (SET_NULL)
MessageLog.objects.all().delete()

# Preservados: contacts, surveys (questions, conditions)
"

Resetar contadores de auto-increment (apos limpeza)

Bash
1
2
3
4
5
docker compose exec -T db psql -U chatbot chatbot << 'EOF'
ALTER SEQUENCE whatsapp_messagelog_id_seq RESTART WITH 1;
ALTER SEQUENCE responses_surveyrun_id_seq RESTART WITH 1;
ALTER SEQUENCE responses_surveyanswer_id_seq RESTART WITH 1;
EOF

⚠️ Cuidado: nao resetar IDs se houver FKs externas ou exports/relatorios ja referenciando esses IDs.


Acesso Direto ao Banco

Console PostgreSQL

Bash
docker compose exec db psql -U chatbot chatbot

Comandos uteis: - \dt - lista tabelas - \d <tabela> - schema da tabela - \du - lista usuarios - \l - lista bancos - \q - sair

Via porta externa (5433)

Bash
psql -h localhost -p 5433 -U chatbot chatbot
# Senha em backend/.env: POSTGRES_PASSWORD

Util para conectar com DBeaver, TablePlus, pgAdmin, etc.