Recuperação de Desastres
Este documento descreve os procedimentos para recuperação do sistema em caso de falhas críticas.
Plano de Recuperação
Classificação de Incidentes
| Severidade | Descrição | Tempo de Resposta | Exemplo |
|---|---|---|---|
| Crítica | Sistema completamente indisponível | < 15 min | Banco de dados corrompido |
| Alta | Funcionalidade principal afetada | < 1 hora | API principal fora do ar |
| Média | Funcionalidade secundária afetada | < 4 horas | Worker Celery parado |
| Baixa | Impacto mínimo para usuários | < 24 horas | Logs não sendo coletados |
Contatos de Emergência
- Equipe de Infraestrutura: infra@portal-talentos.gov.br
- DBA: dba@portal-talentos.gov.br
- Desenvolvimento: dev@portal-talentos.gov.br
Procedimentos de Recuperação
Falha Total do Sistema
Cenário: Todos os serviços estão indisponíveis.
Procedimento:
- Verificar infraestrutura base:
docker info
systemctl status docker
- Reiniciar todos os serviços:
docker-compose -f docker-compose.dev.yml down
docker-compose -f docker-compose.dev.yml up -d
- Verificar status:
docker-compose -f docker-compose.dev.yml ps
docker-compose -f docker-compose.dev.yml logs --tail=50
- Testar endpoints principais:
curl http://localhost:8080/api/v1/health/
Corrupção de Banco de Dados
Cenário: Dados corrompidos ou banco inacessível.
Procedimento:
- Parar serviços que acessam o banco:
docker-compose -f docker-compose.dev.yml stop backend worker beat
- Verificar integridade do PostgreSQL:
docker-compose -f docker-compose.dev.yml exec postgres pg_isready
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -c "SELECT 1"
- Tentar reparar:
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -d portal_talentos -c "VACUUM FULL;"
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -d portal_talentos -c "REINDEX DATABASE portal_talentos;"
- Se não funcionar, restaurar backup:
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -c "DROP DATABASE IF EXISTS portal_talentos;"
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -c "CREATE DATABASE portal_talentos;"
gunzip -c backup_latest.sql.gz | docker-compose -f docker-compose.dev.yml exec -T postgres psql -U postgres -d portal_talentos
- Reiniciar serviços:
docker-compose -f docker-compose.dev.yml start backend worker beat
- Validar dados:
docker-compose -f docker-compose.dev.yml exec backend python manage.py check
docker-compose -f docker-compose.dev.yml exec backend python manage.py migrate --check
Perda de Dados do Redis
Cenário: Cache e filas perdidos.
Procedimento:
- Reiniciar Redis:
docker-compose -f docker-compose.dev.yml restart redis
- Limpar filas corrompidas:
docker-compose -f docker-compose.dev.yml exec redis redis-cli FLUSHALL
- Reiniciar workers:
docker-compose -f docker-compose.dev.yml restart worker beat
- Reprocessar tarefas críticas se necessário:
docker-compose -f docker-compose.dev.yml exec backend python manage.py reprocess_pending_tasks
Falha de Worker Celery
Cenário: Tasks não estão sendo processadas.
Procedimento:
- Verificar status do worker:
docker-compose -f docker-compose.dev.yml logs worker --tail=100
docker-compose -f docker-compose.dev.yml exec backend celery -A app status
- Reiniciar worker:
docker-compose -f docker-compose.dev.yml restart worker
- Verificar fila de mensagens:
docker-compose -f docker-compose.dev.yml exec redis redis-cli LLEN celery
- Purgar fila se necessário:
docker-compose -f docker-compose.dev.yml exec backend celery -A app purge
Espaço em Disco Cheio
Cenário: Sistema sem espaço para operar.
Procedimento:
- Identificar consumo:
df -h
du -sh /var/lib/docker/*
docker system df
- Limpeza de emergência:
docker system prune -a --volumes
docker-compose -f docker-compose.dev.yml exec backend find /app/media/temp -type f -mtime +1 -delete
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -d portal_talentos -c "VACUUM FULL;"
- Rotacionar logs:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Backup e Restauração
Política de Backup
| Tipo | Frequência | Retenção | Local |
|---|---|---|---|
| Completo | Diário | 30 dias | S3/Storage externo |
| Incremental | A cada 6 horas | 7 dias | Local + S3 |
| Logs | Tempo real | 90 dias | CloudWatch/ELK |
Script de Backup Automatizado
#!/bin/bash
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/portal_talentos_${DATE}.sql"
mkdir -p $BACKUP_DIR
docker-compose -f docker-compose.dev.yml exec -T postgres pg_dump -U postgres portal_talentos > $BACKUP_FILE
gzip $BACKUP_FILE
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
aws s3 cp ${BACKUP_FILE}.gz s3://backup-bucket/database/
Restauração Completa
#!/bin/bash
BACKUP_FILE=$1
if [ -z "$BACKUP_FILE" ]; then
echo "Uso: ./restore.sh backup_file.sql.gz"
exit 1
fi
echo "Parando serviços..."
docker-compose -f docker-compose.dev.yml stop backend worker beat
echo "Restaurando banco..."
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'portal_talentos' AND pid <> pg_backend_pid();"
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -c "DROP DATABASE IF EXISTS portal_talentos;"
docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -c "CREATE DATABASE portal_talentos;"
gunzip -c $BACKUP_FILE | docker-compose -f docker-compose.dev.yml exec -T postgres psql -U postgres -d portal_talentos
echo "Aplicando migrations pendentes..."
docker-compose -f docker-compose.dev.yml run --rm backend python manage.py migrate
echo "Reiniciando serviços..."
docker-compose -f docker-compose.dev.yml start backend worker beat
echo "Verificando sistema..."
docker-compose -f docker-compose.dev.yml exec backend python manage.py check
echo "Restauração concluída!"
Teste de Recuperação
Checklist de Teste Mensal
- Restaurar backup em ambiente de teste
- Verificar integridade dos dados
- Testar todas as funcionalidades principais
- Medir tempo de recuperação (RTO)
- Documentar resultados
Métricas de Recuperação
| Métrica | Objetivo | Medição |
|---|---|---|
| RTO (Recovery Time Objective) | < 1 hora | Tempo para restaurar serviço |
| RPO (Recovery Point Objective) | < 6 horas | Perda máxima de dados |
Comunicação de Incidentes
Template de Comunicação
ASSUNTO: [SEVERIDADE] - Descrição breve do incidente
STATUS: Em investigação / Em progresso / Resolvido
IMPACTO:
- Serviços afetados: [lista]
- Usuários impactados: [estimativa]
TIMELINE:
- [HH:MM] Incidente detectado
- [HH:MM] Time de resposta acionado
- [HH:MM] Causa identificada
- [HH:MM] Solução implementada
- [HH:MM] Serviço restaurado
CAUSA RAIZ:
[Descrição técnica da causa]
AÇÕES CORRETIVAS:
[Lista de ações tomadas e planejadas]
PRÓXIMAS ATUALIZAÇÕES:
[Data/hora da próxima comunicação]
Importante
Sempre documente todas as ações tomadas durante um incidente. Isso é essencial para análise post-mortem e melhoria contínua.
Simulações
Realize simulações de desastre regularmente para garantir que a equipe esteja preparada e os procedimentos estejam atualizados.