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.