[A04.P006] Integración de Backups DASUTEN en bkps.rb

Implementada integración del pipeline de backups DASUTEN dentro del
sistema unificado de bkps.rb siguiendo el principio "Menos es Más".

Cambios realizados:
- Nuevo procesador: adn/tools/bkps/lib/proc_dasuten.rb
  - Mapea tareas a drones atómicos existentes
  - Ejecuta vía dron lanzar con bitácora automática

- bkps.yml: T8-T15 (tareas) + C7-C8 (comandos)
  - dasuten_export_full/dif (exportar)
  - dasuten_transferir/upload/download (transitar)
  - dasuten_restaurar_full/dif (restaurar)
  - dasuten_verificar (integridad)

- Documentación actualizada:
  - A04.P006_Backups-DASUTEN.md (nuevo plan)
  - A04_dtic-DASUTEN.md (plan agregado)
  - A03_dtic-BKPs.md (comandos DASUTEN)
  - IA.md (lección aprendida)

Comandos disponibles:
  ./adn/tools/run bkps run dasuten_full        # Semanal (~35-40 min)
  ./adn/tools/run bkps run dasuten_diferencial # Diario (~5-10 min)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Ricardo Monla
2026-04-14 17:34:17 -03:00
co-authored by Claude Opus 4.6
parent fe3dcec7e9
commit 358cee8e9a
7 changed files with 431 additions and 2 deletions
+2
View File
@@ -58,6 +58,8 @@ El ámbito **dtic-BKPs** engloba todas las operaciones de respaldo (backup), pro
| `full_procesamiento` | Procesar TODOS los BKPs | proc_syncXen1 → proc_syncPmox |
| `full_upload` | Subir todos los BKPs a la Nube | sync_BkpAntiguos, sync_BkpsSERVIDORes, sync_BkpUsers |
| `full_full` | Procesar y Subir todo | Todas las tareas |
| `dasuten_full` | 🔄 Pipeline COMPLETO DASUTEN (semanal) | dasuten_export_full → transferir → upload → download → restaurar_full → verificar |
| `dasuten_diferencial` | 🔄 Pipeline DIFERENCIAL DASUTEN (diario) | dasuten_export_dif → transferir → upload → download → restaurar_dif → verificar |
## Flujo de Trabajo Típico
@@ -0,0 +1,213 @@
# Plan: Backups y Refresco de Base de Datos DASUTEN
> **Ámbito:** A04 — dtic-DASUTEN
**Código:** A04.P006
**Fecha:** 14 de abril de 2026
**Autor:** Sistema ADN
**Versión:** 1.0
**Estado:** 🚧 EN EJECUCIÓN (Pipeline diferencial implementado, pendiente integración bkps)
**Dependencia:** A04.P005 (DASUTEN sin DC), A03.P002 (Automatización Backups)
## 📊 Progreso
| Fase | Estado | Avance |
|------|--------|--------|
| **Fase 1: Backup de VMs** | ✅ Completado | 100% |
| **Fase 2: Pipeline Google Drive** | ✅ Completado | 100% |
| **Fase 3: Pipeline Diferencial** | ✅ Completado | 100% |
| **Fase 4: Integración BKPs** | ✅ Completado | 100% |
## 🎯 Objetivo
Establecer un sistema de backups y refrescos de la base de datos DASUTEN que permita:
1. **Resguardar VMs** del ámbito mediante vzdump (Proxmox)
2. **Refrescar la BD** desde el servidor original (`srvv-fenix`) hacia `dasu-sql4`
3. **Automatizar el pipeline** mediante drones atómicos integrados en `bkps.rb`
4. **Soportar modos completo y diferencial** según frecuencia requerida
## 🌐 Arquitectura del Pipeline
### Flujo Completo (Semanal/Mensual)
```
srvv-fenix (SQL Server)
↓ BACKUP DATABASE WITH COMPRESSION
E:\BK_SQL\sysdasuten_compressed_ADN.bak (~1.3 GB)
↓ SMB (smbclient)
srv-ns8 (/var/tmp/)
↓ rclone upload
Google Drive (drive_bkps-dasu)
↓ HTTP Download (Invoke-WebRequest)
dasu-sql4 (F:\BACKUP\)
↓ RESTORE DATABASE WITH REPLACE
sysdasuten ONLINE
```
**Duración estimada:** ~35-40 minutos total
### Flujo Diferencial (Diario)
```
srvv-fenix (SQL Server)
↓ BACKUP DATABASE WITH DIFFERENTIAL
E:\BK_SQL\sysdasuten_DIF_YYYYMMDD_HHMMSS.bak (~0.4-10 MB)
↓ SMB (smbclient)
srv-ns8 (/var/tmp/)
↓ rclone upload
Google Drive (drive_bkps-dasu)
↓ HTTP Download (Invoke-WebRequest)
dasu-sql4 (F:\BACKUP\)
↓ RESTORE DATABASE WITH DIFFERENTIAL
sysdasuten ONLINE
```
**Duración estimada:** ~5-10 minutos total
## 📋 Tareas Configuradas (bkps.yml)
### Tareas Individuales
| ID | Descripción | Tipo | Nodo |
|----|-------------|------|------|
| `dasuten_export_full` | 📤 Exportar backup COMPLETO DASUTEN | dasuten | srvv-fenix |
| `dasuten_export_dif` | 📤 Exportar backup DIFERENCIAL DASUTEN | dasuten | srvv-fenix |
| `dasuten_transferir` | 🔄 Transferir SMB (fenix → ns8) | dasuten | srv-ns8 |
| `dasuten_upload` | ☁️ Upload a Google Drive | dasuten | srv-ns8 |
| `dasuten_download` | 📥 Download desde Google Drive | dasuten | dasu-sql4 |
| `dasuten_restaurar_full` | 💾 Restaurar backup COMPLETO | dasuten | dasu-sql4 |
| `dasuten_restaurar_dif` | 💾 Restaurar backup DIFERENCIAL | dasuten | dasu-sql4 |
| `dasuten_verificar` | ✅ Verificar integridad BD | dasuten | dasu-sql4 |
### Comandos Compuestos
| ID | Descripción | Tareas | Frecuencia |
|----|-------------|--------|------------|
| `dasuten_full` | 🔄 Pipeline COMPLETO DASUTEN | export_full → transferir → upload → download → restaurar_full → verificar | Semanal |
| `dasuten_diferencial` | 🔄 Pipeline DIFERENCIAL DASUTEN | export_dif → transferir → upload → download → restaurar_dif → verificar | Diario (lun-vie) |
## 🛸 Drones Atómicos Implementados
| Dron | Script | Nodo | Función | Output JSON |
|------|--------|------|---------|-------------|
| `exportar` | `dasuten_exportar_srvv-fenix.rb` | srvv-fenix | BACKUP DATABASE COMPRESSION | `backup_ruta`, `backup_tipo` |
| `exportar_dif` | `dasuten_exportar_diferencial_srvv-fenix.rb` | srvv-fenix | BACKUP DATABASE DIFFERENTIAL | `backup_ruta`, `backup_tipo` |
| `transferir` | `dasuten_transferir_srvv-fenix-srv-ns8.rb` | srv-ns8 | SMB get | `backup_local` |
| `upload` | `dasuten_upload_srv-ns8-drive.rb` | srv-ns8 | rclone copy | `drive_ruta`, `drive_url` |
| `download` | `dasuten_download_drive-dasu-sql4.rb` | dasu-sql4 | Invoke-WebRequest | `backup_local`, `duracion` |
| `restaurar` | `dasuten_restaurar_dasu-sql4.rb` | dasu-sql4 | RESTORE DATABASE | `estado_integridad` |
| `restaurar_dif` | `dasuten_restaurar_diferencial_dasu-sql4.rb` | dasu-sql4 | RESTORE DATABASE DIFFERENTIAL | `estado_integridad` |
| `verificar` | `dasuten_verificar-integridad_dasu-sql4.rb` | dasu-sql4 | DBCC CHECKDB | `estado_integridad` |
### Orquestadores
| Script | Función | Uso |
|--------|---------|-----|
| `orquestador_pipeline.rb` | Pipeline completo | `ruby orquestador_pipeline.rb` |
| `orquestador_pipeline_diferencial.rb` | Pipeline diferencial | `ruby orquestador_pipeline_diferencial.rb --paso upload` |
## 🔧 Integración con BKPs (IMPLEMENTADO)
### Procesador: `adn/tools/bkps/lib/proc_dasuten.rb`
El procesador `Dasuten` fue integrado en `bkps.rb` como un nuevo tipo de tarea:
```ruby
'dasuten' => -> (log) { BKPs::Procesador::Dasuten.new(log) }
```
**Funcionamiento:**
1. Cada tarea DASUTEN se mapea a un script de dron atómico
2. El dron se lanza vía `./adn/tools/run dron lanzar`
3. La bitácora se registra automáticamente con el nodo y ámbito correspondiente
4. El output de cada dron se guarda en `/tmp/dron_*_output.json` para el siguiente paso
### Comandos disponibles (vía bkps.rb)
```bash
# Pipeline completo (semanal - ~35-40 min)
./adn/tools/run bkps run dasuten_full
# Pipeline diferencial (diario - ~5-10 min)
./adn/tools/run bkps run dasuten_diferencial
# Tareas individuales
./adn/tools/run bkps run dasuten_export_full # Solo exportar completo
./adn/tools/run bkps run dasuten_export_dif # Solo exportar diferencial
./adn/tools/run bkps run dasuten_transferir # Solo transferir SMB
./adn/tools/run bkps run dasuten_upload # Solo upload Drive
./adn/tools/run bkps run dasuten_download # Solo download Drive
./adn/tools/run bkps run dasuten_restaurar_full # Solo restore completo
./adn/tools/run bkps run dasuten_restaurar_dif # Solo restore diferencial
./adn/tools/run bkps run dasuten_verificar # Solo verificar integridad
# Con dry-run (simulación)
./adn/tools/run bkps run dasuten_full --dry-run
# Con modo batch (sin interacción, para cron)
./adn/tools/run bkps run dasuten_diferencial --batch
```
### Frecuencias recomendadas
| Comando | Frecuencia | Horario | Duración |
|---------|------------|---------|----------|
| `dasuten_full` | Semanal (lunes 08:00) | Inicio jornada | ~35-40 min |
| `dasuten_diferencial` | Diario (lun-vie 08:00) | Inicio jornada | ~5-10 min |
## 📅 Frecuencia de Backups
| Tipo | Frecuencia | Retención | Horario |
|------|------------|-----------|---------|
| **VMs (vzdump)** | Semanal (domingo 03:00) | 4 semanas | Madrugada |
| **BD Completo** | Semanal (lunes 08:00) | 4 semanas | Inicio jornada |
| **BD Diferencial** | Diario (lun-vie 08:00) | 5 días | Inicio jornada |
## 📊 Resultados Históricos
| Fecha | Tipo | Duración | Tamaño | Estado |
|-------|------|----------|--------|--------|
| 2026-04-14 15:54 | Completo | 44.8s | 1.33 GB | ✅ |
| 2026-04-14 16:03 | Diferencial | 2.44s | 0.39 MB | ✅ |
| 2026-04-14 16:35 | Upload Drive | 23.79s | 0.39 MB | ✅ |
## ⚠️ Consideraciones Técnicas
### Google Drive Download
- **Virus confirmation page:** Archivos >100MB requieren confirmación. Se maneja extrayendo parámetros `id`, `uuid`, `confirm` del HTML.
- **URL confirmada:** `https://drive.usercontent.google.com/download?id=...&confirm=...&uuid=...`
### dasu-sql4 Sleep Mode
- La VM entra en suspensión cuando no se usa.
- **Solución:** Acceso vía relay SSH desde `srv-dasu` con `sshpass` + ProxyCommand.
### Base64 Encoding
- Scripts PowerShell se codifican en base64 para transporte sobre SSH.
- Evita problemas de escaping UTF-8 en Windows Core.
### Comunicación entre Drones
- Cada dron escribe output en `/tmp/dron_*_output.json`
- El siguiente dron lee el JSON del anterior para obtener contexto
- Formato: `{"paso": "...", "backup_local": "...", "duracion": N, ...}`
## 🔗 Referencias
- **Ámbito A03:** [A03_dtic-BKPs.md](../dtic-BKPs/A03_dtic-BKPs.md)
- **Ámbito A04:** [A04_dtic-DASUTEN.md](A04_dtic-DASUTEN.md)
- **Pipeline Diferencial:** [A04.P005_DASUTEN-sin-DC.md](A04.P005_DASUTEN-sin-DC.md#fase-8b-refresco-final-de-bd)
- **Drones:** `adn/tools/cli/drones/`
- **Bitácoras:** `./adn/tools/run db evento:listar --ambito dtic-DASUTEN`
## 📝 Lecciones Aprendidas
| Fecha | Lección | Impacto |
|-------|---------|---------|
| 2026-04-14 | SMB password con `$` requiere escape (`\\$`) | Transferencia fallida sin escape |
| 2026-04-14 | Upload dron debe leer `backup_local` desde transfer output | Timeout por archivo incorrecto |
| 2026-04-14 | Download dron requiere `--file-id` o leer desde upload output | Error por falta de parámetro |
| 2026-04-14 | Pipeline diferencial: 0.39 MB vs 1.3 GB completo | 90% más rápido para refrescos diarios |
@@ -135,6 +135,7 @@ Este ámbito cubre:
| [A04.P003](A04.P003_AD-Join.md) | Unión de pc-dasu0 al Dominio | ⏸️ (Pausado — enfoque cambiado) |
| [A04.P004](A04.P004_Unificacion-Redes-ISP.md) | Unificación de Redes: Subred ISP | ⏸️ (Pausado — enfoque cambiado) |
| [A04.P005](A04.P005_DASUTEN-sin-DC.md) | DASUTEN sin Domain Controller | 🚧 En Ejecución |
| [A04.P006](A04.P006_Backups-DASUTEN.md) | Backups y Refresco de Base de Datos | 🚧 En Ejecución |
## 🛸 Sistema de Drones (Operación Autónoma)