Files
stechuhr3/scripts/backup-timeclock.sh

224 lines
6.9 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# TimeClock v3 - Automatisches Backup-Script
# =============================================================================
# Erstellt tägliche Backups der Datenbank und optional des Codes
#
# Installation:
# sudo cp backup-timeclock.sh /usr/local/bin/
# sudo chmod +x /usr/local/bin/backup-timeclock.sh
#
# Cronjob einrichten (täglich um 2 Uhr):
# sudo crontab -e
# 0 2 * * * /usr/local/bin/backup-timeclock.sh >> /var/log/timeclock/backup.log 2>&1
#
# Manuell ausführen:
# /usr/local/bin/backup-timeclock.sh
# =============================================================================
set -e
# Konfiguration
BACKUP_DIR="/var/backups/timeclock"
PROJECT_DIR="/var/www/timeclock"
ENV_FILE="$PROJECT_DIR/backend/.env"
RETENTION_DAYS=30 # Backups älter als X Tage werden gelöscht
# Datum
DATE=$(date +%Y%m%d_%H%M%S)
DATE_READABLE=$(date '+%Y-%m-%d %H:%M:%S')
# Logging
log() {
echo "[${DATE_READABLE}] $1"
}
log_error() {
echo "[${DATE_READABLE}] ERROR: $1" >&2
}
# =============================================================================
# Voraussetzungen prüfen
# =============================================================================
if [ ! -f "$ENV_FILE" ]; then
log_error ".env Datei nicht gefunden: $ENV_FILE"
exit 1
fi
# Backup-Verzeichnis erstellen
mkdir -p "$BACKUP_DIR"
# =============================================================================
# Datenbank-Credentials aus .env lesen
# =============================================================================
log "Lese Datenbank-Konfiguration..."
# Funktion zum Auslesen von .env Werten
get_env_value() {
grep "^$1=" "$ENV_FILE" | cut -d '=' -f2- | tr -d '"' | tr -d "'"
}
DB_HOST=$(get_env_value "DB_HOST")
DB_PORT=$(get_env_value "DB_PORT")
DB_NAME=$(get_env_value "DB_NAME")
DB_USER=$(get_env_value "DB_USER")
DB_PASSWORD=$(get_env_value "DB_PASSWORD")
# Defaults setzen
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-3306}
if [ -z "$DB_NAME" ] || [ -z "$DB_USER" ] || [ -z "$DB_PASSWORD" ]; then
log_error "Datenbank-Credentials unvollständig in .env"
exit 1
fi
log "Datenbank: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME"
# =============================================================================
# Datenbank-Backup erstellen
# =============================================================================
log "Erstelle Datenbank-Backup..."
BACKUP_FILE="$BACKUP_DIR/timeclock_db_$DATE.sql.gz"
# mysqldump mit Kompression
if mysqldump \
--host="$DB_HOST" \
--port="$DB_PORT" \
--user="$DB_USER" \
--password="$DB_PASSWORD" \
--single-transaction \
--routines \
--triggers \
--events \
--add-drop-database \
--databases "$DB_NAME" \
| gzip > "$BACKUP_FILE"; then
# Dateigröße ermitteln
SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log "✅ Datenbank-Backup erfolgreich erstellt: $BACKUP_FILE ($SIZE)"
else
log_error "Datenbank-Backup fehlgeschlagen!"
exit 1
fi
# =============================================================================
# Code-Backup erstellen (optional)
# =============================================================================
BACKUP_CODE=false # Auf true setzen für Code-Backups
if [ "$BACKUP_CODE" = true ]; then
log "Erstelle Code-Backup..."
CODE_BACKUP_FILE="$BACKUP_DIR/timeclock_code_$DATE.tar.gz"
if tar -czf "$CODE_BACKUP_FILE" \
-C "$(dirname $PROJECT_DIR)" \
--exclude="node_modules" \
--exclude="dist" \
--exclude=".git" \
--exclude="*.log" \
"$(basename $PROJECT_DIR)"; then
SIZE=$(du -h "$CODE_BACKUP_FILE" | cut -f1)
log "✅ Code-Backup erfolgreich erstellt: $CODE_BACKUP_FILE ($SIZE)"
else
log_error "Code-Backup fehlgeschlagen!"
fi
fi
# =============================================================================
# Alte Backups löschen
# =============================================================================
log "Lösche alte Backups (älter als $RETENTION_DAYS Tage)..."
# Datenbank-Backups
DELETED_DB=$(find "$BACKUP_DIR" -name "timeclock_db_*.sql.gz" -mtime +$RETENTION_DAYS -type f -delete -print | wc -l)
if [ "$DELETED_DB" -gt 0 ]; then
log "🗑️ $DELETED_DB alte Datenbank-Backups gelöscht"
fi
# Code-Backups
if [ "$BACKUP_CODE" = true ]; then
DELETED_CODE=$(find "$BACKUP_DIR" -name "timeclock_code_*.tar.gz" -mtime +$RETENTION_DAYS -type f -delete -print | wc -l)
if [ "$DELETED_CODE" -gt 0 ]; then
log "🗑️ $DELETED_CODE alte Code-Backups gelöscht"
fi
fi
# =============================================================================
# Backup-Statistik
# =============================================================================
log "Backup-Statistik:"
log " 📊 Gesamt-Backups: $(ls -1 $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | wc -l)"
log " 💾 Gesamtgröße: $(du -sh $BACKUP_DIR | cut -f1)"
log " 📅 Ältestes Backup: $(ls -t $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | tail -1 | xargs basename)"
log " 📅 Neuestes Backup: $(ls -t $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | head -1 | xargs basename)"
# =============================================================================
# Optional: Backup an Remote-Server senden
# =============================================================================
REMOTE_BACKUP=false # Auf true setzen für Remote-Backup
REMOTE_USER="backup"
REMOTE_HOST="backup.example.com"
REMOTE_PATH="/backups/timeclock"
if [ "$REMOTE_BACKUP" = true ]; then
log "Sende Backup an Remote-Server..."
if rsync -az --progress "$BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/"; then
log "✅ Remote-Backup erfolgreich"
else
log_error "Remote-Backup fehlgeschlagen!"
fi
fi
# =============================================================================
# Optional: Backup-Benachrichtigung per E-Mail
# =============================================================================
SEND_EMAIL=false # Auf true setzen für E-Mail-Benachrichtigung
EMAIL_TO="admin@tsschulz.de"
if [ "$SEND_EMAIL" = true ] && command -v mail &> /dev/null; then
log "Sende E-Mail-Benachrichtigung..."
SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "TimeClock Backup erfolgreich erstellt
Datum: $DATE_READABLE
Datei: $BACKUP_FILE
Größe: $SIZE
Datenbank: $DB_NAME
Backup-Verzeichnis: $BACKUP_DIR
Anzahl Backups: $(ls -1 $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | wc -l)
Gesamtgröße: $(du -sh $BACKUP_DIR | cut -f1)
--
TimeClock v3 Backup System
" | mail -s "✅ TimeClock Backup erfolgreich ($DATE)" "$EMAIL_TO"
log "📧 E-Mail gesendet an $EMAIL_TO"
fi
# =============================================================================
# Fertig
# =============================================================================
log "✅ Backup-Prozess abgeschlossen!"
exit 0