Documenta scelte tecniche e problemi risolti

This commit is contained in:
2026-07-02 14:01:53 +02:00
parent 32d7312240
commit 6b356e8983
3 changed files with 609 additions and 34 deletions

View File

@@ -33,7 +33,6 @@ Il servizio Windows deve:
- filtrare gli eventi in base alle estensioni configurate;
- applicare esclusioni di directory e pattern;
- registrare i file cambiati in un registro persistente;
- mantenere un log giornaliero delle operazioni;
- mantenere un log giornaliero delle operazioni.
Il servizio watchdog non deve controllare la raggiungibilita' del server di backup. Questo controllo deve essere gestito da Task Scheduler tramite notifier separato, in modo da poter mostrare avvisi nella sessione utente senza accoppiare il servizio a interfacce grafiche.
@@ -52,12 +51,12 @@ La tray app deve:
- numero di file in attesa di backup;
- ultimo backup eseguito;
- offrire almeno la voce di menu `Backup e spegni`;
- eseguire il backup tramite `rsync`;
- eseguire il backup tramite `robocopy` verso share SMB Windows;
- scrivere un log giornaliero dedicato;
- spegnere il computer solo se il backup termina correttamente;
- segnalare eventuali errori senza spegnere il computer.
La tray app e' il componente piu' adatto per eseguire `rsync` e richiedere lo spegnimento, perche' queste sono azioni esplicite dell'utente.
La tray app e' il componente piu' adatto per eseguire il backup manuale e richiedere lo spegnimento, perche' queste sono azioni esplicite dell'utente. La stessa logica puo' essere richiamata senza GUI da Task Scheduler.
La stessa logica di backup deve essere disponibile anche senza interfaccia grafica, tramite opzione `--nogui`, per permettere l'esecuzione da Task Scheduler alla disconnessione o fine sessione. In modalita' no-GUI non devono comparire icone tray o finestre di messaggio: gli errori devono essere registrati nei log e il processo deve restituire un codice di uscita diverso da zero.
@@ -72,7 +71,7 @@ La GUI di configurazione deve permettere di:
- gestire directory e pattern esclusi;
- configurare il server remoto;
- configurare la destinazione del backup;
- configurare il comando o percorso di `rsync`;
- configurare il comando o percorso di `robocopy`;
- visualizzare lo stato corrente;
- aprire i log giornalieri;
- eventualmente eseguire un test di raggiungibilita' del server;
@@ -107,7 +106,7 @@ Flusso previsto:
3. La tray app verifica che il server sia raggiungibile.
4. La tray app legge il registro dei file cambiati.
5. La tray app controlla che i file da copiare siano stabili.
6. La tray app esegue `rsync`.
6. La tray app esegue `robocopy`.
7. La tray app registra l'esito nel log.
8. Se il backup e' riuscito, la tray app pulisce o archivia il registro dei cambiamenti.
9. Se il backup e' riuscito, la tray app spegne il computer.
@@ -159,7 +158,7 @@ I log devono includere:
- eventi ignorati e motivo;
- errori di accesso a file o directory;
- risultato dei test di raggiungibilita' del server;
- comando `rsync` eseguito, senza password o segreti;
- comando `robocopy` eseguito, senza password o segreti;
- esito del backup;
- richiesta di spegnimento;
- eventuale annullamento dello spegnimento per errore.
@@ -171,7 +170,6 @@ Il sistema deve verificare periodicamente se il server remoto e' raggiungibile.
Controlli possibili:
- ping ICMP, se abilitato nella rete;
- apertura porta SSH, se si usa `rsync` via SSH;
- controllo percorso SMB, se il backup usa una share Windows;
- comando di test configurabile.
@@ -341,7 +339,7 @@ Il file di configurazione dovra' definire almeno:
- server di backup;
- destinazione remota;
- modalita' di test del server;
- percorso o comando `rsync`;
- percorso o comando `robocopy`;
- comportamento in caso di errore;
- comportamento di spegnimento;
- posizione dei log;
@@ -388,13 +386,16 @@ watch:
- "*.part"
backup:
engine: "robocopy"
server_host: "backup-server"
server_check:
type: "tcp"
port: 22
interval_seconds: 300
rsync_path: "rsync"
remote_destination: "utente@backup-server:/backup/bak-rest/"
type: "share"
port: 445
interval_seconds: 1800
robocopy_path: "robocopy"
remote_destinations:
- "\\\\backup-server\\BakRest1"
- "\\\\backup-server\\BakRest2"
shutdown_on_success: true
shutdown_command: "shutdown /s /t 0"
@@ -418,7 +419,7 @@ Librerie candidate:
- `customtkinter` per la GUI di configurazione;
- `PyYAML` o `tomllib`/`tomli-w` per la configurazione;
- `sqlite3` standard library per il registro cambiamenti;
- `subprocess` per eseguire `rsync`;
- `subprocess` per eseguire `robocopy`;
- `robocopy` come motore predefinito per share SMB Windows;
- `logging` standard library per i log giornalieri.
@@ -441,25 +442,29 @@ dist/
## Decisioni aperte
- Scegliere formato definitivo della configurazione: YAML, TOML o JSON.
- Scegliere formato definitivo del registro cambiamenti: testo, JSON Lines o SQLite.
- Definire se il backup remoto avverra' via SSH, SMB, altro protocollo o percorso montato.
- Definire quale distribuzione di `rsync` usare su Windows.
- Definire il packaging finale di `robocopy`/Python dentro gli eseguibili o installer.
- Definire come installare e aggiornare il servizio Windows.
- Definire come gestire credenziali e segreti senza scriverli in chiaro nei log.
- Definire se creare un installer unico o distribuire gli eseguibili con script di installazione.
- Definire se prevedere backup versionato o solo mirror.
- Definire politica per cancellazioni: propagare la cancellazione sul backup o conservarla.
- Definire comportamento in caso di file non copiabili.
- Definire se aggiungere una modalita' audit per scoprire cartelle di lavoro candidate.
Decisioni gia' chiuse durante la prima implementazione:
- Configurazione in TOML.
- Registro cambiamenti in SQLite.
- Backup remoto via share SMB Windows.
- Motore backup predefinito `robocopy`.
- Cancellazioni master non propagate allo slave.
## Principi guida
- Non monitorare l'intero computer senza limiti espliciti.
- Preferire directory incluse esplicitamente.
- Applicare esclusioni conservative.
- Non affidarsi solo alle Raccolte Windows.
- Non reimplementare `rsync` in Python.
- Non reimplementare `robocopy` o la copia incrementale in Python quando il sistema operativo fornisce gia' uno strumento robusto.
- Separare servizio watchdog, tray app e GUI di configurazione.
- Spegnere il computer solo dopo un backup riuscito.
- Scrivere log chiari e giornalieri.