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