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étrica | Objetivo | Descrição |
|---|---|---|
| RTO (Recovery Time Objective) | 4 horas | Tempo máximo para restaurar operações |
| RPO (Recovery Point Objective) | 1 hora | Perda máxima de dados aceitável |
| MTTR (Mean Time to Repair) | 2 horas | Tempo médio para reparo |
1.4. Documentos Relacionados
| Documento | Descrição |
|---|---|
| Manual de Instalação | Procedimentos de instalação |
| Procedimentos de Manutenção | Rotinas preventivas |
| Documentação Técnica | Arquitetura do sistema |
2. Classificação de Incidentes
2.1. Níveis de Severidade
| Nível | Classificação | Descrição | Tempo de Resposta | Exemplos |
|---|---|---|---|---|
| P1 | Crítico | Sistema totalmente indisponível | 15 minutos | Servidor down, banco corrompido |
| P2 | Alto | Funcionalidade crítica comprometida | 30 minutos | API indisponível, login não funciona |
| P3 | Médio | Funcionalidade secundária afetada | 2 horas | Relatórios não geram, uploads falham |
| P4 | Baixo | Inconveniente sem impacto operacional | 8 horas | Lentidão pontual, erro visual |
2.2. Tipos de Desastres
2.2.1. Desastres Técnicos
| Tipo | Descrição | Probabilidade | Impacto |
|---|---|---|---|
| Falha de hardware | Servidor físico com defeito | Baixa | Alto |
| Corrupção de dados | Banco de dados corrompido | Baixa | Crítico |
| Ataque cibernético | Ransomware, DDoS, invasão | Média | Crítico |
| Falha de software | Bug crítico em produção | Média | Alto |
| Erro humano | Exclusão acidental, configuração errada | Média | Alto |
2.2.2. Desastres Físicos
| Tipo | Descrição | Probabilidade | Impacto |
|---|---|---|---|
| Queda de energia | Interrupção elétrica prolongada | Média | Alto |
| Incêndio | Destruição do datacenter | Muito Baixa | Crítico |
| Inundação | Danos por água | Muito Baixa | Crítico |
| Desastre natural | Terremoto, furacão | Muito Baixa | Crítico |
3. Estrutura de Resposta a Incidentes
3.1. Equipe de Resposta
| Função | Responsabilidade | Contato |
|---|---|---|
| Coordenador de Crise | Coordena resposta, toma decisões | [DEFINIR] |
| Líder Técnico | Coordena equipe técnica | [DEFINIR] |
| DBA | Recuperação de banco de dados | [DEFINIR] |
| DevOps | Infraestrutura e containers | [DEFINIR] |
| Segurança | Incidentes de segurança | [DEFINIR] |
| Comunicação | Comunicaçã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
| Canal | Uso | Prioridade |
|---|---|---|
| Telefone/WhatsApp | Comunicação urgente | P1, P2 |
| Slack/Teams | Coordenação da equipe | Todos |
| Documentação e stakeholders | P3, P4 | |
| War Room (virtual) | Gestão de crise prolongada | P1 |
4. Estratégia de Backup
4.1. Política de Backup
| Componente | Tipo | Frequência | Retenção | Localização |
|---|---|---|---|---|
| PostgreSQL | Completo | Diário (02:00) | 30 dias | Local + Cloud |
| PostgreSQL | Incremental | 6 em 6 horas | 7 dias | Local |
| MinIO (arquivos) | Completo | Diário (03:00) | 30 dias | Local + Cloud |
| Configurações | Completo | A cada mudança | 90 dias | Git + Cloud |
| Logs | Rotacionado | Diário | 30 dias | Local |
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:
-
Isolamento Imediato
# Desconectar da rede
sudo systemctl stop docker
sudo ifdown eth0 # ou interface de rede -
Preservar Evidências
- NÃO reiniciar ou desligar máquinas
- Documentar tudo com screenshots
- Registrar horário e sintomas
-
Acionar Equipe de Segurança
- Contatar CSIRT/equipe de segurança
- Notificar gestão e jurídico
- Avaliar obrigações de notificação (LGPD)
-
Avaliar Extensão
- Identificar sistemas afetados
- Verificar integridade dos backups (em ambiente isolado)
- Determinar vetor de ataque
-
Recuperação em Ambiente Limpo
- Provisionar nova infraestrutura
- Restaurar de backups verificados
- Aplicar patches de segurança
- Alterar TODAS as credenciais
-
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ção | Quem Comunicar | Canal | Responsável |
|---|---|---|---|
| Incidente P1 detectado | Equipe técnica | Telefone/Slack | Plantão |
| Após 15 min P1 | Gestor de TI | Telefone | Líder Técnico |
| Após 30 min P1 | Diretoria | Email/Telefone | Coordenador |
| Impacto > 1h | Usuários | Email/Sistema | Comunicação |
| Resolução | Todos notificados | Mesmo canal | Coordenador |
8. Testes do Plano
8.1. Cronograma de Testes
| Tipo de Teste | Frequência | Participantes |
|---|---|---|
| Teste de backup | Mensal | DBA |
| Teste de restauração | Trimestral | DBA + DevOps |
| Simulação de incidente | Semestral | Equipe completa |
| DR Drill completo | Anual | Equipe + 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ão | Data | Autor | Alterações |
|---|---|---|---|
| 1.0 | Jan/2025 | [Nome] | Versão inicial |
9.3. Aprovações
| Função | Nome | Assinatura | Data |
|---|---|---|---|
| Gestor de TI | |||
| Coordenador de Crise | |||
| Diretor |
10. Anexos
10.1. Lista de Contatos de Emergência
| Função | Nome | Telefone | |
|---|---|---|---|
| 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
| Sistema | Criticidade | RTO | RPO | Dependências |
|---|---|---|---|---|
| PostgreSQL | Alta | 1h | 1h | - |
| Backend API | Alta | 30min | - | PostgreSQL, Redis |
| Frontend | Alta | 30min | - | Backend |
| Celery | Média | 1h | - | Redis, Backend |
| MinIO | Média | 2h | 24h | - |
| Redis | Alta | 15min | - | - |
10.3. Recursos Externos
| Recurso | Contato/URL |
|---|---|
| Suporte AWS | https://aws.amazon.com/support |
| Status Docker Hub | https://status.docker.com |
| Status GitHub | https://www.githubstatus.com |
Fim do Documento