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