Backup — Archive tar.gz datée

Crée une archive tar.gz datée d'un répertoire et l'envoie en local ou vers un serveur distant via SSH/rsync. Rotation automatique des anciennes sauvegardes.

backupsysadmintarrsync
$ curl scripts.ysavary.fr/backup-tar | bash

Backup — Archive tar.gz datée

Sauvegarde un répertoire source en archive .tar.gz horodatée, avec rotation automatique des anciennes sauvegardes. Supporte l'envoi vers un serveur distant via SSH.

Variables configurables :

Exemple d'utilisation :

BACKUP_SRC=/var/www BACKUP_DEST=/mnt/nas/backups BACKUP_KEEP=14 bash <(curl -s scripts.ysavary.fr/backup-tar)

bash
#!/bin/bash
set -euo pipefail

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info()  { echo -e "${GREEN}[INFO]${NC}  $*"; }
warn()  { echo -e "${YELLOW}[WARN]${NC}  $*"; }
error() { echo -e "${RED}[ERR]${NC}   $*"; exit 1; }

BACKUP_SRC="${BACKUP_SRC:-/var/www}"
BACKUP_DEST="${BACKUP_DEST:-/var/backups/tar}"
BACKUP_KEEP="${BACKUP_KEEP:-7}"
REMOTE="${REMOTE:-}"

[[ -d "$BACKUP_SRC" ]] || error "Source introuvable : $BACKUP_SRC"

DATE=$(date +%Y%m%d_%H%M%S)
BASENAME=$(basename "$BACKUP_SRC")
ARCHIVE="${BACKUP_DEST}/${BASENAME}_${DATE}.tar.gz"

mkdir -p "$BACKUP_DEST"

# ── Création de l'archive ─────────────────────────────────────────────────────
info "=== Création de l'archive ==="
info "Source      : $BACKUP_SRC"
info "Destination : $ARCHIVE"

tar -czf "$ARCHIVE" -C "$(dirname "$BACKUP_SRC")" "$BASENAME"
SIZE=$(du -sh "$ARCHIVE" | cut -f1)
info "Archive créée : $SIZE"

# ── Envoi distant via SSH/rsync ───────────────────────────────────────────────
if [[ -n "$REMOTE" ]]; then
    info "=== Envoi vers $REMOTE ==="
    if ! command -v rsync &>/dev/null; then
        apt-get install -y -qq rsync
    fi
    rsync -az --progress "$ARCHIVE" "$REMOTE/"
    info "Envoi terminé."
fi

# ── Rotation : suppression des anciennes archives ─────────────────────────────
info "=== Rotation (conservation : $BACKUP_KEEP archives) ==="
COUNT=$(ls -1 "${BACKUP_DEST}/${BASENAME}_"*.tar.gz 2>/dev/null | wc -l)
if [[ $COUNT -gt $BACKUP_KEEP ]]; then
    TO_DELETE=$(( COUNT - BACKUP_KEEP ))
    ls -1t "${BACKUP_DEST}/${BASENAME}_"*.tar.gz | tail -"$TO_DELETE" | while read -r f; do
        rm -f "$f"
        warn "Supprimé : $(basename "$f")"
    done
fi

REMAINING=$(ls -1 "${BACKUP_DEST}/${BASENAME}_"*.tar.gz 2>/dev/null | wc -l)

echo ""
info "=== Backup terminé ==="
echo ""
echo "  Archive  : $ARCHIVE"
echo "  Taille   : $SIZE"
echo "  Archives : $REMAINING / $BACKUP_KEEP conservées"
echo ""
echo "  Liste des archives :"
ls -lh "${BACKUP_DEST}/${BASENAME}_"*.tar.gz 2>/dev/null | awk '{print "  " $5, $NF}' || true
echo ""