194 lines
4.7 KiB
Bash
Executable File
194 lines
4.7 KiB
Bash
Executable File
#!/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 ""
|