#!/bin/bash ######################################################### # # # Script LXD Backup ct + còpia remota # # + retenció + email + mida + temps + integritat # # # # Requirements # # - Add cron to lxd group: usermod -aG lxd root # # and restart crond: systemctl restart crond # # - Install postfix, set as internet site # # and set configuration as: # # postconf -e "inet_interfaces = loopback-only" # ######################################################### # Assegurar els paths per al cron PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/var/lib/snapd/snap/bin # --- CONFIGURACIÓ --- CONTAINER="$1" REMOTE_HOST="estudiset.backups" REMOTE_DIR="/home/debian/backups/studi7/lxd" LOCAL_DIR="/var/backups/lxd" EMAIL="roger@estudiset.cat" DATE=$(date +"%Y-%m-%d_%H-%M-%S") # --- VALIDACIÓ --- if [ -z "$CONTAINER" ]; then echo "Ús: $0 " exit 1 fi if ! lxc info "$CONTAINER" >/dev/null 2>&1; then MSG="Error: el contenidor '$CONTAINER' no existeix." echo "$MSG" echo "$MSG" | mail -s "[Backup LXD] container $CONTAINER - ERROR" "$EMAIL" exit 1 fi mkdir -p "$LOCAL_DIR" # --- TEMPS INICI --- START_TIME=$(date +%s) # --- CREAR BACKUP LOCAL --- BACKUP_FILE="${LOCAL_DIR}/${CONTAINER}_${DATE}.zstd" echo "Creant backup del contenidor '$CONTAINER'..." if ! lxc export "$CONTAINER" "$BACKUP_FILE"; then MSG="Error: no s'ha pogut crear el backup del contenidor $CONTAINER." echo "$MSG" echo "$MSG" | mail -s "[Backup LXD] container $CONTAINER - ERROR" "$EMAIL" exit 1 fi # Mida del backup BACKUP_SIZE=$(du -h "$BACKUP_FILE" | awk '{print $1}') # Hash local LOCAL_HASH=$(sha256sum "$BACKUP_FILE" | awk '{print $1}') # --- ENVIAR A SERVIDOR REMOT --- echo "Enviant backup al servidor remot..." if ! scp "$BACKUP_FILE" "${REMOTE_HOST}:${REMOTE_DIR}/"; then MSG="Error: no s'ha pogut copiar el backup al servidor remot." echo "$MSG" echo "$MSG" | mail -s "[Backup LXD] container $CONTAINER - ERROR" "$EMAIL" exit 1 fi # --- VERIFICACIÓ D'INTEGRITAT --- REMOTE_HASH=$(ssh "${REMOTE_HOST}" "sha256sum ${REMOTE_DIR}/$(basename "$BACKUP_FILE") | awk '{print \$1}'") if [ "$LOCAL_HASH" = "$REMOTE_HASH" ]; then INTEGRITY="OK — la còpia és idèntica" else INTEGRITY="ERROR — el hash no coincideix!" fi # --- ELIMINAR BACKUP LOCAL --- rm -f "$BACKUP_FILE" # --- ROTACIÓ DE BACKUPS AL SERVIDOR REMOT --- ssh "${REMOTE_HOST}" "find ${REMOTE_DIR} -type f -mtime +7 -name '${CONTAINER}_*.zstd' -delete" # --- TEMPS FINAL --- END_TIME=$(date +%s) TOTAL_TIME=$((END_TIME - START_TIME)) H=$((TOTAL_TIME / 3600)) M=$(((TOTAL_TIME % 3600) / 60)) S=$((TOTAL_TIME % 60)) TIME_FORMAT="${H}h ${M}m ${S}s" # --- NOTIFICACIÓ EMAIL --- SUCCESS_MSG="Backup del contenidor '$CONTAINER' completat correctament. Servidor remot: ${REMOTE_HOST} Ruta: $REMOTE_DIR Fitxer: $BACKUP_FILE Mida del backup: ${BACKUP_SIZE} Temps total del procés: ${TIME_FORMAT} Integritat: - Hash local: ${LOCAL_HASH} - Hash remot: ${REMOTE_HASH} - Estat: ${INTEGRITY} " echo "$SUCCESS_MSG" | mail -s "[Backup LXD] contenidor $CONTAINER - OK" "$EMAIL" echo "$SUCCESS_MSG"