Outils & Référence

💾 Scripts Sauvegarde — Backup — Scripts prêts à l'emploi

📜 Scripts Utiles

10 scripts de sauvegarde et restauration : rsync, tar, MySQL, rotation, vérification.

📜 3 scripts 🟢 0 débutant 🔵 2 confirmé 🔴 1 expert
Sauvegarde complète avec tar + chiffrement
Confirmé tarbackupgpgchiffrement

Archive un dossier avec tar, compresse et chiffre avec GPG pour une sauvegarde sécurisée.

script
#!/bin/bash
# ─── Variables à modifier ───────────────────────────
SOURCE="/var/www/html /etc /home"
DEST="/backup/archives"
GPG_KEY="admin@monsite.fr"    # Clé GPG du destinataire
RETENTION=30                   # Jours de rétention
DATE=$(date +%Y%m%d_%H%M)
NOM_ARCHIVE="backup_$(hostname)_${DATE}"
# ────────────────────────────────────────────────────

mkdir -p "$DEST"
LOG="/var/log/backup.log"
exec >> "$LOG" 2>&1

echo "[$(date)] === Début sauvegarde ==="

# Créer l'archive tar.gz
ARCHIVE_TMP="/tmp/${NOM_ARCHIVE}.tar.gz"
tar -czf "$ARCHIVE_TMP" $SOURCE 2>/dev/null
TAILLE=$(du -sh "$ARCHIVE_TMP" | cut -f1)
echo "[$(date)] Archive : $TAILLE"

# Chiffrer avec GPG
if command -v gpg &>/dev/null && gpg --list-keys "$GPG_KEY" &>/dev/null; then
    gpg --recipient "$GPG_KEY"         --output "$DEST/${NOM_ARCHIVE}.tar.gz.gpg"         --encrypt "$ARCHIVE_TMP"
    rm -f "$ARCHIVE_TMP"
    FICHIER_FINAL="$DEST/${NOM_ARCHIVE}.tar.gz.gpg"
    echo "[$(date)] ✅ Archive chiffrée : $FICHIER_FINAL"
else
    mv "$ARCHIVE_TMP" "$DEST/${NOM_ARCHIVE}.tar.gz"
    FICHIER_FINAL="$DEST/${NOM_ARCHIVE}.tar.gz"
    echo "[$(date)] ⚠️ GPG non dispo — archive non chiffrée : $FICHIER_FINAL"
fi

# Rotation
find "$DEST" -name "backup_*.tar.gz*" -mtime +$RETENTION -delete
echo "[$(date)] Rétention ${RETENTION}j — anciens fichiers supprimés"
echo "[$(date)] === Fin sauvegarde ==="
Vérification intégrité des sauvegardes
Confirmé backupintégritéchecksummd5

Vérifie l'intégrité des archives de sauvegarde en comparant les checksums MD5/SHA256.

script
#!/bin/bash
# ─── Variables à modifier ───────────────────────────
BACKUP_DIR="/backup/archives"
CHECKSUM_FILE="$BACKUP_DIR/checksums.sha256"
EMAIL="admin@monsite.fr"
# ────────────────────────────────────────────────────

echo "=== Vérification intégrité sauvegardes — $(date) ==="
ERREURS=0

# Mode génération : créer les checksums de référence
if [ "$1" = "--generer" ]; then
    echo "Génération des checksums de référence..."
    find "$BACKUP_DIR" -name "*.tar.gz*" -type f         | sort         | xargs sha256sum > "$CHECKSUM_FILE"
    echo "✅ Checksums générés : $(wc -l < $CHECKSUM_FILE) fichiers"
    exit 0
fi

# Mode vérification
if [ ! -f "$CHECKSUM_FILE" ]; then
    echo "❌ Fichier checksums introuvable. Lancer avec --generer d'abord."
    exit 1
fi

while IFS= read -r line; do
    EXPECTED_HASH=$(echo "$line" | awk '{print $1}')
    FILE=$(echo "$line" | awk '{print $2}')

    if [ ! -f "$FILE" ]; then
        echo "❌ MANQUANT : $FILE"
        ERREURS=$((ERREURS+1))
        continue
    fi

    ACTUAL_HASH=$(sha256sum "$FILE" | awk '{print $1}')
    if [ "$EXPECTED_HASH" = "$ACTUAL_HASH" ]; then
        echo "✅ OK : $(basename $FILE)"
    else
        echo "❌ CORROMPU : $FILE"
        ERREURS=$((ERREURS+1))
    fi
done < "$CHECKSUM_FILE"

echo ""
echo "Résultat : $ERREURS erreur(s)"
if [ "$ERREURS" -gt 0 ]; then
    echo "⚠️ $ERREURS sauvegardes corrompues/manquantes sur $(hostname)"         | mail -s "❌ Intégrité sauvegardes KO" "$EMAIL"
fi
Sauvegarde Proxmox vzdump automatique
Expert proxmoxvzdumpbackupVM

Lance des sauvegardes vzdump de toutes les VMs Proxmox avec rétention et notification.

script
#!/bin/bash
# ─── Variables à modifier ───────────────────────────
STORAGE="local"           # Stockage Proxmox cible
COMPRESS="zstd"           # gzip, lzo, zstd
RETENTION=3               # Nombre de sauvegardes à garder
EMAIL="admin@monsite.fr"
EXCLURE_VMIDS=""          # Ex: "100 105" — VMs à ignorer
# ────────────────────────────────────────────────────

LOG="/var/log/vzdump_auto.log"
exec >> "$LOG" 2>&1

echo "=== VZDUMP AUTO — $(date) ==="

# Récupérer la liste des VMs et LXC
ALL_VMS=$(qm list 2>/dev/null | awk 'NR>1{print $1}')
ALL_LXC=$(pct list 2>/dev/null | awk 'NR>1{print $1}')

backup_vm() {
    local VMID=$1
    local TYPE=$2

    # Vérifier si dans la liste d'exclusion
    if echo "$EXCLURE_VMIDS" | grep -qw "$VMID"; then
        echo "⏩ VM $VMID ignorée (liste d'exclusion)"
        return
    fi

    echo "📦 Sauvegarde $TYPE $VMID..."
    vzdump $VMID         --storage $STORAGE         --compress $COMPRESS         --mode snapshot         --maxfiles $RETENTION         --quiet 1

    if [ $? -eq 0 ]; then
        echo "✅ $TYPE $VMID — OK"
    else
        echo "❌ $TYPE $VMID — ERREUR"
    fi
}

for vmid in $ALL_VMS; do backup_vm $vmid "VM"; done
for vmid in $ALL_LXC; do backup_vm $vmid "LXC"; done

echo "=== Fin vzdump — $(date) ==="
# Envoyer le log par email
mail -s "Rapport vzdump $(hostname) $(date +%d/%m)" "$EMAIL" < "$LOG"
# Cron : 0 1 * * 0 /opt/scripts/vzdump_auto.sh
Ajouter Les Fibrés à mes sources préférées
Retrouvez plus souvent nos guides dans vos résultats Google