#!/bin/bash # # Crumbforest Backup Script # Creates backup of application, database, and Qdrant data # # Run as root or with sudo # set -e # Colors GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' BLUE='\033[0;34m' NC='\033[0m' # Configuration INSTALL_DIR="/opt/crumbforest" BACKUP_BASE="/var/backups/crumbforest" DB_NAME="crumbforest" DB_USER="crumb_prod" QDRANT_STORAGE="/var/lib/qdrant/storage" # Functions print_success() { echo -e "${GREEN}✓${NC} $1" } print_warning() { echo -e "${YELLOW}⚠${NC} $1" } print_error() { echo -e "${RED}✗${NC} $1" } print_info() { echo -e "${BLUE}ℹ${NC} $1" } check_root() { if [ "$EUID" -ne 0 ]; then print_error "Bitte als root ausführen oder sudo verwenden" exit 1 fi } echo "============================================" echo "💾 Crumbforest Backup" echo "============================================" echo "" check_root # Create backup directory mkdir -p "$BACKUP_BASE" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="$BACKUP_BASE/backup_$TIMESTAMP" mkdir -p "$BACKUP_DIR" print_info "Backup Location: $BACKUP_DIR" echo "" # Step 1: Backup application files echo "=== Step 1: Application Files ===" echo "" print_info "Sichere Application Code..." tar -czf "$BACKUP_DIR/app.tar.gz" -C "$INSTALL_DIR" app/ 2>/dev/null print_success "App gesichert" print_info "Sichere Dokumentation..." if [ -d "$INSTALL_DIR/docs" ]; then tar -czf "$BACKUP_DIR/docs.tar.gz" -C "$INSTALL_DIR" docs/ 2>/dev/null print_success "Docs gesichert" fi print_info "Sichere .env Datei..." cp "$INSTALL_DIR/.env" "$BACKUP_DIR/env.backup" chmod 600 "$BACKUP_DIR/env.backup" print_success ".env gesichert" echo "" # Step 2: Backup database echo "=== Step 2: Database ===" echo "" print_info "Sichere MariaDB Datenbank..." # Read DB password from .env if [ -f "$INSTALL_DIR/.env" ]; then source <(grep MARIADB_PASSWORD "$INSTALL_DIR/.env") if mysqldump -u "$DB_USER" -p"$MARIADB_PASSWORD" "$DB_NAME" > "$BACKUP_DIR/database.sql" 2>/dev/null; then print_success "Datenbank gesichert" else print_error "Datenbank-Backup fehlgeschlagen" print_warning "Möglicherweise falsche Credentials in .env" fi else print_warning ".env nicht gefunden - Datenbank-Backup übersprungen" fi echo "" # Step 3: Backup Qdrant data echo "=== Step 3: Qdrant Vector Database ===" echo "" if [ -d "$QDRANT_STORAGE" ]; then print_info "Sichere Qdrant Daten..." tar -czf "$BACKUP_DIR/qdrant.tar.gz" -C "$(dirname $QDRANT_STORAGE)" "$(basename $QDRANT_STORAGE)/" 2>/dev/null print_success "Qdrant gesichert" else print_warning "Qdrant Storage nicht gefunden: $QDRANT_STORAGE" fi echo "" # Step 4: Backup logs (optional, last 7 days) echo "=== Step 4: Logs (Optional) ===" echo "" print_info "Sichere aktuelle Logs..." if [ -d "/var/log/crumbforest" ]; then tar -czf "$BACKUP_DIR/logs.tar.gz" -C /var/log crumbforest/ 2>/dev/null print_success "Logs gesichert" fi # systemd logs print_info "Exportiere systemd Logs..." journalctl -u crumbforest --since "7 days ago" > "$BACKUP_DIR/systemd.log" 2>/dev/null || true echo "" # Step 5: Create combined archive echo "=== Step 5: Final Archive ===" echo "" FINAL_ARCHIVE="$BACKUP_BASE/crumbforest_full_$TIMESTAMP.tar.gz" print_info "Erstelle finales Archiv..." tar -czf "$FINAL_ARCHIVE" -C "$BACKUP_BASE" "backup_$TIMESTAMP/" print_success "Archiv erstellt: $FINAL_ARCHIVE" # Calculate size ARCHIVE_SIZE=$(du -h "$FINAL_ARCHIVE" | cut -f1) print_info "Größe: $ARCHIVE_SIZE" # Clean up temporary directory rm -rf "$BACKUP_DIR" print_success "Temp-Verzeichnis bereinigt" echo "" # Step 6: Cleanup old backups (keep last 7) echo "=== Step 6: Cleanup Old Backups ===" echo "" print_info "Lösche alte Backups (behalte letzte 7)..." cd "$BACKUP_BASE" ls -t crumbforest_full_*.tar.gz 2>/dev/null | tail -n +8 | xargs rm -f 2>/dev/null || true REMAINING=$(ls -1 crumbforest_full_*.tar.gz 2>/dev/null | wc -l) print_success "Anzahl Backups: $REMAINING" echo "" # Summary echo "============================================" echo "✓ Backup abgeschlossen!" echo "============================================" echo "" echo "Backup Archiv: $FINAL_ARCHIVE" echo "Größe: $ARCHIVE_SIZE" echo "" echo "Inhalt:" echo " ✓ Application Code" echo " ✓ Dokumentation" echo " ✓ .env Konfiguration" echo " ✓ MariaDB Datenbank" echo " ✓ Qdrant Vector DB" echo " ✓ Logs (7 Tage)" echo "" echo "Wiederherstellung:" echo " 1. Archiv extrahieren: tar -xzf $FINAL_ARCHIVE" echo " 2. Datenbank: mysql -u $DB_USER -p $DB_NAME < database.sql" echo " 3. Qdrant: tar -xzf qdrant.tar.gz -C /var/lib/" echo " 4. App: tar -xzf app.tar.gz -C $INSTALL_DIR/" echo " 5. .env: cp env.backup $INSTALL_DIR/.env" echo "" echo "Wuuuuhuuu! 🦉💚" echo ""