# 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**: ```powershell # 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: ```sql 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`: ```python # 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: ```powershell # 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): ```powershell # 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**: ```powershell # 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: ```python # 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: ```powershell # 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: ```powershell # 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`: ```python 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): ```powershell # 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: ```powershell # Elevar prioridad del proceso Python Get-Process python | ForEach-Object { $_.PriorityClass = 'AboveNormal' } ``` **O en código**: Modificar `runner.py`: ```python 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: ```powershell # 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: - [README.md](README.md) - Documentación completa - [QUICKSTART.md](QUICKSTART.md) - Guía rápida