#!/bin/bash # Script di backup per database MySQL e cartella htdocs # Le credenziali del database devono essere nel file .secret # Uso: ./backup.sh user dominio # Verifica parametri user e dominio if [ -z "$1" ] || [ -z "$2" ]; then echo "Errore: Specificare user e dominio come parametri" echo "Uso: $0 user dominio" echo "Esempio: $0 utente esempio.com" exit 1 fi USER="$1" DOMAIN="$2" # Ottieni la directory dello script SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SECRET_FILE="$SCRIPT_DIR/.secret.$USER" # 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 trasferire il backup su server remoto via HTTP transfer_to_remote() { local file="$1" if [ -z "$UPLOAD_URL" ]; then echo "Attenzione: URL di upload non configurato, trasferimento saltato" return 0 fi # Verifica disponibilità del server echo "Verifica disponibilità server remoto..." SERVER_CHECK=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 "$UPLOAD_URL" 2>/dev/null) if [ $? -ne 0 ] || [ -z "$SERVER_CHECK" ]; then echo "⚠️ Server remoto non raggiungibile" send_gotify_notification "⚠️ [ $DOMAIN ] Backup Locale" "Data: $DATE_FORMAT\nBackup di $DOMAIN completato\nServer remoto non disponibile\nFile mantenuto in locale: backup_${DOMAIN}_$TIMESTAMP.zip" 6 return 2 fi echo "Server disponibile (HTTP $SERVER_CHECK)" echo "Trasferimento backup su server remoto via HTTP..." echo "" # Upload del file via curl con barra di progresso RESPONSE=$(curl -X POST "$UPLOAD_URL" -F "file=@$file" -#) echo "" if [ $? -ne 0 ]; then echo "Errore durante il trasferimento del backup" send_gotify_notification "⚠️ [ $DOMAIN ] Backup Parziale" "Data: $DATE_FORMAT\nBackup di $DOMAIN completato ma trasferimento remoto fallito" 6 return 1 fi # Verifica la risposta if echo "$RESPONSE" | grep -q '"status":"ok"'; then echo "Backup trasferito con successo" echo "Risposta server: $RESPONSE" return 0 else echo "Errore: Risposta server non valida" echo "Risposta: $RESPONSE" send_gotify_notification "⚠️ [ $DOMAIN ] Backup Parziale" "Data: $DATE_FORMAT\nBackup di $DOMAIN completato ma upload fallito" 6 return 1 fi } # Configurazione TIMESTAMP=$(date +"%Y%m%d_%H%M%S") DATE_FORMAT=$(date +"%d/%m/%Y") BACKUP_DIR="$SCRIPT_DIR/backup_${DOMAIN}_$TIMESTAMP" SITE_DIR="/home/${USER}/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 "❌ [ $DOMAIN ] Backup Fallito" "Data: $DATE_FORMAT\nErrore 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 "❌ [ $DOMAIN ] Backup Fallito" "Data: $DATE_FORMAT\nErrore 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 "❌ [ $DOMAIN ] Backup Fallito" "Data: $DATE_FORMAT\nErrore 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 sul server remoto" send_gotify_notification "✅ [ $DOMAIN ] Backup Completato" "Data: $DATE_FORMAT\nBackup di $DOMAIN completato con successo\nFile: backup_${DOMAIN}_$TIMESTAMP.zip\nDimensione: $BACKUP_SIZE\nCaricato sul server remoto" 5 elif [ $TRANSFER_STATUS -eq 2 ]; then # Server non disponibile - mantieni solo l'ultima copia locale echo "Pulizia backup precedenti..." find "$SCRIPT_DIR" -name "backup_${DOMAIN}_*.zip" -type f ! -name "backup_${DOMAIN}_$TIMESTAMP.zip" -delete echo "Mantenuta solo l'ultima copia locale" else # Errore durante il trasferimento - mantieni solo l'ultima copia locale echo "Pulizia backup precedenti..." find "$SCRIPT_DIR" -name "backup_${DOMAIN}_*.zip" -type f ! -name "backup_${DOMAIN}_$TIMESTAMP.zip" -delete send_gotify_notification "⚠️ Backup Parziale" "Data: $DATE_FORMAT\nBackup di $DOMAIN completato localmente\nFile: backup_${DOMAIN}_$TIMESTAMP.zip\nDimensione: $BACKUP_SIZE\nTrasferimento remoto fallito - File mantenuto in locale" 6 fi