Files
GTI_GERENCIADOR_FISCAL/docs/RUNBOOK_DR_HUB.md
T

109 lines
4.6 KiB
Markdown

# Runbook de Disaster Recovery (DR) do Hub — GTI Fiscal
Este runbook detalha o procedimento operacional padronizado para recuperação de desastre do GTI Fiscal Hub a partir dos backups criados automaticamente a cada execução do `scripts/deploy_hub.ps1`.
---
## 1. Localização e Estrutura dos Backups
Os backups de produção residem no servidor Linux do Hub (`10.0.10.117`) sob o diretório:
```text
/home/administrador/backups/gti-fiscal-deploy-YYYYMMDD-HHMMSS/
```
Cada pacote de backup contém três artefatos imutáveis gerados antes de qualquer atualização:
1. `gti_fiscal.dump`: Dump binário consistente do banco PostgreSQL via `pg_dump -Fc` (formato customizado compactado).
2. `releases.tgz`: Arquivo compactado contendo todos os instaladores e binários publicados do Agent Windows em `/app/data/releases`.
3. `hub.env`: Arquivo de variáveis de ambiente e segredos de produção com permissão restrita `chmod 600`.
4. `previous_tree.tgz`: Cópia compactada completa da árvore de código anterior do Hub.
---
## 2. Estimativa de Tempo de Recuperação (RTO / RPO)
- **RPO (Recovery Point Objective)**: O ponto de recuperação corresponde exatamente ao último snapshot pré-deploy ou último backup agendado (máximo de 24 horas para dados de produção; zero perda de código/migrações).
- **RTO (Recovery Time Objective)**: **Inferior a 3 minutos** para restauração completa do banco de dados e reinício dos contêineres Docker.
---
## 3. Procedimento de Restauração em Produção (Passo a Passo)
### Passo 1: Acessar o servidor via SSH e identificar o backup
```bash
ssh administrador@10.0.10.117
# Listar os backups disponíveis por data decrescente
ls -lt /home/administrador/backups/
BACKUP_DIR=$(ls -d /home/administrador/backups/gti-fiscal-deploy-* | sort -r | head -n 1)
echo "Utilizando backup: $BACKUP_DIR"
```
### Passo 2: Parar o serviço do Hub (preservando o Postgres)
```bash
cd /home/administrador/gti-fiscal/deploy/hub
docker compose -f docker-compose.prod.yml stop fiscal-hub
```
### Passo 3: Recriar o banco e restaurar o dump via `pg_restore`
```bash
# 1. Dropar conexões ativas e recriar o schema limpo
docker exec -i gti-fiscal-hub-postgres-1 psql -U gti -d postgres -c "
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'gti_fiscal' AND pid <> pg_backend_pid();
DROP DATABASE IF EXISTS gti_fiscal_dr_temp;
CREATE DATABASE gti_fiscal_dr_temp TEMPLATE gti_fiscal;
DROP DATABASE gti_fiscal;
CREATE DATABASE gti_fiscal OWNER gti;
"
# 2. Restaurar o dump do backup com pg_restore
docker exec -i gti-fiscal-hub-postgres-1 pg_restore -U gti -d gti_fiscal --clean --if-exists --no-owner < "$BACKUP_DIR/gti_fiscal.dump"
# 3. Remover a base temporária após confirmação
docker exec -i gti-fiscal-hub-postgres-1 psql -U gti -d postgres -c "DROP DATABASE IF EXISTS gti_fiscal_dr_temp;"
```
### Passo 4: Restaurar os releases e configurações
```bash
# Restaurar os arquivos de releases caso necessário
docker exec -i gti-fiscal-hub-fiscal-hub-1 tar -xzf - -C /app/data < "$BACKUP_DIR/releases.tgz"
# Restaurar o arquivo de ambiente
cp "$BACKUP_DIR/hub.env" /home/administrador/gti-fiscal/deploy/hub/.env
chmod 600 /home/administrador/gti-fiscal/deploy/hub/.env
```
### Passo 5: Iniciar o Hub e conferir migrações e healthchecks
```bash
docker compose -f docker-compose.prod.yml up -d fiscal-hub
# Aguardar 10 segundos e verificar o estado
sleep 10
docker exec gti-fiscal-hub-fiscal-hub-1 python -m alembic -c central/alembic.ini current
curl -k https://localhost:8000/health
curl -k https://localhost:8000/version
```
---
## 4. Teste de Restauração em Ambiente Isolado (Validação Sintética)
Para testar a integridade do dump sem interromper o ambiente de produção:
```bash
# Criar um banco de teste efêmero no próprio postgres de lab
docker exec -i gti-fiscal-hub-postgres-1 psql -U gti -d postgres -c "DROP DATABASE IF EXISTS gti_fiscal_test_restore; CREATE DATABASE gti_fiscal_test_restore OWNER gti;"
# Restaurar o dump no banco efêmero
docker exec -i gti-fiscal-hub-postgres-1 pg_restore -U gti -d gti_fiscal_test_restore --no-owner < "$BACKUP_DIR/gti_fiscal.dump"
# Verificar integridade: contagem de tabelas e datasets
docker exec -i gti-fiscal-hub-postgres-1 psql -U gti -d gti_fiscal_test_restore -c "
SELECT count(*) AS total_datasets FROM datasets;
SELECT count(*) AS total_agents FROM agents;
SELECT count(*) AS total_installations FROM installations;
"
# Limpar o banco efêmero
docker exec -i gti-fiscal-hub-postgres-1 psql -U gti -d postgres -c "DROP DATABASE gti_fiscal_test_restore;"
```
Resultado esperado: comando finalizado com código de saída 0 e contagens idênticas às tabelas de produção.