Compare commits
3 Commits
3cd5d2d266
...
6ac3f069f0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ac3f069f0 | ||
|
|
2b51d7882c | ||
|
|
255260c979 |
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
### Windows
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
@@ -1,14 +1,9 @@
|
|||||||
# File di configurazione per le credenziali del database MySQL
|
# File di configurazione per il backup
|
||||||
# Rinominare questo file in .secret e inserire le credenziali reali
|
# Rinominare questo file in .secret.UTENTE e inserire i dati reali
|
||||||
|
|
||||||
|
DOMAIN=dominio.com
|
||||||
|
|
||||||
DB_HOST=localhost
|
DB_HOST=localhost
|
||||||
DB_NAME=nome_database
|
DB_NAME=nome_database
|
||||||
DB_USER=utente_mysql
|
DB_USER=utente_mysql
|
||||||
DB_PASS=password_mysql
|
DB_PASS=password_mysql
|
||||||
|
|
||||||
# Gotify
|
|
||||||
GOTIFY_URL="https://alert.qwince.com/message"
|
|
||||||
GOTIFY_TOKEN="ABnq7pJSSPrFRjx"
|
|
||||||
|
|
||||||
# Upload HTTP endpoint
|
|
||||||
UPLOAD_URL="http://192.168.0.10:8080/upload"
|
|
||||||
|
|||||||
49
README.md
49
README.md
@@ -17,6 +17,7 @@ Script bash per eseguire il backup automatico di un database MySQL e della carte
|
|||||||
|
|
||||||
2. Lo script ti chiederà:
|
2. Lo script ti chiederà:
|
||||||
- Nome utente
|
- Nome utente
|
||||||
|
- Dominio del sito (es. esempio.com)
|
||||||
- Host del database (default: localhost)
|
- Host del database (default: localhost)
|
||||||
- Nome del database
|
- Nome del database
|
||||||
- Utente del database (default: nome del database)
|
- Utente del database (default: nome del database)
|
||||||
@@ -24,26 +25,21 @@ Script bash per eseguire il backup automatico di un database MySQL e della carte
|
|||||||
|
|
||||||
3. Il file `.secret.UTENTE` verrà creato automaticamente con le credenziali fornite.
|
3. Il file `.secret.UTENTE` verrà creato automaticamente con le credenziali fornite.
|
||||||
|
|
||||||
4. (Opzionale) Modifica il file per configurare Gotify e upload remoto:
|
4. Rendi eseguibile lo script di backup:
|
||||||
```bash
|
```bash
|
||||||
nano .secret.UTENTE
|
chmod +x core.sh
|
||||||
```
|
|
||||||
|
|
||||||
5. Rendi eseguibile lo script di backup:
|
|
||||||
```bash
|
|
||||||
chmod +x backup.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Utilizzo
|
## Utilizzo
|
||||||
|
|
||||||
Esegui lo script specificando utente e dominio:
|
Esegui lo script specificando utente e dominio:
|
||||||
```bash
|
```bash
|
||||||
./backup.sh utente dominio
|
./core.sh utente dominio
|
||||||
```
|
```
|
||||||
|
|
||||||
Esempio:
|
Esempio:
|
||||||
```bash
|
```bash
|
||||||
./backup.sh myuser esempio.com
|
./core.sh myuser esempio.com
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configurazione su Webmin/Cron
|
## Configurazione su Webmin/Cron
|
||||||
@@ -59,12 +55,17 @@ Esempio:
|
|||||||
```bash
|
```bash
|
||||||
chmod +x init.sh
|
chmod +x init.sh
|
||||||
./init.sh
|
./init.sh
|
||||||
chmod +x backup.sh
|
chmod +x core.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Su cron manager inserisci:
|
3. Su cron manager inserisci:
|
||||||
```bash
|
```bash
|
||||||
/home/UTENTE/cloudpanel-backup/backup.sh UTENTE dominio.com
|
/home/UTENTE/cloudpanel-backup/backup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Oppure per un singolo sito:
|
||||||
|
```bash
|
||||||
|
/home/UTENTE/cloudpanel-backup/core.sh UTENTE dominio.com
|
||||||
```
|
```
|
||||||
|
|
||||||
## Funzionalità
|
## Funzionalità
|
||||||
@@ -72,11 +73,35 @@ Esempio:
|
|||||||
1. Esegue il dump del database MySQL specificato
|
1. Esegue il dump del database MySQL specificato
|
||||||
2. Copia la cartella `/home/UTENTE/htdocs/DOMINIO`
|
2. Copia la cartella `/home/UTENTE/htdocs/DOMINIO`
|
||||||
3. Crea un archivio ZIP contenente database e file del sito
|
3. Crea un archivio ZIP contenente database e file del sito
|
||||||
4. (Opzionale) Trasferisce il backup su server remoto
|
4. (Opzionale) Trasferisce il backup su server remoto via HTTP
|
||||||
5. (Opzionale) Invia notifiche via Gotify
|
5. (Opzionale) Invia notifiche via Gotify
|
||||||
6. Pulisce i file temporanei
|
6. Pulisce i file temporanei
|
||||||
7. Il file ZIP ha il formato: `backup_DOMINIO_YYYYMMDD_HHMMSS.zip`
|
7. Il file ZIP ha il formato: `backup_DOMINIO_YYYYMMDD_HHMMSS.zip`
|
||||||
|
|
||||||
|
## Configurazione Gotify e Upload remoto
|
||||||
|
|
||||||
|
Le impostazioni di Gotify e dell'endpoint di upload sono centralizzate nel file `core.sh` e non nei file `.secret.*`.
|
||||||
|
Per modificarle, edita direttamente `core.sh`:
|
||||||
|
```bash
|
||||||
|
# Gotify
|
||||||
|
GOTIFY_URL="https://alert.qwince.com/message"
|
||||||
|
GOTIFY_TOKEN="il_tuo_token"
|
||||||
|
|
||||||
|
# Upload HTTP endpoint
|
||||||
|
UPLOAD_URL="http://192.168.0.10:8080/upload"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backup multiplo
|
||||||
|
|
||||||
|
Per eseguire il backup di tutti i siti configurati:
|
||||||
|
```bash
|
||||||
|
chmod +x backup.sh
|
||||||
|
./backup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Lo script scopre automaticamente i siti dai file `.secret.*` presenti nella directory.
|
||||||
|
Ogni file `.secret.UTENTE` contiene il `DOMAIN` associato, quindi non serve mantenere elenchi manuali.
|
||||||
|
|
||||||
## Note di sicurezza
|
## Note di sicurezza
|
||||||
|
|
||||||
- Il file `.secret.UTENTE` contiene credenziali sensibili
|
- Il file `.secret.UTENTE` contiene credenziali sensibili
|
||||||
|
|||||||
242
backup.sh
242
backup.sh
@@ -1,195 +1,73 @@
|
|||||||
#!/bin/bash
|
#!/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
|
# Ottieni la directory dello script
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
SECRET_FILE="$SCRIPT_DIR/.secret.$USER"
|
|
||||||
|
|
||||||
# Verifica che il file .secret esista
|
LOG_DIR="/tmp/cloudpanel-backup-log"
|
||||||
if [ ! -f "$SECRET_FILE" ]; then
|
LOG_FILE="$LOG_DIR/backup_siti.log"
|
||||||
echo "Errore: File .secret non trovato in $SCRIPT_DIR"
|
BACKUP_SCRIPT="$SCRIPT_DIR/core.sh"
|
||||||
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
|
# Crea la directory dei log se non esiste
|
||||||
source "$SECRET_FILE"
|
mkdir -p "$LOG_DIR"
|
||||||
|
|
||||||
# Verifica che le variabili necessarie siano definite
|
# Cancella il log precedente
|
||||||
if [ -z "$DB_HOST" ] || [ -z "$DB_NAME" ] || [ -z "$DB_USER" ] || [ -z "$DB_PASS" ]; then
|
: > "$LOG_FILE"
|
||||||
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
|
exec > >(tee -a "$LOG_FILE") 2>&1
|
||||||
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 "Backup Siti"
|
||||||
|
echo "Data: $(date '+%d-%m-%Y %H:%M:%S')"
|
||||||
|
echo "=========================================="
|
||||||
echo ""
|
echo ""
|
||||||
echo "=========================================="
|
|
||||||
echo "Backup completato con successo!"
|
|
||||||
echo "File: $ZIP_FILE"
|
|
||||||
echo "Dimensione: $BACKUP_SIZE"
|
|
||||||
echo "=========================================="
|
|
||||||
|
|
||||||
# Trasferisci il backup su server remoto
|
# Scopri automaticamente i siti dai file .secret.*
|
||||||
transfer_to_remote "$ZIP_FILE"
|
TOTAL=0
|
||||||
TRANSFER_STATUS=$?
|
SUCCESS=0
|
||||||
|
FAILED=0
|
||||||
|
|
||||||
# Se il trasferimento è riuscito, rimuovi il file locale
|
for SECRET_FILE in "$SCRIPT_DIR"/.secret.*; do
|
||||||
if [ $TRANSFER_STATUS -eq 0 ]; then
|
# Ignora il file example
|
||||||
echo "Rimozione file locale..."
|
[ "$(basename "$SECRET_FILE")" = ".secret.example" ] && continue
|
||||||
rm -f "$ZIP_FILE"
|
[ ! -f "$SECRET_FILE" ] && continue
|
||||||
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
|
# Estrai lo username dal nome del file (.secret.USERNAME)
|
||||||
elif [ $TRANSFER_STATUS -eq 2 ]; then
|
USER=$(basename "$SECRET_FILE" | sed 's/^\.secret\.//')
|
||||||
# Server non disponibile - mantieni solo l'ultima copia locale
|
|
||||||
echo "Pulizia backup precedenti..."
|
# Leggi il DOMAIN dal file
|
||||||
find "$SCRIPT_DIR" -name "backup_${DOMAIN}_*.zip" -type f ! -name "backup_${DOMAIN}_$TIMESTAMP.zip" -delete
|
DOMAIN=$(grep -m1 '^DOMAIN=' "$SECRET_FILE" | cut -d'=' -f2-)
|
||||||
echo "Mantenuta solo l'ultima copia locale"
|
|
||||||
else
|
if [ -z "$DOMAIN" ]; then
|
||||||
# Errore durante il trasferimento - mantieni solo l'ultima copia locale
|
echo "⚠️ DOMAIN mancante in $SECRET_FILE, saltato"
|
||||||
echo "Pulizia backup precedenti..."
|
FAILED=$((FAILED + 1))
|
||||||
find "$SCRIPT_DIR" -name "backup_${DOMAIN}_*.zip" -type f ! -name "backup_${DOMAIN}_$TIMESTAMP.zip" -delete
|
TOTAL=$((TOTAL + 1))
|
||||||
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
|
echo ""
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
TOTAL=$((TOTAL + 1))
|
||||||
|
|
||||||
|
echo "→ Backup $DOMAIN (utente: $USER)"
|
||||||
|
"$BACKUP_SCRIPT" "$USER" "$DOMAIN"
|
||||||
|
EXIT_CODE=$?
|
||||||
|
|
||||||
|
if [ $EXIT_CODE -ne 0 ]; then
|
||||||
|
echo "❌ ERRORE backup $DOMAIN (exit code $EXIT_CODE)"
|
||||||
|
FAILED=$((FAILED + 1))
|
||||||
|
else
|
||||||
|
echo "✅ Backup completato $DOMAIN"
|
||||||
|
SUCCESS=$((SUCCESS + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $TOTAL -eq 0 ]; then
|
||||||
|
echo "Nessun file .secret.* trovato in $SCRIPT_DIR"
|
||||||
|
echo "Esegui ./init.sh per configurare un sito"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Backup terminato"
|
||||||
|
echo "Totale: $TOTAL | Riusciti: $SUCCESS | Falliti: $FAILED"
|
||||||
|
echo "=========================================="
|
||||||
|
|||||||
226
core.sh
Normal file
226
core.sh
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
#!/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"
|
||||||
|
|
||||||
|
# Gotify
|
||||||
|
GOTIFY_URL="https://alert.qwince.com/message"
|
||||||
|
GOTIFY_TOKEN="ABnq7pJSSPrFRjx"
|
||||||
|
|
||||||
|
# Upload HTTP endpoint
|
||||||
|
UPLOAD_URL="http://192.168.0.10:8080/upload"
|
||||||
|
|
||||||
|
# Numero di copie locali da mantenere (0 = elimina dopo upload riuscito)
|
||||||
|
LOCAL_RETENTION=0
|
||||||
|
|
||||||
|
# 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 "=========================================="
|
||||||
|
|
||||||
|
# Funzione per mantenere solo le ultime N copie locali
|
||||||
|
cleanup_local_backups() {
|
||||||
|
local keep=$1
|
||||||
|
if [ "$keep" -le 0 ]; then
|
||||||
|
# Rimuovi tutti i backup locali di questo dominio
|
||||||
|
find "$SCRIPT_DIR" -name "backup_${DOMAIN}_*.zip" -type f -delete
|
||||||
|
else
|
||||||
|
# Mantieni solo le ultime N copie
|
||||||
|
local count
|
||||||
|
count=$(find "$SCRIPT_DIR" -name "backup_${DOMAIN}_*.zip" -type f | wc -l)
|
||||||
|
if [ "$count" -gt "$keep" ]; then
|
||||||
|
find "$SCRIPT_DIR" -name "backup_${DOMAIN}_*.zip" -type f | sort | head -n -"$keep" | xargs rm -f
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Trasferisci il backup su server remoto
|
||||||
|
transfer_to_remote "$ZIP_FILE"
|
||||||
|
TRANSFER_STATUS=$?
|
||||||
|
|
||||||
|
# Gestione copie locali in base a LOCAL_RETENTION
|
||||||
|
if [ $TRANSFER_STATUS -eq 0 ]; then
|
||||||
|
if [ "$LOCAL_RETENTION" -le 0 ]; then
|
||||||
|
echo "Rimozione file locale..."
|
||||||
|
rm -f "$ZIP_FILE"
|
||||||
|
echo "File zip rimosso dal locale, disponibile solo sul server remoto"
|
||||||
|
else
|
||||||
|
echo "Mantenimento ultime $LOCAL_RETENTION copie locali..."
|
||||||
|
cleanup_local_backups "$LOCAL_RETENTION"
|
||||||
|
fi
|
||||||
|
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 copie locali
|
||||||
|
echo "Pulizia backup precedenti..."
|
||||||
|
cleanup_local_backups "$(( LOCAL_RETENTION > 0 ? LOCAL_RETENTION : 1 ))"
|
||||||
|
echo "Mantenute copie locali (server remoto non disponibile)"
|
||||||
|
else
|
||||||
|
# Errore durante il trasferimento - mantieni copie locali
|
||||||
|
echo "Pulizia backup precedenti..."
|
||||||
|
cleanup_local_backups "$(( LOCAL_RETENTION > 0 ? LOCAL_RETENTION : 1 ))"
|
||||||
|
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
|
||||||
10
init.sh
10
init.sh
@@ -15,6 +15,14 @@ if [ -z "$USERNAME" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Richiedi dominio
|
||||||
|
read -p "Inserisci il dominio (es. esempio.com): " DOMAIN
|
||||||
|
|
||||||
|
if [ -z "$DOMAIN" ]; then
|
||||||
|
echo "Errore: Dominio non può essere vuoto"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Configurazione database:"
|
echo "Configurazione database:"
|
||||||
echo "------------------------"
|
echo "------------------------"
|
||||||
@@ -67,6 +75,7 @@ fi
|
|||||||
cp "$EXAMPLE_FILE" "$SECRET_FILE"
|
cp "$EXAMPLE_FILE" "$SECRET_FILE"
|
||||||
|
|
||||||
# Sostituisci i valori nel file
|
# Sostituisci i valori nel file
|
||||||
|
sed -i "s/^DOMAIN=.*/DOMAIN=$DOMAIN/" "$SECRET_FILE"
|
||||||
sed -i "s/^DB_HOST=.*/DB_HOST=$DB_HOST/" "$SECRET_FILE"
|
sed -i "s/^DB_HOST=.*/DB_HOST=$DB_HOST/" "$SECRET_FILE"
|
||||||
sed -i "s/^DB_NAME=.*/DB_NAME=$DB_NAME/" "$SECRET_FILE"
|
sed -i "s/^DB_NAME=.*/DB_NAME=$DB_NAME/" "$SECRET_FILE"
|
||||||
sed -i "s/^DB_USER=.*/DB_USER=$DB_USER/" "$SECRET_FILE"
|
sed -i "s/^DB_USER=.*/DB_USER=$DB_USER/" "$SECRET_FILE"
|
||||||
@@ -78,6 +87,7 @@ echo "File $SECRET_FILE creato con successo!"
|
|||||||
echo "=========================================="
|
echo "=========================================="
|
||||||
echo ""
|
echo ""
|
||||||
echo "Configurazione salvata:"
|
echo "Configurazione salvata:"
|
||||||
|
echo " - Dominio: $DOMAIN"
|
||||||
echo " - Host: $DB_HOST"
|
echo " - Host: $DB_HOST"
|
||||||
echo " - Database: $DB_NAME"
|
echo " - Database: $DB_NAME"
|
||||||
echo " - Utente: $DB_USER"
|
echo " - Utente: $DB_USER"
|
||||||
|
|||||||
Reference in New Issue
Block a user