rimozione old logic e creazione redmine files backup
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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-
|
||||
|
||||
@@ -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"
|
||||
@@ -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-
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user