Add readme.md

This commit is contained in:
Mattia Tadini 2025-11-21 11:04:20 +00:00
parent 6bc7c35e64
commit 08e73cdebc

782
readme.md Normal file
View File

@ -0,0 +1,782 @@
# 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.
---