#!/bin/bash CONFIG_FILE=~/.mysql_telegram_backup.conf # Prevent running via pipe if [ ! -t 0 ]; then echo "❌ Error: This script is interactive and cannot be run with a pipe." echo "Please download and run it locally:" echo "curl -L https://raw.githubusercontent.com/zamibd/database-backup-telegram/main/install.sh -o install.sh" echo "chmod +x install.sh" echo "./install.sh" exit 1 fi # If config file exists, delete it unconditionally for fresh setup if [ -f "${CONFIG_FILE}" ]; then echo "⚠️ Existing config file found. Deleting it for fresh setup..." rm -f "${CONFIG_FILE}" fi # Setup: get user input and save config echo "--- MySQL Telegram Backup: Fresh Setup ---" read -p "Enter your Telegram Bot Token: " BOT_TOKEN read -p "Enter your Telegram Chat ID: " CHAT_ID read -p "Enter your MySQL Username (e.g., root): " DB_USER read -sp "Enter your MySQL Password: " DB_PASS echo read -p "Enter full path for backup directory (default: /root/backups): " BACKUP_DIR # Use default backup directory if none provided if [ -z "$BACKUP_DIR" ]; then BACKUP_DIR="/root/backups" echo "No backup directory entered. Using default: $BACKUP_DIR" fi cat > "${CONFIG_FILE}" << EOF # MySQL Telegram Backup Configuration BOT_TOKEN='${BOT_TOKEN}' CHAT_ID='${CHAT_ID}' DB_USER='${DB_USER}' DB_PASS='${DB_PASS}' BACKUP_DIR='${BACKUP_DIR}' DAYS_TO_KEEP=7 EOF chmod 600 "${CONFIG_FILE}" echo "✅ Configuration saved to ${CONFIG_FILE}" # Add cronjob for daily backup at 2 AM if not already added SCRIPT_PATH=$(realpath "$0") CRON_CMD="0 2 * * * bash $SCRIPT_PATH >> /var/log/mysql_telegram_backup.log 2>&1" (crontab -l 2>/dev/null | grep -Fv "$SCRIPT_PATH"; echo "$CRON_CMD") | crontab - echo "✅ Cronjob added to run daily at 2 AM" # Run backup immediately after setup echo "--> Running backup now..." source "${CONFIG_FILE}" BACKUP_DIR=$(eval echo "${BACKUP_DIR}") mkdir -p "${BACKUP_DIR}" BACKUP_FILE="${BACKUP_DIR}/all_db_backup_$(date +%F).sql.gz" CAPTION="✅ MySQL Backup | Host: $(hostname) | Date: $(date +%d-%b-%Y)" export MYSQL_PWD="${DB_PASS}" echo "Step 1: Creating database backup..." if ! mysqldump -u "${DB_USER}" --all-databases | gzip > "${BACKUP_FILE}"; then echo "❌ MySQL dump failed." unset MYSQL_PWD exit 1 fi unset MYSQL_PWD if [ ! -s "${BACKUP_FILE}" ]; then echo "❌ Backup file not created or empty." exit 1 fi echo "Step 2: Sending backup to Telegram..." curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendDocument" \ -F "chat_id=${CHAT_ID}" \ -F "document=@${BACKUP_FILE}" \ -F "caption=${CAPTION}" > /dev/null echo "Step 3: Removing backups older than ${DAYS_TO_KEEP} days..." find "${BACKUP_DIR}" -type f -name "*.sql.gz" -mtime +${DAYS_TO_KEEP} -delete echo "--> ✅ Backup complete!"