Backup-AdHoc/readme.md
2025-11-21 11:04:20 +00:00

783 lines
26 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Manuale operativo AdHoc Backup (GUI + Script)
> Versione script GUI: **install-AdHoc-Backup-GUI.ps1**
> Motore di backup: **AdHoc-Backup.ps1**
> Configurazione: **backup.conf**
> Report email: **send-mail.ps1 + report_template.html**
---
## 1. Obiettivo del progetto
Questo pacchetto serve a:
* fare **backup automatici** di:
* cartelle/file (es. installazione Zucchetti AdHoc)
* database **SQL Server**
* mantenere copie locali con **retention automatica**
* inviare gli archivi verso uno storage remoto (Dropbox, S3, ecc.) tramite **rclone**
* inviare una **mail HTML di report** con:
* esito (OK / WARNING / ERRORE)
* dimensioni archivi
* durata del backup
* spazio disco totale/usato/libero
* semplificare tutto tramite una **GUI di installazione** che:
* scarica e posiziona i file giusti
* prepara la struttura delle cartelle
* configura lattività pianificata di Windows
* offre un pulsante **“Test mail”**
---
## 2. Componenti del sistema
I file principali sono:
* `install-AdHoc-Backup-GUI.ps1`
GUI/installer: scarica e installa gli script, prepara i tool (7-Zip e rclone) e crea la Scheduled Task.
* `AdHoc-Backup.ps1`
**Motore di backup**: legge `backup.conf`, esegue backup file e SQL, comprime con 7-Zip, invia con rclone, pulisce e manda la mail di report.
* `backup.conf`
File di **configurazione utente**: definisce cosa salvare, dove salvare, retention, parametri rclone e parametri SMTP.
* `send-mail.ps1`
Si occupa di **costruire lHTML** del report (usando `report_template.html`) e inviare la mail via SMTP/TLS.
* `report_template.html`
Template HTML del report: contiene segnaposto (placeholder) che `send-mail.ps1` sostituisce con i dati reali del backup.
---
## 3. Esecuzione rapida (one-liner)
Per lanciare linstaller **senza scaricare nulla a mano**:
powershell
irm "https://gitea.poloinformatico.it/Mattia/Backup-AdHoc/raw/branch/main/install-AdHoc-Backup-GUI.ps1" | iex
### 3.1 Cosa fa questo comando
* `irm` = alias di `Invoke-RestMethod`
Scarica il contenuto del file PowerShell da Gitea **come testo**.
* `|` = pipe
Passa il testo scaricato al comando successivo.
* `iex` = alias di `Invoke-Expression`
Esegue il testo come script PowerShell in memoria.
**Nota importante**
Lerrore:
> Impossibile trovare un parametro posizionale che accetta l'argomento 'iex'
si verifica se **manca la pipe** `|`.
La forma corretta è sempre:
powershell
irm "URL" | iex
### 3.2 Come usarlo in pratica
1. Apri **PowerShell** come **Amministratore** (consigliato, per creare attività pianificate e scrivere in `C:\polo`).
2. Copia e incolla il comando:
powershell
irm "https://gitea.poloinformatico.it/Mattia/Backup-AdHoc/raw/branch/main/install-AdHoc-Backup-GUI.ps1" | iex
3. Premi **Invio**.
Dopo pochi secondi si apre la **finestra GUI “Installer AdHoc Backup”**.
Da qui prosegui con la configurazione grafica descritta nei capitoli successivi.
---
## 4. Struttura delle cartelle e layout standard
Linstaller GUI si aspetta e/o prepara un layout tipo.
### 4.1 Cartella di installazione degli script
Esempio predefinito:
* `C:\polo\scripts\`
* `AdHoc-Backup.ps1`
* `send-mail.ps1`
* `backup.conf` (se non spostato in `bin\conf`)
* `bin\`
* `conf\`
* `backup.conf`
* `rclone.conf`
* `report_template.html`
* `RClone\`
* `rclone.exe`
* `7Zip\`
* `7zr.exe` (o `7z.exe` se presente)
### 4.2 Cartella radice dei backup
Definita in `backup.conf`, es.:
* `C:\Backups_AdHoc\`
* `Bin\` (eventuali tool portabili usati da qui)
* `logs\`
* `backup_yyyy-MM-dd_HHmmss.log`
* `out\`
Archivi temporanei prima di upload/spostamento.
* `_sql_stage\`
File `.bak` e script SQL temporanei.
* `Files\`
Archivi file, se `KeepLocalArchives=true`.
* `Databases\`
Archivi SQL, se `KeepLocalArchives=true`.
---
## 5. Linstaller GUI `install-AdHoc-Backup-GUI.ps1`
### 5.1 Cosa fa in sintesi
Linstaller:
1. Mostra una **finestra WinForms** con:
* percorso di installazione
* URL dei file da scaricare
* opzioni di schedulazione
* opzioni di log/output
* area di configurazione di `backup.conf`
* pulsante per **Test mail**
* pulsante per **Installa**
2. Scarica e posiziona:
* `AdHoc-Backup.ps1`
* `backup.conf`
* `send-mail.ps1`
* `report_template.html`
3. Prepara il layout:
* `bin\conf`
* `bin\RClone`
* `bin\7Zip`
4. Installa automaticamente, se mancanti:
* `rclone.exe` (portabile)
* `7zr.exe` (versione minimale di 7-Zip)
5. Crea una **attività pianificata** (Scheduled Task) per eseguire il backup a orario/frequenza desiderati.
6. **Opzionale**: esegue subito il backup alla chiusura della GUI se selezioni lapposita checkbox.
### 5.2 Campi principali della GUI
*(I nomi possono variare leggermente, ma il concetto resta lo stesso.)*
#### 5.2.1 Cartella di installazione
* Label: “Cartella di installazione”
* TextBox: percorso (default es. `C:\polo\scripts`)
* Pulsante: “Scegli…” per aprire un `FolderBrowserDialog`
Qui verranno salvati gli script (`AdHoc-Backup.ps1`, `send-mail.ps1`, ecc.).
#### 5.2.2 URL script / config / template
* URL script AdHoc-Backup.ps1
* URL backup.conf
* URL send-mail.ps1
* URL report_template.html
Sono precompilati con le URL raw di Gitea.
Puoi cambiarli se vuoi puntare ad un tuo fork/branch.
#### 5.2.3 Opzioni generali
* **“Crea attività pianificata senza output (quiet)”**
Se spuntata, la Scheduled Task esegue `AdHoc-Backup.ps1` con parametro `-Quiet` (niente log su console, solo su file).
* **“Eseguire il backup subito dopo linstallazione (alla chiusura)”**
Se spuntata:
* alla chiusura della GUI linstaller lancia immediatamente `AdHoc-Backup.ps1` con la config scelta;
* se non spuntata, non parte nessun backup automatico alla chiusura.
#### 5.2.4 Schedulazione (Utilità di pianificazione)
* Checkbox **“Crea attività pianificata”**
* se disabilitata, linstaller **non** crea alcun job nel Task Scheduler.
* Combobox **“Frequenza”**
* valori: “Giornaliero”, “Settimanale”.
* Combobox **“Giorno”**
* attivo solo se scegli “Settimanale”.
* valori: “Lunedì (MON)”, “Martedì (TUE)”, ecc.
* Campo **“Ora”**
* `DateTimePicker` solo ora/minuti (es. default 23:00).
* Campo **“Nome attività”**
* default per es.: `Backup_AdHoc`.
Internamente la GUI usa `New-ScheduledTaskAction/Trigger/Principal` e `Register-ScheduledTask` per creare lattività con privilegi elevati e, se richiesto, con argomenti `-Config` e `-Quiet`.
#### 5.2.5 Parametri extra per AdHoc-Backup.ps1
* TextBox per specificare argomenti aggiuntivi da passare allo script, ad es.:
-Quiet
-Config "C:\percorso\altro.conf"
Questi argomenti vengono aggiunti alla stringa della Scheduled Task.
#### 5.2.6 Area di configurazione `backup.conf`
Nella parte centrale/bassa la GUI:
* legge `backup.conf` usando un parser che:
* mantiene intatti **commenti, spazi, tab, ordine delle righe**;
* memorizza i soli **valori** associati alle chiavi.
* genera controlli (TextBox / CheckBox) per i parametri principali (es. `BackupRoot`, `ArchiveSources`, `EnableSqlBackup`, ecc.).
Quando salvi:
* riscrive **solo i valori** nel file, lasciando la formattazione esistente invariata.
Questo ti permette di modificare la config senza “rovinare” il file.
#### 5.2.7 Pulsante “Test mail”
* Rilegge la config (in particolare le variabili `Mail*`).
* Costruisce un body di test.
* richiama `send-mail.ps1` per verificare:
* connessione SMTP (`MailSmtpHost`, `MailSmtpPort`);
* credenziali (`MailUser`, `MailPassword`);
* correttezza di mittente/destinatari.
#### 5.2.8 Pulsanti finali
* **“Installa”**
* scarica i file dagli URL indicati;
* prepara le cartelle `bin`, `conf`, `RClone`, `7Zip`;
* installa rclone/7zr se mancanti;
* salva `backup.conf` (se modificato);
* crea o aggiorna la Scheduled Task (se abilitata).
* **“Chiudi”**
* chiude la GUI;
* se la checkbox “Eseguire il backup subito dopo linstallazione” è spuntata:
* lancia immediatamente `AdHoc-Backup.ps1` con il `backup.conf` configurato.
---
## 6. La configurazione `backup.conf`
`backup.conf` è un file testo `CHIAVE=valore` con commenti `# ...`.
Lo script:
* ignora righe vuote o che iniziano per `#` / `;`;
* espande variabili di ambiente (es. `%COMPUTERNAME%`);
* gestisce le liste separate da `|`.
### 6.1 Sezione base e retention
Parametri principali:
* `BackupRoot=`
Cartella radice dei backup (`logs`, `out`, `Files`, `Databases`, `_sql_stage`, ecc.).
* `LocalRetentionDaysFiles=`
Giorni di retention per gli archivi file in `Files\`.
* `LocalRetentionDaysDb=`
Giorni di retention per gli archivi DB in `Databases\`.
* `RemoteRetentionDays=`
Giorni dopo i quali rclone elimina i file **sul remoto** (via `rclone delete --min-age`).
* `KeepLocalArchives=` (`true` / `false`)
* `true`: a fine job gli archivi in `out\` vengono **spostati** in `Files\` / `Databases\`.
* `false`: gli archivi in `out\` vengono eliminati (dopo lupload).
* `EnableFileBackup=` (`true` / `false`)
Abilita/disabilita il backup delle sorgenti file/folder.
* `EnableRcloneUpload=` (`true` / `false`)
Abilita/disabilita lupload verso lo storage remoto.
### 6.2 Sorgenti file
* `ArchiveSources=`
Lista di cartelle o share da includere, separate da `|`.
Esempio:
ArchiveSources=C:\Zucchetti\ahr90|C:\Zucchetti\NetSetup
Lo script:
* rimuove eventuali virgolette;
* ignora percorsi inesistenti (loggando un WARN);
* deduplica i percorsi.
### 6.3 Backup SQL Server
Parametri principali:
* `EnableSqlBackup=` (`true` / `false`)
Attiva o meno la parte SQL.
* `SqlInstance=`
Istanza SQL Server, es.:
* `localhost`
* `.\SQLEXPRESS`
* `localhost\SQLEXPRESS2022`
* `192.168.1.10,1433` (server remoto su porta esplicita)
* `SqlUseWindowsAuth=` (`true` / `false`)
* `true`: usa Windows Authentication (utente con cui gira il processo).
* `false`: usa utente/password SQL esplicitati.
* `SqlUser=`, `SqlPassword=`
Utilizzati solo se `SqlUseWindowsAuth=false`.
* `DbInclude=`
Lista di database da includere esplicitamente (separati da `|`).
Se vuoto, lo script:
1. chiede a SQL lelenco dei DB utente online (`sys.databases` con `state=0` e `database_id>4`);
2. li filtra usando `DbExclude`.
* `DbExclude=`
Lista di DB da escludere (default include `master|model|msdb|tempdb`).
* `SqlCompressStage=` (`true` / `false`)
Se `true`:
* comprime `_sql_stage\` in un archivio `SQL_HOST_DATASTAMP.7z` nella cartella `out\`;
* eventuali `.bak` possono essere rimossi (vedi sotto).
* `SqlDropBakAfterZip=` (`true` / `false`)
Se `true`:
* dopo la compressione, elimina i `.bak` da `_sql_stage\` (riduce lo spazio occupato dalla staging).
### 6.4 7-Zip
* `SevenZipCompressionLevel=` (09)
* 0 = store (niente compressione);
* 3 = compromesso veloce;
* 79 = compressione più forte ma lenta, sconsigliata per DB molto grandi.
Lo script usa `7zr.exe` o `7z.exe` e gestisce automaticamente i codici di ritorno:
* `ExitCode=0` → OK
* `ExitCode=1` → WARNING (non blocca il job, ma segna un warning e lesito diventa “COMPLETATO CON WARNING”)
* altri codici → errore (solleva eccezione).
### 6.5 rclone
Parametri principali:
* `RcloneRemoteDest=`
Percorso remoto in formato `REMOTE:percorso`, es.:
RcloneRemoteDest=dropbox:/Backups_AdHoc/%COMPUTERNAME%
Dove:
* `REMOTE` è il nome configurato in `rclone.conf`;
* `%COMPUTERNAME%` viene espansa con il nome del server.
* `RcloneBwl=`
Limitazione di banda, es. `10M` per 10 MB/s. Vuoto = nessun limite.
* `RcloneExtraArgs=`
Lista di argomenti rclone extra, separati da `|`, ad esempio:
--s3-chunk-size=64M|--s3-upload-concurrency=4|--fast-list
Lo script usa:
* `rclone copyto` per caricare ogni singolo archivio;
* `rclone delete` + `rclone rmdirs` per applicare la retention sul remoto.
Se manca `rclone.conf`, viene aperta una PowerShell con `rclone config --config <percorso>` per configurare almeno un remote.
In questo caso lo script si ferma dopo aver lanciato la configurazione, con un messaggio chiaro.
### 6.6 Email
Parametri:
* `MailEnabled=` (`true` / `false`)
* `MailSmtpHost=`
* `MailSmtpPort=` (es. 587)
* `MailUseAuth=` (`true` / `false`)
* `MailUser=`
* `MailPassword=`
* `MailFrom=`
* `MailTo=` (uno o più destinatari separati da `|`)
* `MailSubjectPref=`
Prefisso per loggetto, es.: `[BACKUP ADHOC]`.
`send-mail.ps1` usa queste variabili per costruire la connessione SMTP con TLS e inviare la mail di report.
---
## 7. Il motore di backup `AdHoc-Backup.ps1`
### 7.1 Avvio e parametri
Lo script accetta:
* `-Config`
Percorso del file `backup.conf` da usare.
* `-Quiet`
Non stampa nulla su console, scrive solo sul file log.
Ricerca il file di configurazione in questa priorità:
1. se passi `-Config`, usa quello (se esiste, altrimenti errore);
2. se trova `.\bin\conf\backup.conf` (layout installer), usa quello;
3. altrimenti cerca `backup.conf` nella stessa cartella dello script.
### 7.2 Lettura config e variabili script
La funzione `Load-Config`:
1. legge riga per riga `backup.conf`;
2. popola una serie di variabili di **scope script**, ad esempio:
* `$BackupRoot`
* `$ArchiveSources`
* `$EnableFileBackup`
* `$EnableSqlBackup`
* `$SqlInstance`, `$SqlUseWindowsAuth`, `$SqlUser`, `$SqlPassword`
* `$DbInclude`, `$DbExclude`
* `$SqlCompressStage`, `$SqlDropBakAfterZip`
* `$SevenZipCompressionLevel`
* `$EnableRcloneUpload`
* `$RcloneRemoteDest`, `$RcloneBwl`, `$RcloneExtraArgs`
* `$KeepLocalArchives`
* `$LocalRetentionDaysFiles`, `$LocalRetentionDaysDb`, `$RemoteRetentionDays`
* `$MailEnabled`, `$MailSmtpHost`, `$MailSmtpPort`, `$MailUseAuth`
* `$MailUser`, `$MailPassword`, `$MailFrom`, `$MailTo`, `$MailSubjectPref`
Se manca un parametro obbligatorio (es. `BackupRoot`, `SqlInstance` con SQL attivo, credenziali quando richieste), lo script solleva un errore e termina in modo controllato.
### 7.3 Inizializzazione percorsi e log
Lo script costruisce:
* `$Paths` (oggetto ordinato con Root/Bin/Logs/Out/SqlStage/Files/Databases)
* `$Files` (percorsi di `SevenZipExe`, `SevenZip7zr`, `RcloneExe`, `RcloneConf`, file log)
Crea (se mancanti) tutte le cartelle:
* root backup
* `Bin`, `Bin\7Zip`, `Bin\RClone`
* `logs`, `out`, `_sql_stage`, `Files`, `Databases`
Genera un log file, ad esempio:
C:\Backups_AdHoc\logs\backup_2025-11-19_090224.log
e definisce una funzione di logging che scrive su:
* console (a meno che `-Quiet`);
* file log.
### 7.4 Gestione 7-Zip
* `Ensure-7Zip`:
* controlla se esistono `7z.exe` o `7zr.exe` (prima prova nel layout GUI, poi in `BackupRoot\Bin\7Zip`);
* se assente, scarica `7zr.exe` da 7-Zip e lo salva nella cartella corretta.
* `Invoke-7ZipArchive`:
* costruisce gli argomenti corretti (in base a 7z/7zr);
* usa parametri non interattivi (`-y`, `-bd`, ecc.);
* controlla `$LASTEXITCODE`:
* `0` → log “OK”;
* `1` → log “WARNING”, non blocca il job;
* altri valori → solleva eccezione.
### 7.5 Gestione rclone
* `Ensure-Rclone`:
* se `rclone.exe` non esiste, scarica lo zip ufficiale dal sito rclone;
* lo estrae, trova `rclone.exe`, lo copia in `Bin\RClone`;
* pulisce le cartelle temporanee.
* `Ensure-RcloneConfigOrLaunch`:
* se manca `rclone.conf`:
* apre una PowerShell con `rclone config --config <percorso>`;
* mostra istruzioni chiare nel log;
* termina il job con un errore esplicito.
* `Invoke-RcloneCopyTo`:
* esegue `rclone copyto` con:
* `--config rclone.conf`;
* opzioni standard (`--transfers`, `--checkers`, `--retries`, ecc.);
* eventuale `--bwlimit` derivato da `RcloneBwl`;
* argomenti extra da `RcloneExtraArgs`.
* `Apply-RemoteRetention`:
* se `RemoteRetentionDays >= 0` e upload abilitato:
* esegue `rclone delete` con `--min-age`;
* esegue `rclone rmdirs` per eliminare cartelle vuote.
### 7.6 Backup SQL Server
Funzioni principali:
* `Resolve-Sqlcmd`
Cerca `sqlcmd.exe` nel PATH e in percorsi standard di installazione SQL Server.
* `Build-SqlcmdArgs` / `Log-SqlcmdArgsSafe`
Preparano gli argomenti per `sqlcmd`, mascherando la password nella versione loggata.
* `Get-OnlineUserDatabases`
Recupera lelenco dei DB utente online (`sys.databases`), escludendo i system DB (master, model, msdb, tempdb).
* `Backup-SqlDatabases`:
1. Assicura lesistenza di `_sql_stage\` e tenta di assegnare permessi `Modify` a `Everyone`, per evitare problemi quando SQL scrive i `.bak` con account di servizio.
2. Trova `sqlcmd.exe`; se assente → errore.
3. Determina `dbList` in base a `DbInclude`/`DbExclude`.
4. Per ogni DB:
* produce script `.sql` di backup;
* lancia `sqlcmd` per eseguire il `BACKUP DATABASE` su un `.bak` in `_sql_stage\`;
* verifica lesistenza del file `.bak`.
5. Se `SqlCompressStage=true`:
* comprime `_sql_stage\` in `SQL_HOST_DATASTAMP.7z` dentro `out\`;
* se `SqlDropBakAfterZip=true`, cancella i `.bak`.
6. Ritorna il percorso dellarchivio SQL oppure `null` se non creato.
### 7.7 Archiviazione file/folder
* `Archive-FileSources`:
* normalizza e verifica tutte le sorgenti di `ArchiveSources`;
* crea un archivio tipo `FILES_HOST_DATASTAMP.7z` in `out\`;
* ritorna il percorso dellarchivio o `null` se nessuna sorgente è valida.
### 7.8 Gestione cartella `out\` e copie locali
* `Get-OutFiles`
Restituisce tutti i file presenti in `out\`.
* `Move-OutFiles-ToStores`
Sposta gli archivi:
* quelli con nome che inizia per `FILES_` in `Files\`;
* gli altri (SQL) in `Databases\`.
* `Delete-OutFiles` / `Empty-OutFolder`
Eliminano i file e/o eventuali sottocartelle in `out\`.
### 7.9 Retention locale
* `Apply-LocalArchivesRetention`
Per ogni file in `Files\` e `Databases\` più vecchio di `LocalRetentionDaysFiles`/`LocalRetentionDaysDb`:
* prova a cancellarlo;
* logga sia successi che errori.
* `Apply-GenericRetention`
Applica retention generica su:
* `logs\`
* `_sql_stage\`
cancellando file più vecchi di `RetentionDays`.
### 7.10 Flusso MAIN (riassunto)
In modo semplificato:
1. Crea tutte le cartelle necessarie.
2. Scrive nel log i parametri principali (root, retention, ecc.).
3. Inizia a costruire una stringa di **riepilogo** con:
* hostname
* data/ora di start
* dettagli che verranno aggiunti via via.
4. Prepara i tool:
* se servono archivi (`EnableFileBackup` o SQL compresso), chiama `Ensure-7Zip`;
* se `EnableRcloneUpload=true`, chiama `Ensure-Rclone` e `Ensure-RcloneConfigOrLaunch`.
5. Se `EnableSqlBackup=true`:
* esegue `Backup-SqlDatabases`;
* aggiunge al riepilogo il percorso dellarchivio SQL (se presente).
6. Se `EnableFileBackup=true`:
* esegue `Archive-FileSources`;
* aggiunge al riepilogo il percorso dellarchivio file.
7. Determina i file effettivamente presenti in `out\`:
* se nessuno → warning.
8. Se upload abilitato e ci sono file in `out\`:
* per ogni file costruisce il percorso remoto:
<RcloneRemoteDest>/<DATASTAMP>/<NOMEARCHIVIO>
* chiama `Invoke-RcloneCopyTo` per inviarlo;
* aggiorna il riepilogo con la destinazione.
9. Copie locali:
* se `KeepLocalArchives=true`:
* `Move-OutFiles-ToStores` e `Empty-OutFolder`;
* se `false`:
* `Delete-OutFiles` e `Empty-OutFolder`.
10. Retention:
* se upload abilitato → `Apply-RemoteRetention`;
* sempre → `Apply-LocalArchivesRetention` + `Apply-GenericRetention`.
11. Determina lesito finale:
* se sono stati registrati warning → `ESITO: COMPLETATO CON WARNING`;
* se nessun errore/warning → `ESITO: COMPLETATO`.
12. Report mail:
* se `send-mail.ps1` esiste:
* viene “dot-sourced” ( `. .\send-mail.ps1` );
* viene chiamata la funzione che invia la mail passando:
* `Subject = MailSubjectPref + <testo>` (es. include host ed esito);
* `Body = riepilogo + log sintetico`.
* se succede un errore generale:
* il `catch` imposta `ESITO: FALLITO`;
* logga lerrore;
* tenta comunque di inviare unemail di fallimento.
---
## 8. Invio mail e template `send-mail.ps1` + `report_template.html`
### 8.1 Parametri e funzioni principali
`send-mail.ps1` viene eseguito dal motore di backup con:
* `-Subject` → oggetto della mail (prefisso da `MailSubjectPref` + esito/hostname);
* `-Body` → testo con riepilogo + estratto del log.
Funzioni principali:
* `Format-Bytes` / `Format-Duration`
Utility per formato dimensione e durata in forma leggibile.
* `Get-StatusInfo`
Analizza la stringa `Body` cercando `ESITO: ...` e restituisce:
* stato (OK/WARNING/FAIL) e
* colore da usare nel template (verde/giallo/rosso).
* `Build-ReportHtml`
Costruisce lHTML finale del report:
1. Cerca `report_template.html` in:
* `$script:InstallerConfDir` (quando eseguito tramite installer GUI),
* `$InstallerConfDir`,
* `bin\conf` vicino allo script,
* `C:\polo\scripts\bin\conf`.
2. Se non trova il template:
* genera una versione HTML di fallback (semplice ma leggibile) e **non blocca** il job.
3. Se trova il template:
* lo legge in UTF-8;
* sostituisce i placeholder con:
* stato e colore (`XXXSTATUSXXX`, `XXXBGCOLORXXX`, ecc.);
* host, versione script;
* data/ora di inizio/fine, durata;
* dimensioni totali/SQL/FILES;
* spazio disco totale/usato/libero;
* destinazione rclone;
* dettaglio del log formattato con `<br>` al posto dei newline.
* `Send-ReportMail`
Si occupa di inviare realmente la mail:
1. Se `MailEnabled=false` → esce loggando che la mail è disabilitata.
2. Recupera i parametri `Mail*` (host, porta, credenziali, mittente, destinatari).
3. Crea un `SmtpClient`:
* abilita SSL/TLS;
* imposta eventuali credenziali (`MailUser` / `MailPassword`);
* imposta `From` e `To`.
4. Imposta `Body` HTML (quello generato da `Build-ReportHtml`) e loggetto.
5. Invia e logga il risultato.
Alla fine del file:
* viene chiamato `Send-ReportMail -Subject $Subject -Body $Body`.
---
## 9. Modalità duso consigliata (end-to-end)
### 9.1 Prima installazione
1. Apri **PowerShell come Administrator**.
2. Lancia linstaller GUI con:
powershell
irm "https://gitea.poloinformatico.it/Mattia/Backup-AdHoc/raw/branch/main/install-AdHoc-Backup-GUI.ps1" | iex
3. Nella GUI:
* verifica la **cartella di installazione** (es. `C:\polo\scripts`);
* lascia gli URL di default, a meno che tu non voglia prendere i file da un tuo branch.
4. Configura la **schedulazione**:
* spunta “Crea attività pianificata”;
* imposta “Giornaliero” o “Settimanale”;
* scegli lorario (es. 23:00) e il giorno (se settimanale);
* eventualmente modifica il nome dellattività.
5. Compila la sezione `backup.conf`:
* imposta `BackupRoot` (es. `C:\Backups_AdHoc`);
* imposta `ArchiveSources` con le cartelle da salvare;
* configura SQL (istanza, autenticazione, DB da includere/escludere);
* imposta `RcloneRemoteDest` e, se necessario, `RcloneBwl`/`RcloneExtraArgs`;
* configura la parte mail (SMTP, credenziali, mittente/destinatari).
6. (Opzionale) Spunta “Eseguire il backup subito dopo linstallazione” per fare un test completo.
7. Premi **“Installa”**:
* linstaller scarica gli script;
* prepara layout e tool;
* crea la Scheduled Task se richiesto.
8. Premi **“Chiudi”**:
* se avevi spuntato lopzione, parte il backup immediato.
### 9.2 Verifica dopo il primo run
* Controlla il **log** in `C:\Backups_AdHoc\logs\`.
* Verifica che:
* siano presenti archivi in `Files\` / `Databases\` (se `KeepLocalArchives=true`);
* i file siano arrivati sul remoto (rclone);
* sia arrivata la **mail di report** allindirizzo/i impostati in `MailTo`.
### 9.3 Esecuzione manuale (senza GUI)
Una volta installato, puoi sempre testare o lanciare il backup manualmente.
Da PowerShell:
cd C:\polo\scripts
.\AdHoc-Backup.ps1 -Config "C:\polo\scripts\bin\conf\backup.conf"
Oppure in modalità silenziosa:
cd C:\polo\scripts
.\AdHoc-Backup.ps1 -Config "C:\polo\scripts\bin\conf\backup.conf" -Quiet
---
## 10. Troubleshooting rapido
* **Errore: “File di configurazione non trovato. Ho creato un template…”**
* Lo script non trova `backup.conf` → ne crea uno base.
* Compila il template generato e riesegui il backup.
* **Errore SQL: `sqlcmd.exe non trovato`**
* Installa i client tools di SQL Server oppure aggiungi `sqlcmd.exe` al PATH di sistema.
* Verifica i permessi di scrittura su `_sql_stage\` (account del servizio SQL).
* **Errore rclone: `rclone.conf assente`**
* Lo script apre una PowerShell con `rclone config`.
* Configura almeno un remote con il nome usato in `RcloneRemoteDest`.
* Riesegui il backup dopo aver completato la configurazione.
* **Mail non arrivano**
* Verifica `MailEnabled=true` in `backup.conf`.
* Controlla `MailSmtpHost` / `MailSmtpPort` / `MailUseAuth` / `MailUser` / `MailPassword`.
* Verifica che `MailFrom` e `MailTo` siano corretti.
* Usa il pulsante **“Test mail”** della GUI per fare prove rapide.
* **Spazio disco che si riempie troppo**
* Controlla:
* `LocalRetentionDaysFiles`
* `LocalRetentionDaysDb`
* `RetentionDays` (per log e `_sql_stage`)
* Riduci i valori se vuoi conservare meno storico, oppure aumenta lo spazio a disposizione.
* **Backup troppo lenti o banda saturata**
* Aumenta o diminuisci `SevenZipCompressionLevel` a seconda delle esigenze.
* Usa `RcloneBwl` per limitare la banda, es.:
RcloneBwl=10M
* Valuta di schedulare il backup in orari notturni tramite la GUI.
---