4.6 KiB
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:
gti_fiscal.dump: Dump binário consistente do banco PostgreSQL viapg_dump -Fc(formato customizado compactado).releases.tgz: Arquivo compactado contendo todos os instaladores e binários publicados do Agent Windows em/app/data/releases.hub.env: Arquivo de variáveis de ambiente e segredos de produção com permissão restritachmod 600.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.