diff --git a/mariadb-backup/mariadb-backup-full.sh b/mariadb-backup/mariadb-backup-full.sh index fca5ff7..9c34d29 100644 --- a/mariadb-backup/mariadb-backup-full.sh +++ b/mariadb-backup/mariadb-backup-full.sh @@ -9,7 +9,7 @@ set -euo pipefail ulimit -n 65536 # Directory base dei backup -BACKUP_BASE=/var/backups/tscale01 +BACKUP_BASE=/var/backups/tscale01/mariadb # Timestamp per la directory del backup TIMESTAMP=$(date +%Y%m%d-%H%M%S) diff --git a/mariadb-backup/mariadb-backup-incremental.sh b/mariadb-backup/mariadb-backup-incremental.sh index e4bd59a..2466b7b 100644 --- a/mariadb-backup/mariadb-backup-incremental.sh +++ b/mariadb-backup/mariadb-backup-incremental.sh @@ -9,7 +9,7 @@ set -euo pipefail ulimit -n 65536 # Directory base dei backup -BACKUP_BASE=/var/backups/tscale01 +BACKUP_BASE=/var/backups/tscale01/mariadb # Prefissi per full e incremental FULL_PREFIX=backup-full- diff --git a/mariadb-backup/mariadb-backup-logic-old.sh b/mariadb-backup/mariadb-backup-logic-old.sh deleted file mode 100644 index 6a2d06a..0000000 --- a/mariadb-backup/mariadb-backup-logic-old.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -set -euo pipefail - -ulimit -n 65536 - -BACKUP_BASE=/var/backups/tscale01 -PREFIX=backup-logic- -TIMESTAMP=$(date +%Y%m%d-%H%M%S) -TARGET="$BACKUP_BASE/${PREFIX}${TIMESTAMP}" -DUMPFILE="$TARGET/all-dbs.sql" -LOGFILE=/var/log/mariadb-backup.log -LOCKFILE=/var/lock/mariadb-backup.lock - -# mysqldump bin e opzioni (root senza password: non passiamo --defaults-file) -MYSQLDUMP_BIN=$(command -v mysqldump || true) -MYSQLDUMP_OPTS="--user=root --all-databases --single-transaction --quick --lock-tables=FALSE" - -# assicurati che il logfile esista e abbia permessi restrittivi -touch "$LOGFILE" -chown root:root "$LOGFILE" -chmod 600 "$LOGFILE" - -#verifico file lock per non sovrapporre backup -( - flock -n 9 || { echo "[$(date '+%F %T')] SKIP: another backup is running" >> "$LOGFILE"; exit 0; } - - if [ -z "$MYSQLDUMP_BIN" ]; then - echo "[$(date '+%F %T')] ERROR: mysqldump not found in PATH" >> "$LOGFILE" - exit 1 - fi - - mkdir -p "$TARGET" - chown mysql:mysql "$TARGET" - chmod 750 "$TARGET" - - TMPLOG=$(mktemp /tmp/mariadb-backup-logic.XXXXXX) - - echo "---------------------" >> "$LOGFILE" - echo "[$(date '+%F %T')] START logic backup $TARGET" >> "$LOGFILE" - - # esegui il dump: stdout -> file, stderr -> TMPLOG - if $MYSQLDUMP_BIN $MYSQLDUMP_OPTS >"$DUMPFILE" 2>"$TMPLOG"; then - echo "[$(date '+%F %T')] END logic backup $TARGET" >> "$LOGFILE" - - # misura dimensione apparente (byte logici) - size_apparent_bytes=$(find "$TARGET" -type f -printf '%s\n' 2>/dev/null | awk '{s+=$1} END{print s+0}') - size_apparent_human=$(numfmt --to=iec --suffix=B "$size_apparent_bytes" 2>/dev/null || echo "${size_apparent_bytes}B") - - # misura spazio su disco effettivo (byte allocati) - size_disk_bytes=$(du -s --block-size=1 "$TARGET" 2>/dev/null | cut -f1 || echo 0) - size_disk_human=$(numfmt --to=iec --suffix=B "$size_disk_bytes" 2>/dev/null || echo "${size_disk_bytes}B") - - echo "[$(date '+%F %T')] SIZE apparent: $size_apparent_human ($size_apparent_bytes bytes) for $TARGET" >> "$LOGFILE" - echo "[$(date '+%F %T')] SIZE on-disk: $size_disk_human ($size_disk_bytes bytes) for $TARGET" >> "$LOGFILE" - - echo "[$(date '+%F %T')] RESULT: OK, no errors" >> "$LOGFILE" - - rm -f "$TMPLOG" - else - echo "[$(date '+%F %T')] ERROR during logic backup for $TARGET. See $TMPLOG" >> "$LOGFILE" - tail -n 200 "$TMPLOG" >> "$LOGFILE" - rm -f "$TMPLOG" - exit 1 - fi - - # rotazione: mantieni 7 giorni per i logic (log dettagliato) - TO_DELETE=$(find "$BACKUP_BASE" -maxdepth 1 -type d -name "${PREFIX}*" -mtime +7 -print 2>/dev/null || true) - - if [ -n "$TO_DELETE" ]; then - echo "[$(date '+%F %T')] ROTATE: removing old logic backups:" >> "$LOGFILE" - echo "$TO_DELETE" >> "$LOGFILE" - echo "$TO_DELETE" | tr '\n' '\0' | xargs -0 -r rm -rf -- - else - echo "[$(date '+%F %T')] ROTATE: no logic backups to remove (<=7 days)" >> "$LOGFILE" - fi - - echo " " >> "$LOGFILE" - -) 9>"$LOCKFILE" diff --git a/mariadb-backup/mariadb-backup-logic-per-database.sh b/mariadb-backup/mariadb-backup-logic-per-database.sh index 6a7443e..d5b9cea 100644 --- a/mariadb-backup/mariadb-backup-logic-per-database.sh +++ b/mariadb-backup/mariadb-backup-logic-per-database.sh @@ -13,7 +13,7 @@ set -euo pipefail ulimit -n 65536 # Directory base dei backup logici -BACKUP_BASE=/var/backups/tscale01 +BACKUP_BASE=/var/backups/tscale01/mariadb # Prefisso per distinguere i backup logici PREFIX=backup-logic- diff --git a/redmine-files-backup/redmine-files-backup.sh b/redmine-files-backup/redmine-files-backup.sh new file mode 100644 index 0000000..5eadddf --- /dev/null +++ b/redmine-files-backup/redmine-files-backup.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# backup-redmine-files — snapshot giornaliero dei file Redmine +# Autore: Marco +# Descrizione: +# Crea snapshot datati del contenuto di /opt/redmine/redmine_files +# in /var/backups/tscale01/redmine_files/redmine_files-YYYYMMDD_HHMMSS +# con lock, atomicità e retention automatica. +# + +set -euo pipefail + +# --- Configurazione --------------------------------------------------------- + +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}" +TMP="${DEST}.tmp" + +LOG="/var/log/backup-redmine-files.log" +LOCK="/var/lock/backup-redmine-files.lock" + +# --- Funzioni --------------------------------------------------------------- + +log() { + printf "%s %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1" | tee -a "$LOG" +} + +cleanup() { + rm -f "$LOCK" + rm -rf "$TMP" +} +trap cleanup EXIT + +# --- Lock per evitare esecuzioni concorrenti ------------------------------- + +if ! ( set -o noclobber; echo "$$" > "$LOCK" ) 2>/dev/null; then + log "ERRORE: un'altra istanza è in esecuzione (lock presente)." + exit 1 +fi + +# --- Verifiche preliminari -------------------------------------------------- + +if [ ! -d "$SRC" ]; then + log "ERRORE: directory sorgente $SRC non trovata." + exit 1 +fi + +mkdir -p "$BASE" + +# --- Copia atomica ---------------------------------------------------------- + +log "Inizio snapshot Redmine files → $DEST" + +# Copia in directory temporanea +rsync -a --delete "$SRC"/ "$TMP"/ + +# Rimpiazzo atomico +mv -T "$TMP" "$DEST" + +log "Snapshot completato." + +# --- Retention: elimina snapshot più vecchi di N giorni --------------------- + +log "Avvio retention: mantengo ultimi $RETENTION_DAYS giorni." + +find "$BASE" -maxdepth 1 -type d -name "${PREFIX}-*" \ + -mtime +"$RETENTION_DAYS" -print -exec rm -rf {} \; + +log "Retention completata." +exit 0