Initial commit: CloudRestoreAS v1.0.0 - Aplicación completa de restauración automática SQL Server

This commit is contained in:
2026-01-25 16:53:00 -07:00
commit 854ffa116f
43 changed files with 6357 additions and 0 deletions

322
ADVANCED.md Normal file
View File

@@ -0,0 +1,322 @@
# 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