109 lines
4.6 KiB
Markdown
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.
|