Files
cloudpanel-backup/backup.sh
2025-12-11 16:42:27 +01:00

129 lines
3.9 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
}
# 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 "=========================================="
# Invia notifica di successo
send_gotify_notification "✅ Backup Completato" "Backup di $DOMAIN completato con successo\nFile: backup_${DOMAIN}_$TIMESTAMP.zip\nDimensione: $BACKUP_SIZE" 5