v1.0.0 Python Backups Linux Server Scripts

SLD-Filebackups-py

Un'utility di backup leggera in Python senza dipendenze esterne che archivia file e cartelle definiti in una lista JSON, con rotazione automatica dei vecchi archivi. Progettata per l'esecuzione automatizzata tramite cron su server Linux.

Usage of the sld-filebackups-py

Usage of the sld-filebackups-py

Funzionalità

  • Backup selettivo: definisci i percorsi da salvare in un file JSON, ciascuno con il proprio flag di attivazione/disattivazione; nessuna necessità di toccare il codice per aggiungere o rimuovere voci.
  • Backup delle cartelle: le directory vengono archiviate come .tar.gz (viene preservato solo il nome della cartella come root dell'archivio, senza esporre percorsi assoluti).
  • Backup dei singoli file: i singoli file vengono compressi come .gz.
  • Logica salta-se-esiste: se esiste già un backup per la data odierna, viene saltato automaticamente, rendendo lo script sicuro da eseguire più volte al giorno.
  • Auto-rotazione: dopo ogni esecuzione, i vecchi archivi oltre la soglia di conservazione configurata vengono eliminati automaticamente per ciascuna sottocartella.
  • Modalità simulazione (Dry-run): visualizza in anteprima quali file verrebbero rimossi dalla rotazione, senza cancellare nulla.
  • Logging strutturato: invia sempre l'output a console (ottimo per monitorare cron); opzionalmente scrive su un file di log persistente.
  • Supporto multi-ambiente: passa tra le configurazioni local, local2 e prod in un unico file (o crea un ambiente personalizzato).
  • Gestione sicura degli errori: voci JSON non valide, percorsi mancanti, cartelle vuote e permessi insufficienti vengono gestiti e registrati senza bloccare l'intera esecuzione.

Struttura del Progetto

📁 backups_script/
├── 🐍 script.py           # Entry point e parser argomenti CLI
├── 🐍 functions.py        # Logica principale: backup, rotazione, controlli
├── 🐍 constants.py        # Stato condiviso: percorsi, configurazione, timestamp
├── 🐍 logger.py           # Configurazione logging (console + file opzionale)
├── 🐍 init.py             # Selettore ambiente (local / prod)
├── 🧰 config.json         # Configurazione runtime
├── 🧰 dir_backups.json    # Lista dichiarativa dei percorsi di backup
└── ⭐ LICENSE             # GNU GPL v3

Responsabilità dei Moduli

FileRuolo
init.pyDefinisce ROOT_DIR_APP e ROOT_DIR_BACKUPS in base all'ambiente selezionato. Viene importato per primo da tutti i moduli.
constants.pyCostruisce tutti i percorsi derivati, carica config.json e dir_backups.json in memoria, acquisisce data e ora corrente.
logger.pyLegge config.json e configura il logger Python con uno StreamHandler su console e un FileHandler opzionale su disco.
functions.pyContiene la logica di business: default_backup_dir(), check_existing_folders(), backups_now(), autorotate_backups(), show_enabled().
script.pyInizializza il logging, analizza gli argomenti della riga di comando ed esegue le funzioni appropriate. Senza flag, esegue backup completo + rotazione.

Come Funziona

  1. script.py chiama setup_logger(), che legge config.json e imposta il logging.
  2. default_backup_dir() assicura che la cartella radice di backup e la sottocartella con il nome dell'host esistano su disco.
  3. check_existing_folders() legge dir_backups.json, filtra le voci abilitate (flag == 1), verifica che ciascun percorso esista e lo classifica come "folder" o "file". Cartelle vuote o illeggibili vengono escluse.
  4. backups_now() itera sui percorsi verificati:
    • Per le cartelle: crea un archivio #NOME_AAAA-MM-GG.tar.gz usando il modulo standard tarfile di Python.
    • Per i singoli file: crea una copia compressa #NOME_AAAA-MM-GG.gz usando gzip + shutil.copyfileobj.
    • Se l'archivio per oggi esiste già, la voce viene saltata automaticamente.
  5. autorotate_backups() scansiona ogni sottocartella della directory di backup dell'host, ordina i file .gz per data di modifica (dal più recente) ed elimina quelli oltre il limite di keep_backups.

Installazione

Nessuna dipendenza esterna da installare. Lo script utilizza esclusivamente la libreria standard di Python 3.

git clone https://gitea.sld-server.org/sld-admin/sld-filebackups-py.git
cd sld-filebackups-py

Successivamente configura l'ambiente e i percorsi in init.py e dir_backups.json.

Configurazione

config.json:

{
  "keep_backups": 7,
  "logs": false,
  "logs_path": "/home/backups/logs"
}
ParametroTipoPredefinitoDescrizione
keep_backupsIntero7Quanti archivi recenti conservare per sottocartella. Quelli più vecchi vengono rimossi dalla rotazione.
logsBooleanofalseSe true, viene scritto un file backup.log in logs_path oltre all'output da terminale.
logs_pathStringa~/backups/logsCartella dove verrà creato il file di log. Creata automaticamente se inesistente.

dir_backups.json:

Questa è la lista dichiarativa di tutti gli elementi da includere nel backup. Ogni voce è un array JSON con tre valori:

[
    [ "/percorso/assoluto/alla/cartella",  1, "BackupDocumenti" ],
    [ "/percorso/assoluto/al/file.conf",  1, "BackupConfig"     ],
    [ "/percorso/disabilitato",           0, "VecchioBackup"    ]
]
IndiceTipoDescrizione
0StringaPercorso assoluto del file o della cartella da salvare.
1Intero1 = abilitato (incluso nel backup). 0 = disabilitato (ignorato).
2StringaIdentificatore univoco usato come nome della sottocartella e prefisso dell'archivio.

Ambiente (init.py)

env = "local"   # Seleziona tra: "local", "local2", "prod"
AmbienteROOT_DIR_APPROOT_DIR_BACKUPS
local/home/sld-admin/Scrivania/backups_script/###ROOT_DIR_APP###/backups/Daily_File_Backups/
local2/home/simo-positive/Desktop/backups_script/###ROOT_DIR_APP###/backups/Daily_File_Backups/
prod/opt/sld-backups//home/backups/backups_root/Daily_File_Backups/

Utilizzo da Riga di Comando

# Backup completo + auto-rotazione (predefinito, nessun flag)
python3 script.py

# Mostra i percorsi abilitati e disabilitati
python3 script.py --show

# Verifica se i percorsi dichiarati esistono su disco e stampa un report
python3 script.py --check

# Esegui il backup con output di debug dettagliato
python3 script.py --debug

# Esegui solo il passaggio di rotazione (nessun nuovo backup creato)
python3 script.py --rotate

# Simula la rotazione senza eliminare alcun file reale
python3 script.py --rotate --dry

Riferimento Parametri CLI

FlagForma estesaDescrizione
-s--showStampa i percorsi abilitati e disabilitati definiti in dir_backups.json.
-d--debugEsegue il backup con output di debug dettagliato.
-c--checkEsegue check_existing_folders() e mostra lo stato di ogni percorso.
-r--rotateEsegue unicamente autorotate_backups(). Combinabile con --dry.
--dryModalità simulazione per --rotate: registra i candidati all'eliminazione senza cancellare nulla.

Esecuzione Automatica con Cron

Per eseguire un backup completo ogni giorno alle 02:00 di notte:

crontab -e
0 2 * * * /usr/bin/python3 /opt/sld-backups/script.py >> /home/backups/logs/cron.log 2>&1

Requisiti

  • Python 3.6+
  • Nessuna libreria esterna — utilizza esclusivamente i moduli standard:
    • tarfile, gzip, shutil — archiviazione e compressione
    • logging — output strutturato
    • argparse — gestione argomenti CLI
    • pathlib — gestione percorsi
    • socket — rilevamento hostname
    • json — caricamento configurazioni

Licenza

GNU General Public License v3.0 — consulta il file LICENSE per i dettagli completi.