206 lines
7.0 KiB
Bash
206 lines
7.0 KiB
Bash
#!/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
|