113 lines
5.5 KiB
Bash
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" |