diff --git a/redmine-files-backup/redmine-files-backup.sh b/redmine-files-backup/redmine-files-backup.sh index 8d45e11..84d2c2e 100644 --- a/redmine-files-backup/redmine-files-backup.sh +++ b/redmine-files-backup/redmine-files-backup.sh @@ -4,13 +4,13 @@ set -euo pipefail SRC="/opt/redmine/redmine_files" BASE="/var/backups/tscale01/redmine_files" PREFIX="redmine_files" -RETENTION_DAYS=3 - -TIMESTAMP="$(date '+%Y%m%d_%H%M%S')" -DEST="${BASE}/${PREFIX}-${TIMESTAMP}" +KEEP=3 LOG="/var/log/backup-redmine-files.log" -LOCK="/var/lock/backup-redmine-files.lock" +LOCK="/var/lock/redmine-files-backup.lock" + +timestamp="$(date '+%Y%m%d_%H%M%S')" +DEST="${BASE}/${PREFIX}-${timestamp}" log() { printf "%s %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1" | tee -a "$LOG" @@ -21,11 +21,15 @@ cleanup() { } trap cleanup EXIT +# Lock semplice if ! ( set -o noclobber; echo "$$" > "$LOCK" ) 2>/dev/null; then log "ERRORE: un'altra istanza è in esecuzione." exit 1 fi +# Verifiche base +[ -d "$SRC" ] || { log "ERRORE: sorgente $SRC inesistente"; exit 1; } +mkdir -p "$BASE" mkdir -p "$DEST" log "Inizio snapshot → $DEST" @@ -34,10 +38,19 @@ rsync -a --delete "$SRC"/ "$DEST"/ log "Snapshot completato." -log "Avvio retention (ultimi $RETENTION_DAYS giorni)…" +# Retention per numero: tieni gli ultimi $KEEP, cancella il resto +log "Avvio retention: mantengo ultimi $KEEP snapshot." -find "$BASE" -maxdepth 1 -type d -name "${PREFIX}-*" \ - -mtime +"$RETENTION_DAYS" -print -exec rm -rf {} \; +# Lista directory in ordine dal più recente al più vecchio +snapshots=( $(ls -1dt "${BASE}/${PREFIX}-"* 2>/dev/null || true) ) + +if [ "${#snapshots[@]}" -gt "$KEEP" ]; then + to_delete=( "${snapshots[@]:$KEEP}" ) + for dir in "${to_delete[@]}"; do + log "Elimino snapshot vecchio: $dir" + rm -rf -- "$dir" + done +fi log "Retention completata." exit 0