Pular para o conteúdo principal

Plano de Contingência e Recuperação de Desastres

Documento: Plano de Contingência e Recuperação de Desastres Sistema: Módulo Empreendedorismo Versão: 1.0 Data: Janeiro/2025 Classificação: Confidencial


1. Introdução

1.1. Objetivo

Este documento estabelece o Plano de Contingência e Recuperação de Desastres (DRP - Disaster Recovery Plan) do sistema Módulo Empreendedorismo, definindo procedimentos para garantir a continuidade dos serviços em situações de crise e a recuperação completa do sistema após incidentes.

1.2. Escopo

Este plano abrange:

  • Classificação de incidentes e níveis de severidade
  • Procedimentos de resposta a incidentes
  • Estratégias de backup e recuperação
  • Procedimentos de failover
  • Testes de recuperação
  • Responsabilidades e comunicação

1.3. Objetivos de Recuperação

MétricaObjetivoDescrição
RTO (Recovery Time Objective)4 horasTempo máximo para restaurar operações
RPO (Recovery Point Objective)1 horaPerda máxima de dados aceitável
MTTR (Mean Time to Repair)2 horasTempo médio para reparo

1.4. Documentos Relacionados

DocumentoDescrição
Manual de InstalaçãoProcedimentos de instalação
Procedimentos de ManutençãoRotinas preventivas
Documentação TécnicaArquitetura do sistema

2. Classificação de Incidentes

2.1. Níveis de Severidade

NívelClassificaçãoDescriçãoTempo de RespostaExemplos
P1CríticoSistema totalmente indisponível15 minutosServidor down, banco corrompido
P2AltoFuncionalidade crítica comprometida30 minutosAPI indisponível, login não funciona
P3MédioFuncionalidade secundária afetada2 horasRelatórios não geram, uploads falham
P4BaixoInconveniente sem impacto operacional8 horasLentidão pontual, erro visual

2.2. Tipos de Desastres

2.2.1. Desastres Técnicos

TipoDescriçãoProbabilidadeImpacto
Falha de hardwareServidor físico com defeitoBaixaAlto
Corrupção de dadosBanco de dados corrompidoBaixaCrítico
Ataque cibernéticoRansomware, DDoS, invasãoMédiaCrítico
Falha de softwareBug crítico em produçãoMédiaAlto
Erro humanoExclusão acidental, configuração erradaMédiaAlto

2.2.2. Desastres Físicos

TipoDescriçãoProbabilidadeImpacto
Queda de energiaInterrupção elétrica prolongadaMédiaAlto
IncêndioDestruição do datacenterMuito BaixaCrítico
InundaçãoDanos por águaMuito BaixaCrítico
Desastre naturalTerremoto, furacãoMuito BaixaCrítico

3. Estrutura de Resposta a Incidentes

3.1. Equipe de Resposta

FunçãoResponsabilidadeContato
Coordenador de CriseCoordena resposta, toma decisões[DEFINIR]
Líder TécnicoCoordena equipe técnica[DEFINIR]
DBARecuperação de banco de dados[DEFINIR]
DevOpsInfraestrutura e containers[DEFINIR]
SegurançaIncidentes de segurança[DEFINIR]
ComunicaçãoComunicação com stakeholders[DEFINIR]

3.2. Cadeia de Escalonamento

Nível 1: Administrador de Sistemas (Plantão)
↓ (se não resolver em 30 min)
Nível 2: Líder Técnico
↓ (se P1/P2 ou não resolver em 1h)
Nível 3: Coordenador de Crise + Gestor de TI
↓ (se desastre maior)
Nível 4: Diretoria + Comunicação Corporativa

3.3. Canais de Comunicação

CanalUsoPrioridade
Telefone/WhatsAppComunicação urgenteP1, P2
Slack/TeamsCoordenação da equipeTodos
EmailDocumentação e stakeholdersP3, P4
War Room (virtual)Gestão de crise prolongadaP1

4. Estratégia de Backup

4.1. Política de Backup

ComponenteTipoFrequênciaRetençãoLocalização
PostgreSQLCompletoDiário (02:00)30 diasLocal + Cloud
PostgreSQLIncremental6 em 6 horas7 diasLocal
MinIO (arquivos)CompletoDiário (03:00)30 diasLocal + Cloud
ConfiguraçõesCompletoA cada mudança90 diasGit + Cloud
LogsRotacionadoDiário30 diasLocal

4.2. Procedimentos de Backup

4.2.1. Backup Automático do Banco de Dados

#!/bin/bash
# /opt/scripts/backup_database.sh

set -e

BACKUP_DIR="/backups/postgres"
CLOUD_BUCKET="s3://backups-empreendedorismo/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_LOCAL=30
RETENTION_CLOUD=90

# Criar diretório
mkdir -p $BACKUP_DIR

# Backup completo
echo "[$(date)] Iniciando backup do PostgreSQL..."
docker compose exec -T db pg_dump -U postgres -Fc empreendedorismo \
> "$BACKUP_DIR/db_full_$DATE.dump"

# Comprimir
gzip "$BACKUP_DIR/db_full_$DATE.dump"
BACKUP_FILE="$BACKUP_DIR/db_full_$DATE.dump.gz"

# Verificar integridade
echo "[$(date)] Verificando integridade..."
gzip -t "$BACKUP_FILE"

# Calcular checksum
sha256sum "$BACKUP_FILE" > "$BACKUP_FILE.sha256"

# Upload para cloud
echo "[$(date)] Enviando para cloud..."
aws s3 cp "$BACKUP_FILE" "$CLOUD_BUCKET/" --storage-class STANDARD_IA
aws s3 cp "$BACKUP_FILE.sha256" "$CLOUD_BUCKET/"

# Limpeza local
echo "[$(date)] Limpando backups antigos..."
find $BACKUP_DIR -name "db_*.dump.gz" -mtime +$RETENTION_LOCAL -delete
find $BACKUP_DIR -name "*.sha256" -mtime +$RETENTION_LOCAL -delete

# Registrar sucesso
echo "[$(date)] Backup concluído: $BACKUP_FILE"
echo "$(date),$BACKUP_FILE,SUCCESS" >> /var/log/backup_history.csv

4.2.2. Backup do MinIO

#!/bin/bash
# /opt/scripts/backup_minio.sh

set -e

BACKUP_DIR="/backups/minio"
CLOUD_BUCKET="s3://backups-empreendedorismo/minio"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

echo "[$(date)] Iniciando backup do MinIO..."

# Sync local
docker compose exec -T minio mc mirror local/empreendedorismo \
/backup/minio_$DATE/ 2>/dev/null || \
docker cp $(docker compose ps -q minio):/data "$BACKUP_DIR/minio_$DATE"

# Comprimir
tar -czf "$BACKUP_DIR/minio_$DATE.tar.gz" -C "$BACKUP_DIR" "minio_$DATE"
rm -rf "$BACKUP_DIR/minio_$DATE"

# Upload para cloud
aws s3 cp "$BACKUP_DIR/minio_$DATE.tar.gz" "$CLOUD_BUCKET/"

echo "[$(date)] Backup MinIO concluído"

4.3. Verificação de Backups

4.3.1. Teste de Restauração Mensal

#!/bin/bash
# /opt/scripts/test_restore.sh

echo "=== Teste de Restauração - $(date) ==="

# 1. Criar ambiente de teste
echo "[1/5] Criando ambiente de teste..."
docker compose -f docker-compose.test.yml up -d db

# 2. Aguardar banco inicializar
sleep 30

# 3. Restaurar último backup
LATEST_BACKUP=$(ls -t /backups/postgres/db_*.dump.gz | head -1)
echo "[2/5] Restaurando: $LATEST_BACKUP"
gunzip -c "$LATEST_BACKUP" | \
docker compose -f docker-compose.test.yml exec -T db \
pg_restore -U postgres -d empreendedorismo -c

# 4. Verificar integridade
echo "[3/5] Verificando integridade..."
docker compose -f docker-compose.test.yml exec -T db psql -U postgres -d empreendedorismo -c "
SELECT
(SELECT count(*) FROM accounts_user) as users,
(SELECT count(*) FROM business_plans_businessplan) as plans;
"

# 5. Registrar resultado
echo "[4/5] Registrando resultado..."
echo "$(date),RESTORE_TEST,SUCCESS" >> /var/log/restore_tests.csv

# 6. Limpar ambiente
echo "[5/5] Limpando ambiente de teste..."
docker compose -f docker-compose.test.yml down -v

echo "=== Teste Concluído ==="

5. Procedimentos de Recuperação

5.1. Recuperação de Container (P3/P4)

Sintoma: Container específico não responde Tempo estimado: 5-15 minutos

#!/bin/bash
# Procedimento: Recuperação de Container

CONTAINER=$1

echo "=== Recuperação de Container: $CONTAINER ==="

# 1. Verificar status
echo "[1/4] Status atual:"
docker compose ps $CONTAINER

# 2. Verificar logs
echo "[2/4] Últimos logs:"
docker compose logs --tail=50 $CONTAINER

# 3. Reiniciar container
echo "[3/4] Reiniciando..."
docker compose restart $CONTAINER

# 4. Verificar recuperação
sleep 10
echo "[4/4] Verificando:"
docker compose ps $CONTAINER
docker compose exec $CONTAINER echo "Container OK" 2>/dev/null && echo "RECUPERADO" || echo "FALHA - Escalar"

5.2. Recuperação de Banco de Dados (P1/P2)

Sintoma: Banco de dados corrompido ou inacessível Tempo estimado: 30-60 minutos

#!/bin/bash
# Procedimento: Recuperação de Banco de Dados

echo "=== PROCEDIMENTO DE RECUPERAÇÃO DE BANCO DE DADOS ==="
echo "ATENÇÃO: Este procedimento irá restaurar o banco de um backup"
read -p "Confirma? (yes/no): " CONFIRM
[ "$CONFIRM" != "yes" ] && exit 1

# 1. Parar aplicações
echo "[1/7] Parando aplicações..."
docker compose stop backend celery-worker celery-worker-emails

# 2. Identificar último backup válido
echo "[2/7] Identificando backup..."
LATEST_BACKUP=$(ls -t /backups/postgres/db_*.dump.gz | head -1)
echo "Backup selecionado: $LATEST_BACKUP"

# Verificar checksum
if [ -f "$LATEST_BACKUP.sha256" ]; then
sha256sum -c "$LATEST_BACKUP.sha256" || { echo "ERRO: Checksum inválido"; exit 1; }
fi

# 3. Criar backup do estado atual (se possível)
echo "[3/7] Backup do estado atual..."
docker compose exec -T db pg_dump -U postgres empreendedorismo 2>/dev/null \
> "/backups/emergency/pre_restore_$(date +%Y%m%d_%H%M%S).sql" || true

# 4. Recriar banco
echo "[4/7] Recriando banco..."
docker compose exec -T db psql -U postgres -c "
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE datname = 'empreendedorismo' AND pid <> pg_backend_pid();
"
docker compose exec -T db psql -U postgres -c "DROP DATABASE IF EXISTS empreendedorismo;"
docker compose exec -T db psql -U postgres -c "CREATE DATABASE empreendedorismo;"

# 5. Restaurar backup
echo "[5/7] Restaurando backup..."
gunzip -c "$LATEST_BACKUP" | \
docker compose exec -T db pg_restore -U postgres -d empreendedorismo --no-owner

# 6. Verificar restauração
echo "[6/7] Verificando restauração..."
docker compose exec -T db psql -U postgres -d empreendedorismo -c "
SELECT 'users' as table, count(*) as count FROM accounts_user
UNION ALL
SELECT 'plans', count(*) FROM business_plans_businessplan;
"

# 7. Reiniciar aplicações
echo "[7/7] Reiniciando aplicações..."
docker compose start backend celery-worker celery-worker-emails

echo "=== RECUPERAÇÃO CONCLUÍDA ==="
echo "Data do backup: $(stat -c %y $LATEST_BACKUP)"

5.3. Recuperação Completa do Sistema (P1)

Sintoma: Sistema completamente indisponível (servidor, datacenter) Tempo estimado: 2-4 horas

#!/bin/bash
# Procedimento: Recuperação Completa do Sistema
# Executar em novo servidor provisionado

echo "=== RECUPERAÇÃO COMPLETA DO SISTEMA ==="
echo "Este procedimento restaura todo o sistema em um novo servidor"

# Variáveis
BACKUP_BUCKET="s3://backups-empreendedorismo"
INSTALL_DIR="/opt/modulo-empreendedorismo"

# 1. Instalar dependências
echo "[1/10] Instalando dependências..."
apt update && apt install -y docker.io docker-compose-plugin git awscli

# 2. Configurar Docker
echo "[2/10] Configurando Docker..."
systemctl enable docker
systemctl start docker

# 3. Clonar repositório
echo "[3/10] Clonando repositório..."
git clone https://github.com/Tav-Web/modulo-empreendedorismo.git $INSTALL_DIR
cd $INSTALL_DIR

# 4. Baixar backups do cloud
echo "[4/10] Baixando backups..."
mkdir -p /backups/{postgres,minio}
aws s3 cp $(aws s3 ls $BACKUP_BUCKET/postgres/ --recursive | sort | tail -1 | awk '{print $4}') /backups/postgres/
aws s3 cp $(aws s3 ls $BACKUP_BUCKET/minio/ --recursive | sort | tail -1 | awk '{print $4}') /backups/minio/

# 5. Configurar docker-compose
echo "[5/10] Configurando docker-compose..."
cp docker-compose.example.yml docker-compose.yml
echo "ATENÇÃO: Configure as variáveis em docker-compose.yml"
read -p "Pressione ENTER após configurar..."

# 6. Iniciar infraestrutura
echo "[6/10] Iniciando infraestrutura..."
docker compose up -d db redis minio
sleep 30

# 7. Restaurar banco de dados
echo "[7/10] Restaurando banco de dados..."
LATEST_DB=$(ls -t /backups/postgres/*.dump.gz | head -1)
gunzip -c "$LATEST_DB" | docker compose exec -T db pg_restore -U postgres -d empreendedorismo --no-owner

# 8. Restaurar MinIO
echo "[8/10] Restaurando MinIO..."
LATEST_MINIO=$(ls -t /backups/minio/*.tar.gz | head -1)
tar -xzf "$LATEST_MINIO" -C /tmp/
docker cp /tmp/minio_*/* $(docker compose ps -q minio):/data/

# 9. Configurar MinIO
echo "[9/10] Configurando MinIO..."
docker compose exec backend python manage.py setup_minio

# 10. Iniciar aplicação completa
echo "[10/10] Iniciando aplicação..."
docker compose up -d

# Verificar
echo ""
echo "=== VERIFICAÇÃO ==="
docker compose ps
curl -I http://localhost:8000/api/docs/
curl -I http://localhost:9501/

echo ""
echo "=== RECUPERAÇÃO COMPLETA CONCLUÍDA ==="
echo "Por favor, execute os testes de verificação manualmente"

5.4. Recuperação de Ataque de Ransomware (P1)

Sintoma: Arquivos criptografados, sistema comprometido Tempo estimado: 4-8 horas

Procedimento:

  1. Isolamento Imediato

    # Desconectar da rede
    sudo systemctl stop docker
    sudo ifdown eth0 # ou interface de rede
  2. Preservar Evidências

    • NÃO reiniciar ou desligar máquinas
    • Documentar tudo com screenshots
    • Registrar horário e sintomas
  3. Acionar Equipe de Segurança

    • Contatar CSIRT/equipe de segurança
    • Notificar gestão e jurídico
    • Avaliar obrigações de notificação (LGPD)
  4. Avaliar Extensão

    • Identificar sistemas afetados
    • Verificar integridade dos backups (em ambiente isolado)
    • Determinar vetor de ataque
  5. Recuperação em Ambiente Limpo

    • Provisionar nova infraestrutura
    • Restaurar de backups verificados
    • Aplicar patches de segurança
    • Alterar TODAS as credenciais
  6. Pós-Incidente

    • Relatório completo do incidente
    • Análise de causa raiz
    • Implementar melhorias de segurança
    • Treinar equipe

6. Procedimentos de Failover

6.1. Failover de Banco de Dados

Se utilizando replicação PostgreSQL:

#!/bin/bash
# Procedimento: Failover para Réplica

echo "=== FAILOVER DE BANCO DE DADOS ==="

# 1. Promover réplica a primary
docker compose exec db-replica pg_ctl promote -D /var/lib/postgresql/data

# 2. Atualizar configuração do backend
sed -i 's/DB_HOST=db/DB_HOST=db-replica/' docker-compose.yml

# 3. Reiniciar backend
docker compose restart backend celery-worker celery-worker-emails

# 4. Verificar conexão
docker compose exec backend python -c "
from django.db import connection
connection.ensure_connection()
print('Conexão OK')
"

echo "=== FAILOVER CONCLUÍDO ==="

6.2. Failover de Armazenamento (MinIO)

#!/bin/bash
# Procedimento: Failover MinIO para S3

echo "=== FAILOVER MINIO -> S3 ==="

# 1. Atualizar configuração para usar S3
cat >> docker-compose.yml << EOF
backend:
environment:
- USE_S3=True
- AWS_ACCESS_KEY_ID=xxx
- AWS_SECRET_ACCESS_KEY=xxx
- AWS_STORAGE_BUCKET_NAME=empreendedorismo-prod
EOF

# 2. Reiniciar backend
docker compose restart backend

echo "=== FAILOVER CONCLUÍDO ==="

7. Comunicação de Crise

7.1. Templates de Comunicação

Notificação Inicial (Interna)

ASSUNTO: [INCIDENTE P1] Sistema Módulo Empreendedorismo - Indisponibilidade

Equipe,

Foi detectado um incidente de severidade P1 no sistema Módulo Empreendedorismo.

SITUAÇÃO:
- Horário de detecção: [DATA/HORA]
- Impacto: [DESCRIÇÃO]
- Status: Em investigação

AÇÕES EM ANDAMENTO:
- Equipe técnica acionada
- Diagnóstico inicial em andamento

PRÓXIMA ATUALIZAÇÃO: em [XX] minutos

Coordenador de Crise: [NOME]

Atualização de Status

ASSUNTO: [ATUALIZAÇÃO] Incidente P1 - Módulo Empreendedorismo

Atualização #[N] - [DATA/HORA]

STATUS: [Em andamento / Resolvido / Mitigado]

CAUSA IDENTIFICADA:
[Descrição da causa]

AÇÕES REALIZADAS:
1. [Ação 1]
2. [Ação 2]

PRÓXIMOS PASSOS:
- [Próximo passo]

PREVISÃO DE RESOLUÇÃO: [DATA/HORA ou "A definir"]

Comunicação para Usuários

ASSUNTO: Informativo - Indisponibilidade Temporária

Prezados usuários,

Informamos que o sistema Módulo Empreendedorismo está temporariamente indisponível devido a uma manutenção não programada.

Nossa equipe técnica está trabalhando para restaurar os serviços o mais rapidamente possível.

Previsão de retorno: [DATA/HORA]

Pedimos desculpas pelo transtorno e agradecemos a compreensão.

Atenciosamente,
Equipe de Suporte

7.2. Matriz de Comunicação

SituaçãoQuem ComunicarCanalResponsável
Incidente P1 detectadoEquipe técnicaTelefone/SlackPlantão
Após 15 min P1Gestor de TITelefoneLíder Técnico
Após 30 min P1DiretoriaEmail/TelefoneCoordenador
Impacto > 1hUsuáriosEmail/SistemaComunicação
ResoluçãoTodos notificadosMesmo canalCoordenador

8. Testes do Plano

8.1. Cronograma de Testes

Tipo de TesteFrequênciaParticipantes
Teste de backupMensalDBA
Teste de restauraçãoTrimestralDBA + DevOps
Simulação de incidenteSemestralEquipe completa
DR Drill completoAnualEquipe + Gestão

8.2. Checklist de Teste de DR

  • Backups disponíveis e íntegros
  • Procedimentos documentados e atualizados
  • Equipe conhece responsabilidades
  • Canais de comunicação funcionando
  • Ambiente de DR provisionável
  • Restauração de banco testada
  • Restauração de arquivos testada
  • Tempo de recuperação dentro do RTO
  • Perda de dados dentro do RPO

8.3. Relatório de Teste

RELATÓRIO DE TESTE DE RECUPERAÇÃO DE DESASTRES

Data: [DATA]
Tipo: [Backup/Restauração/Simulação/DR Drill]
Participantes: [LISTA]

CENÁRIO TESTADO:
[Descrição do cenário]

RESULTADOS:
- RTO alcançado: [SIM/NÃO] ([XX] horas vs objetivo [XX] horas)
- RPO alcançado: [SIM/NÃO] ([XX] dados perdidos vs objetivo)
- Procedimentos seguidos: [SIM/PARCIAL/NÃO]

PROBLEMAS IDENTIFICADOS:
1. [Problema 1]
2. [Problema 2]

AÇÕES DE MELHORIA:
1. [Ação 1] - Responsável: [NOME] - Prazo: [DATA]
2. [Ação 2] - Responsável: [NOME] - Prazo: [DATA]

APROVAÇÃO:
Coordenador de Crise: _______________
Data: _______________

9. Revisão e Atualização

9.1. Gatilhos de Revisão

O plano deve ser revisado quando:

  • Mudança significativa na arquitetura
  • Novo componente crítico adicionado
  • Após incidente real
  • Após teste de DR com problemas
  • Mudança na equipe de resposta
  • Anualmente (no mínimo)

9.2. Controle de Versões

VersãoDataAutorAlterações
1.0Jan/2025[Nome]Versão inicial

9.3. Aprovações

FunçãoNomeAssinaturaData
Gestor de TI
Coordenador de Crise
Diretor

10. Anexos

10.1. Lista de Contatos de Emergência

FunçãoNomeTelefoneEmail
Coordenador de Crise[DEFINIR]
Líder Técnico[DEFINIR]
DBA[DEFINIR]
DevOps[DEFINIR]
Segurança[DEFINIR]
Gestor de TI[DEFINIR]
Suporte Cloud (AWS/GCP)

10.2. Inventário de Sistemas Críticos

SistemaCriticidadeRTORPODependências
PostgreSQLAlta1h1h-
Backend APIAlta30min-PostgreSQL, Redis
FrontendAlta30min-Backend
CeleryMédia1h-Redis, Backend
MinIOMédia2h24h-
RedisAlta15min--

10.3. Recursos Externos

RecursoContato/URL
Suporte AWShttps://aws.amazon.com/support
Status Docker Hubhttps://status.docker.com
Status GitHubhttps://www.githubstatus.com

Fim do Documento