323 lines
8.2 KiB
Markdown
323 lines
8.2 KiB
Markdown
# 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
|