Pular para o conteúdo principal

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​

SeveridadeDescriçãoTempo de RespostaExemplo
CríticaSistema completamente indisponível< 15 minBanco de dados corrompido
AltaFuncionalidade principal afetada< 1 horaAPI principal fora do ar
MédiaFuncionalidade secundária afetada< 4 horasWorker Celery parado
BaixaImpacto mínimo para usuários< 24 horasLogs não sendo coletados

Contatos de Emergência​

Procedimentos de Recuperação​

Falha Total do Sistema​

Cenário: Todos os serviços estão indisponíveis.

Procedimento:

  1. Verificar infraestrutura base:
docker info
systemctl status docker
  1. Reiniciar todos os serviços:
docker-compose -f docker-compose.dev.yml down
docker-compose -f docker-compose.dev.yml up -d
  1. Verificar status:
docker-compose -f docker-compose.dev.yml ps
docker-compose -f docker-compose.dev.yml logs --tail=50
  1. 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:

  1. Parar serviços que acessam o banco:
docker-compose -f docker-compose.dev.yml stop backend worker beat
  1. 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"
  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;"
  1. 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
  1. Reiniciar serviços:
docker-compose -f docker-compose.dev.yml start backend worker beat
  1. 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:

  1. Reiniciar Redis:
docker-compose -f docker-compose.dev.yml restart redis
  1. Limpar filas corrompidas:
docker-compose -f docker-compose.dev.yml exec redis redis-cli FLUSHALL
  1. Reiniciar workers:
docker-compose -f docker-compose.dev.yml restart worker beat
  1. 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:

  1. 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
  1. Reiniciar worker:
docker-compose -f docker-compose.dev.yml restart worker
  1. Verificar fila de mensagens:
docker-compose -f docker-compose.dev.yml exec redis redis-cli LLEN celery
  1. 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:

  1. Identificar consumo:
df -h
du -sh /var/lib/docker/*
docker system df
  1. 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;"
  1. Rotacionar logs:
truncate -s 0 /var/lib/docker/containers/*/*-json.log

Backup e Restauração​

Política de Backup​

TipoFrequênciaRetençãoLocal
CompletoDiário30 diasS3/Storage externo
IncrementalA cada 6 horas7 diasLocal + S3
LogsTempo real90 diasCloudWatch/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étricaObjetivoMedição
RTO (Recovery Time Objective)< 1 horaTempo para restaurar serviço
RPO (Recovery Point Objective)< 6 horasPerda 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.