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 :
BACKUP_SRC— répertoire à sauvegarder (défaut :/var/www)BACKUP_DEST— destination locale (défaut :/var/backups/tar)BACKUP_KEEP— nombre d'archives à conserver (défaut : 7)REMOTE— destination SSH optionnelle (ex :user@srv:/backups)
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 ""