HEX
Server: Apache/2.4.62 (Ubuntu)
System: Linux smartkeyWeb 6.11.0-29-generic #29-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 13 20:29:41 UTC 2025 x86_64
User: www-data (33)
PHP: 8.3.11
Disabled: NONE
Upload Files
File: /var/www/html/bkpscript.sh
#!/bin/bash
DATETIME=$(date +%y%m%d-%H_%M_%S)
SRC=$1
DST=$2
GIVENNAME=$3
MYSQL_USER="root"  # :wrench: Update this if needed
MYSQL_PASSWORD="7iyaMi0R_2OgOst0HiSE"  # :wrench: Secure this properly
showhelp(){
    echo -e "\n\n############################################"
    echo "#              bkupscript.sh               #"
    echo "############################################"
    echo -e "\nThis script backs up either a file/folder OR all MySQL databases individually."
    echo -e "It then compresses the result and uploads it to DigitalOcean Spaces.\n"
    echo -e "Usage:"
    echo -e "  SRC: Path to file/folder, or use 'mysql' to back up MySQL DBs separately"
    echo -e "  DST: DigitalOcean Space name (e.g., myspace)"
    echo -e "  GIVENNAME: Base name for backup file (timestamp will be prepended)\n"
    echo -e "Examples:"
    echo -e "  MySQL Backup: sh bkupscript.sh mysql myspace mydbbackup"
    echo -e "  File Backup:  sh bkupscript.sh /var/www/html myspace sitebackup\n"
}
backup_mysql_individual(){
    echo -e "\n##### Backing Up Individual MySQL Databases #####\n"
    BACKUP_DIR="/var/www/html/database_backups"
    mkdir -p "$BACKUP_DIR"
    DBS=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
    for db in $DBS; do
        echo -e ":arrows_counterclockwise: Dumping database: $db"
        mysqldump -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" --databases "$db" --single-transaction > "${BACKUP_DIR}/${db}.sql" 2> "${BACKUP_DIR}/${db}.err"
        if [ $? -ne 0 ] || [ ! -s "${BACKUP_DIR}/${db}.sql" ]; then
            echo -e ":x: Failed to dump $db. Check ${BACKUP_DIR}/${db}.err"
        else
            echo -e ":white_check_mark: $db backed up"
        fi
    done
    echo -e "\n##### Compressing All DB Dumps #####\n"
    TAR_FILE="${GIVENNAME}-${DATETIME}.tar.gz"
    if tar -czvf "$TAR_FILE" -C "$(dirname "$BACKUP_DIR")" "$(basename "$BACKUP_DIR")"; then
        rm -rf "$BACKUP_DIR"
        echo -e ":white_check_mark: Compression complete: $TAR_FILE"
        return 0
    else
        echo -e ":x: Compression failed"
        return 1
    fi
}
backup_file_or_dir(){
    echo -e "\n##### Backing Up File/Folder: $SRC #####\n"
    TAR_FILE="${GIVENNAME}-${DATETIME}.tar.gz"
    if tar -czvf "$TAR_FILE" "$SRC"; then
        echo -e ":white_check_mark: File backup complete: $TAR_FILE"
        return 0
    else
        echo -e ":x: File backup failed"
        return 1
    fi
}
movetoSpace(){
    echo -e "\n##### Uploading to DigitalOcean Space: $DST #####\n"
    TAR_FILE="${GIVENNAME}-${DATETIME}.tar.gz"

    if s3cmd put "$TAR_FILE" s3://"$DST"/; then
        echo -e ":white_check_mark: Upload successful: s3://$DST/$TAR_FILE"

        # Skip remote cleanup
        # echo -e "🧹 Skipping remote DigitalOcean cleanup..."

        # Local cleanup (keep only the current backup)
        echo -e "🧹 Cleaning local backups..."
        find . -maxdepth 1 -name "${GIVENNAME}-*.tar.gz" ! -name "$TAR_FILE" -exec rm -f {} \;

        return 0
    else
        echo -e ":x: Upload failed"
        return 1
    fi
}

Main Logic =====
if [ -z "$SRC" ] || [ -z "$DST" ] || [ -z "$GIVENNAME" ]; then
    showhelp
    exit 1
fi
if [ "$SRC" == "mysql" ]; then
    if backup_mysql_individual; then
        movetoSpace
    else
        echo -e "\n:x: MySQL Backup Process Failed\n"
        exit 1
    fi
else
    if backup_file_or_dir; then
        movetoSpace
    else
        echo -e "\n:x: File/Folder Backup Process Failed\n"
        exit 1
    fi
fi