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
Arquivos seguem o padrao: chatbot_YYYYMMDD_HHMMSS.sql
Backup Manual
Comando completo
| Bash |
|---|
| 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 |
|---|
| 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. 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. 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 |
|---|
| # 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 |
|---|
| 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 |
|---|
| 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.