#!/usr/bin/env bash # Backup utility for all services # Usage: ./bin/backup.sh [service] set -euo pipefail # Source shared library SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/lib/common.sh" readonly BACKUP_ROOT="${BACKUP_ROOT:-./backups}" readonly TIMESTAMP=$(date +%Y%m%d-%H%M%S) backup_minecraft() { log_info "Backing up Minecraft server..." local backup_dir="$BACKUP_ROOT/minecraft/$TIMESTAMP" ensure_dir "$backup_dir" # Backup world data if [[ -d "minecraft/data" ]]; then log_info " Archiving world data..." tar -czf "$backup_dir/world-data.tar.gz" -C minecraft data 2>/dev/null || { log_error " Failed to backup world data" return 1 } log_info " ✓ World data backed up" fi # Backup configs if [[ -d "minecraft/configs" ]]; then log_info " Archiving configs..." tar -czf "$backup_dir/configs.tar.gz" -C minecraft configs 2>/dev/null || { log_warn " Failed to backup configs" } fi # Create manifest cat > "$backup_dir/manifest.txt" </dev/null || { log_error " Failed to export volume" return 1 } log_info " ✓ Volume data backed up" fi log_info " ✓ Backup complete: $backup_dir" } backup_nextcloud() { log_info "Backing up Nextcloud..." local backup_dir="$BACKUP_ROOT/nextcloud/$TIMESTAMP" ensure_dir "$backup_dir" # Backup database log_info " Backing up database..." docker exec nextcloud-db mariadb-dump -unextcloud -p"${MYSQL_PASSWORD:-ChangeDb123!}" nextcloud \ > "$backup_dir/database.sql" 2>/dev/null || { log_error " Database backup failed" } # Export volumes for vol in nextcloud_html nextcloud_data nextcloud_config nextcloud_apps; do if docker volume ls | grep -q "$vol"; then log_info " Exporting $vol..." docker run --rm -v "$vol":/data -v "$PWD/$backup_dir":/backup \ alpine tar -czf "/backup/${vol}.tar.gz" -C /data . 2>/dev/null || { log_warn " Failed to export $vol" } fi done # Create manifest cat > "$backup_dir/manifest.txt" < [options] Commands: backup [service] Create backup (default: all) list List available backups cleanup [days] Remove backups older than N days (default: 7) Services: minecraft, teamspeak, nextcloud, all Examples: $0 backup minecraft $0 list $0 cleanup 30 EOF exit 1 ;; esac } main "$@"