AutoBackups/.docs/SPECIFICATION.md

259 lines
7.8 KiB
Markdown

# AutoBackups - Especificación Técnica Detallada
## Resumen Ejecutivo
AutoBackups es una aplicación Python que automatiza el backup de proyectos Simatic S7 y directorios definidos por el usuario, utilizando la API de Everything para búsqueda eficiente de archivos y un sistema de hash inteligente para evitar backups innecesarios.
## Arquitectura del Sistema
### 1. Componentes Principales
#### 1.1 Motor de Búsqueda (Everything API)
- **Librería**: PyEverything wrapper
- **DLL Local**: `Everything-SDK\dll\Everything64.dll`
- **Función**: Localizar archivos *.s7p en directorios de observación
- **Optimización**: Evitar último nivel del árbol para archivos .s7p
- **Ventaja**: Aprovecha el índice existente de Everything para búsquedas instantáneas
#### 1.2 Sistema de Hash en Dos Etapas
**Etapa 1**: Hash rápido de archivos *.s7p
- Solo verifica MD5 de (timestamp + tamaño) de archivos .s7p
- Si no hay cambios → no se procede con backup
- Si hay cambios → procede a Etapa 2
**Etapa 2**: Hash completo del proyecto
- Calcula MD5 de (timestamp + tamaño) de todos los archivos del directorio
- Compara con último hash almacenado
- Solo hace backup si hay diferencias
#### 1.3 Scheduler de Background
- **daily**: Una vez al día a hora configurada
- **hourly**: Cada hora
- **3-hour**: Cada 3 horas
- **7-hour**: Cada 7 horas
- **startup**: Al iniciar la aplicación
- **manual**: Solo bajo demanda del usuario
- **Escaneos**: Automáticos cada 1 hora
- **Backups**: Mínimo cada 10 minutos
- **Prioridad**: Baja prioridad de sistema
### 2. Estructura de Datos
#### 2.1 config.json (Configuración Global)
```json
{
"observation_directories": [
{
"path": "C:\\Projects\\Siemens",
"type": "siemens_s7",
"enabled": true
},
{
"path": "D:\\Engineering\\Projects",
"type": "siemens_s7",
"enabled": true
},
{
"path": "C:\\Important\\Docs",
"type": "manual",
"enabled": true
}
],
"backup_destination": "D:\\Backups\\AutoBackups",
"default_schedule": "daily",
"default_schedule_time": "02:00",
"retry_delay_hours": 1,
"web_interface": {
"host": "127.0.0.1",
"port": 5000
},
"logging": {
"level": "INFO",
"max_log_files": 30
}
}
```
#### 2.2 projects.json (Estado de Proyectos)
```json
{
"projects": [
{
"id": "project_001",
"name": "PLC_MainLine",
"path": "C:\\Projects\\Siemens\\PLC_MainLine",
"type": "siemens_s7",
"s7p_file": "C:\\Projects\\Siemens\\PLC_MainLine\\PLC_MainLine.s7p",
"schedule": "daily",
"schedule_time": "02:00",
"enabled": true,
"last_backup": "2025-09-01T02:15:30",
"last_s7p_hash": "abc123def456",
"last_full_hash": "def789ghi012",
"last_s7p_timestamp": "2025-08-31T14:30:00",
"status": "ready",
"retry_count": 0,
"next_retry": null,
"error_message": null
}
]
}
```
### 3. Flujo de Operación
#### 3.1 Inicio de Aplicación
1. Cargar configuración desde `config.json`
2. Cargar estado de proyectos desde `projects.json`
3. Inicializar logger con timestamp de inicio
4. Escanear directorios de observación usando Everything API
5. Actualizar lista de proyectos detectados
6. Iniciar scheduler
7. Iniciar interfaz web Flask
#### 4.2 Proceso de Backup
1. **Verificación de Espacio**: Verificar mínimo 100MB libres
2. **Verificación de Acceso .s7p**: Intentar comprimir solo archivo .s7p
3. **Hash Etapa 1**: Verificar MD5 de (timestamp + tamaño) del archivo .s7p
4. **Hash Etapa 2**: Si Etapa 1 detecta cambios, verificar hash completo
5. **Compresión**: Crear archivo ZIP con estructura específica preservada
6. **Almacenamiento**: Guardar en `backup_destination/ProjectPath/YYYY-MM-DD/HH-MM-SS_projects.zip`
7. **Actualización**: Actualizar hashes y timestamps en `projects.json`
#### 3.3 Gestión de Errores
- **Archivos en uso**: Marcar proyecto para reintento en 1 hora
- **Errores de permisos**: Log de error y notificación en interfaz
- **Errores de espacio**: Verificar espacio disponible antes de backup
### 4. Interfaz Web
#### 4.1 Dashboard Principal
- **Lista de Proyectos**: Tabla con estado, último backup, próximo backup
- **Controles Globales**: Backup manual global, pausar/reanudar scheduler
- **Estadísticas**: Total de proyectos, backups exitosos, errores
#### 4.2 Configuración de Proyectos
- **Habilitación/Deshabilitación**: Toggle por proyecto
- **Configuración de Schedule**: Dropdown con opciones de frecuencia
- **Backup Manual**: Botón de backup inmediato por proyecto
#### 4.3 Logs y Monitoreo
- **Log Viewer**: Mostrar logs recientes con filtros por nivel
- **Estado del Sistema**: Información de Everything API, espacio en disco
### 5. Estructura de Backup
#### 5.1 Nomenclatura de Archivos (Estructura Específica)
```
backup_destination/
├── LineA/
│ └── Project1/
│ ├── 2025-09-01/
│ │ ├── 02-15-30_projects.zip
│ │ └── 14-30-15_projects.zip
│ └── 2025-09-02/
│ └── 02-15-45_projects.zip
└── LineB/
└── Project2/
└── 2025-09-01/
└── 08-20-10_projects.zip
```
#### 5.2 Contenido del ZIP
```
02-15-30_projects.zip
└── LineA/
└── Project1/
├── project.s7p
├── subfolder1/
└── subfolder2/
```
### 6. Tecnologías y Librerías
#### 6.1 Python Core
- **Python**: 3.12
- **Framework Web**: Flask
- **Scheduler**: APScheduler
- **Compresión**: zipfile (biblioteca estándar)
#### 6.2 Librerías Específicas
- **Everything API**: PyEverything wrapper con DLL local
- **Hashing**: hashlib MD5 para (timestamp + tamaño)
- **Config**: json (biblioteca estándar)
- **Logging**: logging (biblioteca estándar)
- **File Access Check**: Intento de compresión + verificación .s7p
- **Process Priority**: pywin32 para baja prioridad
- **Disk Space**: psutil para monitoreo de espacio libre
#### 6.3 Frontend
- **HTML/CSS/JavaScript**: Vanilla (sin React por simplicidad)
- **AJAX**: Para comunicación con Flask API
- **Bootstrap**: Para estilizado responsivo
### 7. Consideraciones de Seguridad
#### 7.1 Acceso a Archivos
- Verificación de permisos antes de backup
- Manejo seguro de rutas para evitar path traversal
- Logs de todos los accesos a archivos
#### 7.2 Interfaz Web
- Solo acceso local (127.0.0.1)
- No autenticación requerida (uso local únicamente)
- Validación de inputs en formularios
### 8. Logging y Monitoreo
#### 8.1 Estructura de Logs
```
.logs/
├── autobackups_2025-09-01_08-30-15.log
├── autobackups_2025-09-02_08-30-22.log
└── ...
```
#### 8.2 Niveles de Log
- **INFO**: Inicio/fin de backups, descubrimiento de proyectos
- **WARNING**: Archivos en uso, reintentos
- **ERROR**: Fallos de backup, errores de configuración
- **DEBUG**: Detalles de hashes, operaciones de archivos
### 9. Instalación y Despliegue
#### 9.1 Entorno Miniconda
```bash
conda create --name autobackups python=3.12
conda activate autobackups
pip install -r requirements.txt
```
#### 9.2 Ejecución
- **Desarrollo**: `python src/app.py`
- **Producción**: `pythonw.exe src/app.py` (sin consola)
- **Como servicio**: Futuro enhancement con `python-windows-service`
### 10. Roadmap de Desarrollo
#### Fase 1: Core Backend
- [ ] Integración con Everything API
- [ ] Sistema de hash en dos etapas
- [ ] Motor de backup básico
- [ ] Scheduler con APScheduler
#### Fase 2: Interfaz Web
- [ ] Dashboard básico con Flask
- [ ] API REST para operaciones CRUD
- [ ] Frontend con HTML/JS/Bootstrap
#### Fase 3: Características Avanzadas
- [ ] Logs web viewer
- [ ] Configuración avanzada de directorios
- [ ] Estadísticas y reportes
#### Fase 4: Optimizaciones
- [ ] Ejecución como servicio Windows
- [ ] Notificaciones por email
- [ ] Backup incremental
Este documento será la base para el desarrollo del proyecto AutoBackups.