bashscripts/backups/backup-container.sh
2026-03-07 00:16:30 +01:00

113 lines
5.5 KiB
Bash

#!/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 <nom_container>"
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"