#!/bin/bash # Script di backup per database MySQL e cartella htdocs # Le credenziali del database devono essere nel file .secret # Uso: ./backup.sh dominio # Verifica parametro dominio if [ -z "$1" ]; then echo "Errore: Specificare il dominio come parametro" echo "Uso: $0 dominio" echo "Esempio: $0 esempio.com" exit 1 fi DOMAIN="$1" # Ottieni la directory dello script SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SECRET_FILE="$SCRIPT_DIR/.secret" # Verifica che il file .secret esista if [ ! -f "$SECRET_FILE" ]; then echo "Errore: File .secret non trovato in $SCRIPT_DIR" echo "Creare il file .secret con le seguenti variabili:" echo "DB_HOST=localhost" echo "DB_NAME=nome_database" echo "DB_USER=utente" echo "DB_PASS=password" exit 1 fi # Carica le credenziali dal file .secret source "$SECRET_FILE" # Verifica che le variabili necessarie siano definite if [ -z "$DB_HOST" ] || [ -z "$DB_NAME" ] || [ -z "$DB_USER" ] || [ -z "$DB_PASS" ]; then echo "Errore: Una o più variabili mancanti nel file .secret" echo "Variabili richieste: DB_HOST, DB_NAME, DB_USER, DB_PASS" exit 1 fi # Funzione per inviare notifica a Gotify send_gotify_notification() { local title="$1" local message="$2" local priority="${3:-5}" if [ -n "$GOTIFY_URL" ] && [ -n "$GOTIFY_TOKEN" ]; then curl -X POST "$GOTIFY_URL" \ -H "Content-Type: application/json" \ -d "{\"title\":\"$title\",\"message\":\"$message\",\"priority\":$priority}" \ -H "X-Gotify-Key: $GOTIFY_TOKEN" \ -s > /dev/null 2>&1 fi } # Funzione per gestire la retention dei backup remoti cleanup_old_backups() { local retention_days="${RETENTION_DAYS:-7}" if [ -z "$REMOTE_HOST" ] || [ -z "$REMOTE_USER" ] || [ -z "$REMOTE_PASS" ] || [ -z "$REMOTE_PATH" ]; then return 0 fi echo "Pulizia backup remoti più vecchi di $retention_days giorni..." # Rimuovi i backup più vecchi sul server remoto sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" "find $REMOTE_PATH/$DOMAIN -name 'backup_${DOMAIN}_*.zip' -type f -mtime +$retention_days -delete" 2>/dev/null if [ $? -eq 0 ]; then echo "Retention applicata con successo sul server remoto" fi } # Funzione per trasferire il backup su server remoto transfer_to_remote() { local file="$1" if [ -z "$REMOTE_HOST" ] || [ -z "$REMOTE_USER" ] || [ -z "$REMOTE_PASS" ] || [ -z "$REMOTE_PATH" ]; then echo "Attenzione: Configurazione remota incompleta, trasferimento saltato" return 0 fi echo "Trasferimento backup su server remoto..." # Verifica se sshpass è installato if ! command -v sshpass &> /dev/null; then echo "Errore: sshpass non è installato. Installare con: apt-get install sshpass" send_gotify_notification "⚠️ Backup Parziale" "Backup di $DOMAIN completato ma trasferimento remoto fallito: sshpass non installato" 6 return 1 fi # Crea la cartella del dominio sul server remoto se non esiste echo "Creazione cartella remota se necessaria..." sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_PATH/$DOMAIN" 2>/dev/null if [ $? -ne 0 ]; then echo "Errore durante la creazione della cartella remota" send_gotify_notification "⚠️ Backup Parziale" "Backup di $DOMAIN completato ma creazione cartella remota fallita" 6 return 1 fi # Trasferisci il file via rsync sshpass -p "$REMOTE_PASS" rsync -avz -e "ssh -o StrictHostKeyChecking=no" "$file" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/$DOMAIN/" if [ $? -ne 0 ]; then echo "Errore durante il trasferimento del backup" send_gotify_notification "⚠️ Backup Parziale" "Backup di $DOMAIN completato ma trasferimento remoto fallito" 6 return 1 fi echo "Backup trasferito con successo su $REMOTE_HOST" return 0 } # Configurazione TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_DIR="$SCRIPT_DIR/backup_${DOMAIN}_$TIMESTAMP" SITE_DIR="/home/$(whoami)/htdocs/${DOMAIN}" DB_DUMP_FILE="$BACKUP_DIR/database_$TIMESTAMP.sql" ZIP_FILE="$SCRIPT_DIR/backup_${DOMAIN}_$TIMESTAMP.zip" # Crea directory di backup temporanea echo "Creazione directory di backup..." mkdir -p "$BACKUP_DIR" # Esegui dump del database echo "Esecuzione dump del database $DB_NAME per il dominio $DOMAIN..." mysqldump --no-tablespaces -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$DB_DUMP_FILE" if [ $? -ne 0 ]; then echo "Errore durante il dump del database" send_gotify_notification "❌ Backup Fallito" "Errore durante il dump del database $DB_NAME per $DOMAIN" 8 rm -rf "$BACKUP_DIR" exit 1 fi echo "Dump del database completato: $DB_DUMP_FILE" # Verifica che la cartella del sito esista if [ ! -d "$SITE_DIR" ]; then echo "Attenzione: La cartella $SITE_DIR non esiste" echo "Continuando solo con il backup del database..." else # Copia la cartella del sito echo "Copia della cartella del sito..." cp -r "$SITE_DIR" "$BACKUP_DIR/htdocs" if [ $? -ne 0 ]; then echo "Errore durante la copia della cartella del sito" send_gotify_notification "❌ Backup Fallito" "Errore durante la copia della cartella $SITE_DIR" 8 rm -rf "$BACKUP_DIR" exit 1 fi echo "Cartella del sito copiata con successo" fi # Crea archivio zip echo "Creazione archivio zip..." cd "$SCRIPT_DIR" zip -r "$ZIP_FILE" "backup_${DOMAIN}_$TIMESTAMP" if [ $? -ne 0 ]; then echo "Errore durante la creazione dell'archivio zip" send_gotify_notification "❌ Backup Fallito" "Errore durante la creazione dell'archivio zip per $DOMAIN" 8 rm -rf "$BACKUP_DIR" exit 1 fi echo "Archivio zip creato: $ZIP_FILE" # Rimuovi la directory temporanea echo "Pulizia file temporanei..." rm -rf "$BACKUP_DIR" BACKUP_SIZE=$(du -h "$ZIP_FILE" | cut -f1) echo "" echo "==========================================" echo "Backup completato con successo!" echo "File: $ZIP_FILE" echo "Dimensione: $BACKUP_SIZE" echo "==========================================" # Trasferisci il backup su server remoto transfer_to_remote "$ZIP_FILE" TRANSFER_STATUS=$? # Se il trasferimento è riuscito, rimuovi il file locale if [ $TRANSFER_STATUS -eq 0 ]; then echo "Rimozione file locale..." rm -f "$ZIP_FILE" echo "File zip rimosso dal locale, disponibile solo su $REMOTE_HOST" # Gestisci la retention dei backup sul server remoto cleanup_old_backups fi # Invia notifica di successo if [ $TRANSFER_STATUS -eq 0 ]; then send_gotify_notification "✅ Backup Completato" "Backup di $DOMAIN completato con successo\nFile: backup_${DOMAIN}_$TIMESTAMP.zip\nDimensione: $BACKUP_SIZE\nLocation: $REMOTE_HOST:$REMOTE_PATH/$DOMAIN/" 5 else send_gotify_notification "⚠️ Backup Parziale" "Backup di $DOMAIN completato localmente\nFile: $ZIP_FILE\nDimensione: $BACKUP_SIZE\nTrasferimento remoto fallito - File mantenuto in locale" 6 fi