Files
CloudRecoveryAS/ADVANCED.md

8.2 KiB

CloudRestoreAS - Configuración Avanzada

Escenarios Avanzados

1. Múltiples Bases de Datos

Configura un nodo por cada base de datos:

Nodo 1:
- Nombre: BACKUP_VENTAS.ZIP
- DB: Ventas_DB

Nodo 2:
- Nombre: BACKUP_INVENTARIO.ZIP
- DB: Inventario_DB

Nodo 3:
- Nombre: BACKUP_CONTABILIDAD.ZIP
- DB: Contabilidad_DB

2. Procesamiento Concurrente

Para procesar múltiples restauraciones simultáneamente:

Configuración → Concurrencia:

  • Extract Workers: 2-3 (dependiendo de CPU/disco)
  • Restore Workers: 1 (recomendado para no saturar SQL)

Nota: Solo aumenta restore_workers si:

  • Tienes múltiples discos para SQL Server
  • CPU y RAM suficientes
  • Restauras a bases de datos diferentes en instancias SQL diferentes

3. Archivos ZIP Multipart Grandes

Para archivos de varios GB divididos en partes:

Carpeta Entrada:
  ├── BACKUP_GRANDE.ZIP.001
  ├── BACKUP_GRANDE.ZIP.002
  ├── BACKUP_GRANDE.ZIP.003
  └── BACKUP_GRANDE.ZIP.004

Configuración:
- Timeout Extracción: 60-120 min (dependiendo del tamaño)
- Carpeta Extracción: En disco con suficiente espacio

Proceso:

  1. Coloca el .001 en la carpeta de entrada
  2. Las demás partes deben estar en la misma carpeta
  3. 7-Zip detectará y extraerá todas las partes automáticamente

4. Marcador .ready para Archivos Grandes

Si copias archivos muy grandes que tardan en transferirse:

Configuración → Estabilidad:

  • ✓ Usar Marcador .ready
  • Duración Estable: 5s (puede ser menor con marcador)

Uso:

# Copia el archivo
Copy-Item "BACKUP.ZIP" "C:\Backups\Entrada\"

# Una vez completado, crea el marcador
New-Item "C:\Backups\Entrada\BACKUP.ZIP.ready" -ItemType File

5. Modo Dry Run para Pruebas

Para probar sin ejecutar restauraciones reales:

Configuración → Características:

  • ✓ Modo Dry Run

Comportamiento:

  • Extrae el ZIP normalmente
  • Ejecuta FILELISTONLY
  • Genera el SQL de RESTORE pero NO lo ejecuta
  • Registra el SQL generado en los steps
  • Útil para validar estructura sin afectar SQL Server

6. SQL Server Remoto

Para restaurar en un servidor SQL remoto:

Configuración → SQL Server:

  • Servidor: 192.168.1.100 o SQLSERVER01
  • Carpeta Data SQL: Ruta UNC o local del servidor remoto
    • Ejemplo: \\SQLSERVER01\C$\SQLData o configurar localmente en el servidor

Consideraciones:

  • Asegúrate de que el puerto 1433 esté abierto
  • Usa SQL Auth o cuenta de servicio con permisos
  • La carpeta de datos debe ser accesible

7. Múltiples Instancias SQL

Para diferentes nodos en diferentes instancias:

Limitación Actual: La app solo soporta una conexión SQL configurada.

Workaround:

  • Configura la instancia principal
  • Usa vistas/linked servers para redireccionar
  • O ejecuta múltiples instancias de la app (cada una con su propia config)

8. Permisos Mínimos SQL

Script para crear usuario con permisos mínimos:

USE [master];
GO

-- Crear login
CREATE LOGIN [CloudRestoreUser] WITH PASSWORD = 'YourStrongP@ssw0rd';
GO

-- Otorgar permisos de servidor
ALTER SERVER ROLE [dbcreator] ADD MEMBER [CloudRestoreUser];
GO

-- Permisos adicionales para ALTER DATABASE
GRANT ALTER ANY DATABASE TO [CloudRestoreUser];
GO

-- Si necesitas crear carpetas de datos
-- (opcional, solo si SQL Server corre con otra cuenta)
-- Dar permisos de escritura en carpetas de datos a nivel Windows

9. Rotación de Logs Personalizada

Edita app/utils/logger.py:

# Cambiar parámetros de RotatingFileHandler
file_handler = RotatingFileHandler(
    log_path,
    maxBytes=50 * 1024 * 1024,  # 50MB en lugar de 10MB
    backupCount=20,              # 20 archivos en lugar de 10
    encoding='utf-8'
)

10. Verificación de Espacio en Disco

Recomendación: Antes de procesar, verifica espacio:

# Script PowerShell para verificar espacio
$disk = Get-PSDrive C
$freeGB = [math]::Round($disk.Free / 1GB, 2)

if ($freeGB -lt 50) {
    Write-Warning "Espacio bajo: $freeGB GB libres"
}

Futura Mejora: Agregar verificación automática en el motor.

11. Limpieza Automática de Archivos Procesados

Por defecto, los archivos procesados se acumulan en Procesados/.

Script de limpieza (ejecutar manualmente o con Task Scheduler):

# Eliminar archivos procesados más antiguos que 30 días
$days = 30
$processedPath = "C:\Backups\Procesados"

Get-ChildItem $processedPath -Recurse -File | 
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$days) } |
    Remove-Item -Force

12. Backup de la Base de Datos SQLite

La base de datos SQLite contiene todo el historial y configuración.

Backup Automático:

# Script para backup diario
$source = "C:\Aduanasoft\CloudRestoreAs\data\app.db"
$backup = "C:\Backups\DB_Backups\app_$(Get-Date -Format 'yyyyMMdd').db"

Copy-Item $source $backup

13. Notificaciones por Email

Futura Mejora: Integrar notificaciones por email.

Workaround Actual: Monitorear tabla events con script externo:

# monitor_events.py
from app.db.event_repository import EventRepository
import smtplib

events = EventRepository.get_all(level="ERROR", limit=10)
if events:
    # Enviar email con eventos de error
    send_email("Errores en CloudRestoreAS", str(events))

14. Integración con Task Scheduler

Para iniciar automáticamente al arrancar Windows:

# Crear tarea programada
$action = New-ScheduledTaskAction -Execute "C:\Aduanasoft\CloudRestoreAs\venv\Scripts\python.exe" -Argument "C:\Aduanasoft\CloudRestoreAs\runner.py"
$trigger = New-ScheduledTaskTrigger -AtLogon
$principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType Interactive
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries

Register-ScheduledTask -TaskName "CloudRestoreAS" -Action $action -Trigger $trigger -Principal $principal -Settings $settings

15. Monitoreo con PowerShell

Script para consultar estado:

# monitor_status.ps1
$dbPath = "C:\Aduanasoft\CloudRestoreAs\data\app.db"

# Usando sqlite3 CLI (si está instalado)
sqlite3 $dbPath "SELECT status, COUNT(*) FROM jobs GROUP BY status;"

# O importar módulo de Python
python -c "from app.db.job_repository import JobRepository; print(JobRepository.get_stats())"

16. Reintentos Automáticos

Configurado pero no en UI actualmente:

En app/constants.py:

DEFAULT_CONFIG = {
    "retries": {
        "max_attempts": 3,      # Máximo 3 intentos
        "retry_delay_seconds": 60  # Esperar 60s entre intentos
    }
}

Para implementar: Agregar lógica en el worker para reintentar jobs fallados.

17. Archivos con Caracteres Especiales

La aplicación maneja correctamente:

  • Rutas con espacios
  • Caracteres Unicode
  • Rutas largas (> 260 caracteres en Windows 10+)

Configuración Windows (si tienes problemas con rutas largas):

# Habilitar rutas largas en Windows 10+
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force

18. Prioridad de Procesos

Para dar más recursos a la app en servidor ocupado:

# Elevar prioridad del proceso Python
Get-Process python | ForEach-Object { $_.PriorityClass = 'AboveNormal' }

O en código: Modificar runner.py:

import psutil
import os

# Al inicio
p = psutil.Process(os.getpid())
p.nice(psutil.HIGH_PRIORITY_CLASS)

Variables de Entorno

Para configuración avanzada sin UI:

# Configurar path de base de datos
$env:CLOUDRESTORE_DB_PATH = "D:\CustomData\app.db"

# Modo debug
$env:CLOUDRESTORE_DEBUG = "1"

Performance Tips

  1. Disco: Usa SSD para carpeta de extracción
  2. SQL Server: Configura max degree of parallelism apropiadamente
  3. Workers: No exceder núcleos CPU / 2
  4. Logs: Si no necesitas logs detallados, cambia nivel a WARNING

Seguridad

  1. Passwords: Cifrados con DPAPI, vinculados al usuario/máquina
  2. Permisos: Ejecutar con cuenta de servicio dedicada
  3. Carpetas: Restringir acceso a carpetas configuradas
  4. SQL: Usar Windows Auth cuando sea posible

Para más información, consulta: