Add production build optimizations to Vite configuration; set target, output directory, and minification options for improved performance
This commit is contained in:
275
scripts/restore-backup.sh
Executable file
275
scripts/restore-backup.sh
Executable file
@@ -0,0 +1,275 @@
|
||||
#!/bin/bash
|
||||
|
||||
# =============================================================================
|
||||
# TimeClock v3 - Backup-Restore Script
|
||||
# =============================================================================
|
||||
# Stellt ein Datenbank-Backup wieder her
|
||||
#
|
||||
# Verwendung:
|
||||
# ./restore-backup.sh [BACKUP_FILE]
|
||||
# ./restore-backup.sh # Zeigt Liste der verfügbaren Backups
|
||||
# ./restore-backup.sh timeclock_db_20251018_020000.sql.gz
|
||||
#
|
||||
# WARNUNG: Dies überschreibt die aktuelle Datenbank!
|
||||
# =============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# Farben
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Konfiguration
|
||||
BACKUP_DIR="/var/backups/timeclock"
|
||||
PROJECT_DIR="/var/www/timeclock"
|
||||
ENV_FILE="$PROJECT_DIR/backend/.env"
|
||||
|
||||
# Logging
|
||||
log() {
|
||||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}✅ $1${NC}"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}❌ $1${NC}"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Voraussetzungen prüfen
|
||||
# =============================================================================
|
||||
|
||||
if [ ! -f "$ENV_FILE" ]; then
|
||||
log_error ".env Datei nicht gefunden: $ENV_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BACKUP_DIR" ]; then
|
||||
log_error "Backup-Verzeichnis nicht gefunden: $BACKUP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Datenbank-Credentials aus .env lesen
|
||||
# =============================================================================
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
# =============================================================================
|
||||
# Verfügbare Backups auflisten
|
||||
# =============================================================================
|
||||
|
||||
list_backups() {
|
||||
echo ""
|
||||
log "Verfügbare Backups in $BACKUP_DIR:"
|
||||
echo ""
|
||||
|
||||
BACKUPS=($(ls -t "$BACKUP_DIR"/timeclock_db_*.sql.gz 2>/dev/null))
|
||||
|
||||
if [ ${#BACKUPS[@]} -eq 0 ]; then
|
||||
log_warning "Keine Backups gefunden!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for i in "${!BACKUPS[@]}"; do
|
||||
BACKUP="${BACKUPS[$i]}"
|
||||
FILENAME=$(basename "$BACKUP")
|
||||
SIZE=$(du -h "$BACKUP" | cut -f1)
|
||||
DATE=$(stat -c %y "$BACKUP" | cut -d'.' -f1)
|
||||
|
||||
printf "%2d) %-50s %6s %s\n" $((i+1)) "$FILENAME" "$SIZE" "$DATE"
|
||||
done
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Backup-Datei auswählen
|
||||
# =============================================================================
|
||||
|
||||
select_backup() {
|
||||
list_backups
|
||||
|
||||
read -p "Wähle ein Backup (Nummer) oder 'q' zum Beenden: " selection
|
||||
|
||||
if [ "$selection" = "q" ] || [ "$selection" = "Q" ]; then
|
||||
log "Abgebrochen."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! [[ "$selection" =~ ^[0-9]+$ ]]; then
|
||||
log_error "Ungültige Eingabe!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BACKUPS=($(ls -t "$BACKUP_DIR"/timeclock_db_*.sql.gz 2>/dev/null))
|
||||
INDEX=$((selection - 1))
|
||||
|
||||
if [ $INDEX -lt 0 ] || [ $INDEX -ge ${#BACKUPS[@]} ]; then
|
||||
log_error "Ungültige Auswahl!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BACKUP_FILE="${BACKUPS[$INDEX]}"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Restore durchführen
|
||||
# =============================================================================
|
||||
|
||||
restore_backup() {
|
||||
local backup_file=$1
|
||||
|
||||
if [ ! -f "$backup_file" ]; then
|
||||
log_error "Backup-Datei nicht gefunden: $backup_file"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
log_warning "WARNUNG: Dies wird die aktuelle Datenbank '$DB_NAME' überschreiben!"
|
||||
log "Backup-Datei: $(basename $backup_file)"
|
||||
log "Größe: $(du -h $backup_file | cut -f1)"
|
||||
log "Datenbank: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME"
|
||||
echo ""
|
||||
|
||||
read -p "Fortfahren? (yes/no): " confirm
|
||||
|
||||
if [ "$confirm" != "yes" ]; then
|
||||
log "Abgebrochen."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Erstelle Backup der aktuellen Datenbank (Sicherheitskopie)
|
||||
log "Erstelle Sicherheitskopie der aktuellen Datenbank..."
|
||||
SAFETY_BACKUP="$BACKUP_DIR/timeclock_db_pre_restore_$(date +%Y%m%d_%H%M%S).sql.gz"
|
||||
|
||||
if mysqldump \
|
||||
--host="$DB_HOST" \
|
||||
--port="$DB_PORT" \
|
||||
--user="$DB_USER" \
|
||||
--password="$DB_PASSWORD" \
|
||||
--single-transaction \
|
||||
--databases "$DB_NAME" \
|
||||
| gzip > "$SAFETY_BACKUP"; then
|
||||
log_success "Sicherheitskopie erstellt: $(basename $SAFETY_BACKUP)"
|
||||
else
|
||||
log_error "Sicherheitskopie fehlgeschlagen!"
|
||||
read -p "Trotzdem fortfahren? (yes/no): " force
|
||||
if [ "$force" != "yes" ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Restore durchführen
|
||||
log "Stelle Backup wieder her..."
|
||||
|
||||
# Datenbank leeren (optional, aber empfohlen)
|
||||
log "Leere Datenbank..."
|
||||
mysql \
|
||||
--host="$DB_HOST" \
|
||||
--port="$DB_PORT" \
|
||||
--user="$DB_USER" \
|
||||
--password="$DB_PASSWORD" \
|
||||
-e "DROP DATABASE IF EXISTS $DB_NAME; CREATE DATABASE $DB_NAME;"
|
||||
|
||||
# Backup einspielen
|
||||
if gunzip < "$backup_file" | mysql \
|
||||
--host="$DB_HOST" \
|
||||
--port="$DB_PORT" \
|
||||
--user="$DB_USER" \
|
||||
--password="$DB_PASSWORD"; then
|
||||
|
||||
log_success "Backup erfolgreich wiederhergestellt!"
|
||||
|
||||
# Datenbank-Statistiken
|
||||
TABLE_COUNT=$(mysql \
|
||||
--host="$DB_HOST" \
|
||||
--port="$DB_PORT" \
|
||||
--user="$DB_USER" \
|
||||
--password="$DB_PASSWORD" \
|
||||
-e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '$DB_NAME';" -s -N)
|
||||
|
||||
log "Datenbank-Statistik:"
|
||||
log " 📊 Tabellen: $TABLE_COUNT"
|
||||
|
||||
# Optional: Service neu starten
|
||||
log_warning "Möchtest du den Backend-Service neu starten?"
|
||||
read -p "Service neu starten? (y/n): " restart
|
||||
|
||||
if [ "$restart" = "y" ] || [ "$restart" = "Y" ]; then
|
||||
if command -v pm2 &> /dev/null && pm2 list | grep -q "timeclock-backend"; then
|
||||
pm2 restart timeclock-backend
|
||||
log_success "PM2-Service neu gestartet"
|
||||
elif systemctl is-active --quiet timeclock; then
|
||||
sudo systemctl restart timeclock
|
||||
log_success "systemd-Service neu gestartet"
|
||||
else
|
||||
log_warning "Service-Verwaltung nicht gefunden - bitte manuell neu starten"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
log_success "Restore abgeschlossen!"
|
||||
log "Sicherheitskopie der alten Datenbank: $(basename $SAFETY_BACKUP)"
|
||||
|
||||
else
|
||||
log_error "Restore fehlgeschlagen!"
|
||||
log "Die Sicherheitskopie befindet sich unter: $(basename $SAFETY_BACKUP)"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Hauptprogramm
|
||||
# =============================================================================
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}════════════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${BLUE} TimeClock v3 - Backup Restore${NC}"
|
||||
echo -e "${BLUE}════════════════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
|
||||
# Wenn Backup-Datei als Argument übergeben wurde
|
||||
if [ $# -eq 1 ]; then
|
||||
BACKUP_FILE="$1"
|
||||
|
||||
# Wenn nur Dateiname (ohne Pfad) übergeben wurde
|
||||
if [ ! -f "$BACKUP_FILE" ]; then
|
||||
BACKUP_FILE="$BACKUP_DIR/$1"
|
||||
fi
|
||||
|
||||
restore_backup "$BACKUP_FILE"
|
||||
else
|
||||
# Interaktive Auswahl
|
||||
select_backup
|
||||
restore_backup "$BACKUP_FILE"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user