Files
s3_to_folder_sync/CHANGELOG.md

209 lines
5.4 KiB
Markdown

# S3-to-Local Sync Dashboard - Multi-Sync Support
## 🎉 Nuove Funzionalità (18 Marzo 2026)
### 1. **Non invia le notifiche Gotify** ✅ RISOLTO
- **Problema**: La funzione `gotify_send()` aveva un'escaping JSON incorretto
- **Soluzione**:
- Aggiunto `jq` al Dockerfile per proper JSON encoding
- Riscritto `gotify_send()` in `sync.sh` con corretto escaping dei caratteri speciali
- Aggiunta proper gestione degli errori con fallback a sed
### 2. **Multiple Associazioni Sync (1:1 Bucket:Cartella)** ✅ IMPLEMENTATO
- Ora supporta **multiple sync simultanee**
- Ogni sync ha:
- Identificatore univoco (`sync1`, `sync2`, etc.)
- Bucket S3 dedicato
- Cartella locale dedicata
- Directory di stato separata (`/data/state/sync1`, `/data/state/sync2`)
**Configurazione in `.env`:**
```bash
SYNC_CONFIGS='[
{"id": "sync1", "bucket": "backup-docs", "path": "/data/local1", "interval": 300},
{"id": "sync2", "bucket": "media-files", "path": "/data/local2", "interval": 600}
]'
```
### 3. **Interfaccia Dashboard Ridisegnata** ✅ IMPLEMENTATO
#### Tab Selector Dinamici
- Mostra un tab per ogni sync configurata
- Click per switchare tra sync
- Visualizza log e modifiche della sync selezionata
#### Grafica Responsiva e Dinamica
- **CSS Flexbox + Grid**: si adatta perfettamente al ridimensionamento della finestra
- **Breakpoint Mobile**: su schermi < 1200px, log e modifiche si impilano verticalmente
- **Performance**: auto-scroll, limite di 500 righe log, lazy loading
#### Organizzazione Pannelli
**PRIMA:**
```
Stats Cards (4)
Config
Log Panel (sx) | Modifiche Recenti (dx)
Storico
```
**ADESSO:**
```
Stats Cards (4)
Config
[TAB SELECTOR] sync1 | sync2 | sync3
Log (sopra) | Modifiche Recenti (destra)
Storico
```
### 4. **Visualizzazione Per-Sync** ✅ IMPLEMENTATO
Ogni sync mostra i suoi dati indipendenti:
- Status badge (Avvio, Sincronizzazione, Sincronizzato, Errore)
- Statistiche cartella locale
- Log in tempo reale (SSE stream dedicato)
- Modifiche recenti
- Storico sincronizzazioni
---
## 🚀 Come Usare
### Modalità Singola (Default - Compatibile)
```bash
# Nel .env, configure il bucket singolo
S3_BUCKET=my-bucket
# NON mettere SYNC_CONFIGS
# Avvio
docker-compose up -d
# La dashboard mostra una singola sync (nessun tab)
```
### Modalità Multi-Sync
```bash
# Nel .env:
SYNC_CONFIGS='[
{"id": "sync1", "bucket": "bucket-a"},
{"id": "sync2", "bucket": "bucket-b"},
{"id": "sync3", "bucket": "bucket-c"}
]'
# Nel docker-compose.yml, aggiungi i volumi per ogni sync:
volumes:
- ./data/sync1:/data/local
- ./data/sync2:/data/local2
- ./data/sync3:/data/local3
- sync-state:/data/state
```
Poi:
```bash
docker-compose up -d
```
La dashboard automaticamente:
1. Mostra tab per ogni sync
2. Lancia multiple istanze di `sync.sh` (una per bucket)
3. Visualizza log + modifiche per sync selezionata
---
## 📊 Struttura Nuova
### API Endpoints
| Endpoint | Descrizione |
|----------|-------------|
| `/api/syncs` | Lista di tutte le sync configurate |
| `/api/status/<sync_id>` | Stato di una specifica sync |
| `/api/stream/<sync_id>` | SSE stream log in tempo reale |
| `/api/changes/<sync_id>` | Modifiche recenti per una sync |
| `/api/history/<sync_id>` | Storico sincronizzazioni |
### Directory di Stato
```
/data/state/
├── sync1/
│ ├── sync.log
│ ├── status.json
│ ├── history.json
│ └── recent_changes.json
├── sync2/
│ ├── sync.log
│ ├── status.json
│ ├── history.json
│ └── recent_changes.json
└── ...
```
---
## 🔧 Note Tecniche
### entrypoint.sh
- **Singola sync**: Avvia 1 istanza di `sync.sh` (come prima)
- **Multi-sync**: Parsa JSON di `SYNC_CONFIGS`, crea directory di stato, lancia N istanze di `sync.sh` con `STATE_DIR` diversi
### sync.sh
- Accetta `STATE_DIR` come variabile d'ambiente
- Scrive log/status/modifiche nella directory assegnata
- `gotify_send()` ora ha proper JSON escaping
### app.py
- Carica configurazione da `SYNC_CONFIGS`
- Fallback a singola sync se `SYNC_CONFIGS` non è definito
- Routes parametriche con `<sync_id>`
### index.html
- CSS Grid + Flexbox per responsive design
- `switchSync(id)` per cambiare tab
- Mantiene stato separato per ogni sync
- Auto-update ogni 5-10-15s
---
## ✅ Checklist Implementazione
- [x] Notifiche Gotify - Fixed JSON escaping + jq
- [x] Multiple sync - Parsing SYNC_CONFIGS + multiple STATE_DIR
- [x] UI multi-tab - Switch dinamico tra sync
- [x] CSS responsivo - Flexbox/Grid con breakpoints
- [x] Log/Modifiche orizzontali - Layout a due colonne
- [x] Per-sync data - API routes con sync_id
- [x] Docker multi-sync - entrypoint con Python JSON parser
- [x] Compatibilità backward - Fallback a singola sync
---
## 🐛 Bug Risolti
1. **Notifiche Gotify non inviate**
- Causa: Escaping JSON non corretto in `printf`
- Fix: Uso di `jq` con proper escaping
2. **Grafica non responsiva**
- Causa: CSS max-width fisso, layout non flexible
- Fix: CSS Grid/Flexbox con responsive breakpoints
---
## 📝 Prossimi Miglioramenti Suggeriti
- [ ] API per aggiungere/rimuovere sync dinamicamente
- [ ] Statistiche aggregate di tutte le sync
- [ ] Throttling bandwidth globale (non per-sync)
- [ ] Health check per ogni sync
- [ ] Export dati sincronizzazioni in CSV
- [ ] Webhooks per sync completate
---
**Version**: 2.0.0 (Multi-Sync)
**Last Updated**: 18 Marzo 2026