#!/bin/bash # ================================================================= # CONFIGURACIÓN PRINCIPAL # ================================================================= # Configuración de fecha FECHA=$(date +"%Y-%m-%d_%H-%M-%S") DIA=$(date +"%d") MES=$(date +"%B" | tr '[:upper:]' '[:lower:]') ANO=$(date +"%Y") # Configuración de directorios DOMINIO="2pm.mx" DIR_ACTUAL="/home/mgxbwxxn/domains/$DOMINIO/public_html" DIR_TEMP="$DIR_ACTUAL/temp_backup_$FECHA" LOG="$DIR_ACTUAL/backup_ftp.log" NOMBRE_ZIP="${DOMINIO}_backup_${DIA}_${MES}_${ANO}_${FECHA}.zip" RUTA_ZIP="$DIR_ACTUAL/$NOMBRE_ZIP" # Configuración de la base de datos DB_HOST="localhost" DB_NAME="mugowhbg_noticiasdemas_2d2t" DB_USER="mugowhbg_noticiasdemas_2d2t" DB_PASS="dxaJBSK39YAE3vhDd2wE" SQL_FILE="$DIR_TEMP/database_backup.sql" # Configuración FTP BunnyCDN FTP_HOST="161.129.68.210" FTP_USER="respaldo@hdsystems.com.mx" FTP_PASS="gW9NbF6YzbXSJkv5UKA7" FTP_DIR="/noticiasdemas" # Configuración SMTP para notificaciones por email SMTP_SERVER="blizzard.mxrouting.net" # Servidor SMTP SMTP_PORT="587" # Puerto SMTP (normalmente 587 para TLS) SMTP_USER="server@harimdzul.com" # Usuario SMTP SMTP_PASS="ben9jv4VAbmTVrayFx9S" # Password SMTP EMAIL_FROM="server@harimdzul.com" # Email remitente EMAIL_TO="harimweb14@gmail.com" # Email destinatario # ================================================================= # FUNCIONES AUXILIARES # ================================================================= log_mensaje() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG" } limpiar_y_salir() { [ -d "$DIR_TEMP" ] && rm -rf "$DIR_TEMP" && log_mensaje "Directorio temporal limpiado" exit $1 } verificar_comando() { if ! command -v $1 &> /dev/null; then log_mensaje "Error: $1 no está instalado" limpiar_y_salir 1 fi } enviar_notificacion() { local ASUNTO="Respaldo de $DOMINIO - $FECHA" local MENSAJE="Respaldo completado para $DOMINIO\n\n" MENSAJE+="Estado: $1\n" MENSAJE+="Archivo: $NOMBRE_ZIP\n" MENSAJE+="Tamaño: $TAMANO_ZIP\n" MENSAJE+="Subida FTP: $( [ $FTP_RESULT -eq 0 ] && echo 'Éxito' || echo 'Falló' )\n" MENSAJE+="\nDetalles:\n$(tail -n 20 $LOG)" # Usando curl para enviar el email via SMTP ( echo "From: $EMAIL_FROM" echo "To: $EMAIL_TO" echo "Subject: $ASUNTO" echo "Content-Type: text/plain; charset=UTF-8" echo echo -e "$MENSAJE" ) | curl -s --url "smtp://$SMTP_SERVER:$SMTP_PORT" \ --ssl-reqd \ --mail-from "$EMAIL_FROM" \ --mail-rcpt "$EMAIL_TO" \ --upload-file - \ --user "$SMTP_USER:$SMTP_PASS" \ --insecure >/dev/null 2>&1 if [ $? -eq 0 ]; then log_mensaje "Notificación por email enviada correctamente" else log_mensaje "Error al enviar notificación por email" fi } # ================================================================= # INICIO DEL SCRIPT # ================================================================= log_mensaje "=== INICIANDO RESPALDO COMPLETO ===" log_mensaje "Respaldo de: $DIR_ACTUAL" log_mensaje "Archivo final: $NOMBRE_ZIP" # Verificar comandos necesarios verificar_comando "mysqldump" verificar_comando "zip" verificar_comando "curl" # Crear directorio temporal mkdir -p "$DIR_TEMP" || { log_mensaje "Error: No se pudo crear directorio temporal"; exit 1; } # ================================================================= # PASO 1: RESPALDO DE LA BASE DE DATOS # ================================================================= log_mensaje "--- Respaldando base de datos ---" # Verificar conexión a la BD mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "USE $DB_NAME;" 2>/dev/null || { log_mensaje "Error: No se pudo conectar a la base de datos" limpiar_y_salir 1 } # Exportar la base de datos log_mensaje "Exportando base de datos $DB_NAME" mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" \ --single-transaction --routines --triggers --add-drop-table \ --add-locks --create-options --disable-keys --extended-insert \ --quick --lock-tables=false "$DB_NAME" > "$SQL_FILE" 2>> "$LOG" if [ $? -ne 0 ]; then log_mensaje "Error al exportar base de datos" limpiar_y_salir 1 fi if [ ! -s "$SQL_FILE" ]; then log_mensaje "Error: El archivo de respaldo está vacío" limpiar_y_salir 1 fi TAMANO_SQL=$(du -h "$SQL_FILE" | cut -f1) log_mensaje "BD respaldada correctamente. Tamaño: $TAMANO_SQL" # ================================================================= # PASO 2: CREAR ARCHIVO ZIP (DIRECTORIO + BD) # ================================================================= log_mensaje "--- Creando archivo ZIP ---" cd "$DIR_ACTUAL" || { log_mensaje "Error: No se pudo acceder a $DIR_ACTUAL"; limpiar_y_salir 1; } # Comprimir directorio principal (excluyendo archivos temporales y logs) zip -r "$RUTA_ZIP" . \ -x "temp_*" "*.log" "backup_*.zip" ".git/*" "node_modules/*" "*.tmp" \ >> "$LOG" 2>&1 if [ $? -ne 0 ]; then log_mensaje "Error al crear ZIP" limpiar_y_salir 1 fi # Agregar el dump de la BD al ZIP zip -j "$RUTA_ZIP" "$SQL_FILE" >> "$LOG" 2>&1 if [ $? -ne 0 ]; then log_mensaje "Error al agregar BD al ZIP" limpiar_y_salir 1 fi if [ ! -f "$RUTA_ZIP" ]; then log_mensaje "Error: ZIP no se creó" limpiar_y_salir 1 fi TAMANO_ZIP=$(du -h "$RUTA_ZIP" | cut -f1) log_mensaje "ZIP creado correctamente. Tamaño: $TAMANO_ZIP" # ================================================================= # PASO 3: SUBIDA FTP # ================================================================= log_mensaje "--- Subiendo a FTP ---" log_mensaje "ftp://$FTP_HOST$FTP_DIR/$NOMBRE_ZIP" curl -v -T "$RUTA_ZIP" \ --user "$FTP_USER:$FTP_PASS" \ --ftp-create-dirs \ --connect-timeout 30 \ --max-time 1800 \ --retry 3 \ --retry-delay 10 \ "ftp://$FTP_HOST$FTP_DIR/" >> "$LOG" 2>&1 FTP_RESULT=$? if [ $FTP_RESULT -eq 0 ]; then log_mensaje "Subida a FTP exitosa." else log_mensaje "❌ Error al subir archivo a FTP (código: $FTP_RESULT)" log_mensaje "Se mantiene archivo local: $RUTA_ZIP" fi # ================================================================= # PASO 4: ENVÍO DE NOTIFICACIÓN POR EMAIL # ================================================================= if [ $FTP_RESULT -eq 0 ]; then enviar_notificacion "ÉXITO" else enviar_notificacion "FALLO" fi # ================================================================= # PASO 5: LIMPIEZA FINAL # ================================================================= log_mensaje "--- Limpieza final ---" rm -rf "$DIR_TEMP" log_mensaje "Directorio temporal eliminado" # Eliminar ZIP local solo si la subida fue exitosa if [ $FTP_RESULT -eq 0 ]; then rm -f "$RUTA_ZIP" log_mensaje "Archivo ZIP local eliminado (subida exitosa)" else log_mensaje "Archivo ZIP local conservado (falló la subida)" fi # Rotar logs (mantener solo los últimos 7 días) find "$DIR_ACTUAL" -name "backup_ftp.log*" -mtime +7 -exec rm -f {} \; log_mensaje "=== RESPALDO FINALIZADO ===" log_mensaje "Archivo: $NOMBRE_ZIP" log_mensaje "Tamaño final: $TAMANO_ZIP" log_mensaje "FTP: $( [ $FTP_RESULT -eq 0 ] && echo '✅ OK' || echo '❌ FALLÓ' )" log_mensaje "=========================================" exit 0