Files
GTI_GERENCIADOR_FISCAL/fiscal/docs/RUNBOOK_DR_HUB.md
T
gti d21a9d1140 Add 'fiscal/' from commit '102ba84500dbd9655a0471288c3e278652593ca9'
git-subtree-dir: fiscal
git-subtree-mainline: d95165fc8f
git-subtree-split: 102ba84500
2026-09-29 14:43:23 -03:00

4.6 KiB

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:

/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

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)

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

# 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

# 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

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:

# 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.