Automatización con Bash de Respaldos de Apache2 y Sitios Web en Servidores Linux

Backups Bash Linux

En el mundo de la administración de servidores, la seguridad de los datos es crucial. Por ello, los respaldos automáticos son una práctica esencial para garantizar la continuidad operativa ante fallos imprevistos. En esta entrada de blog, exploraremos un script en Bash diseñado para realizar respaldos de configuraciones de Apache2 y sitios web alojados en un servidor, enviando además reportes del estado del proceso a Zabbix para su monitoreo.


¿Qué Hace Este Script?

El propósito del script es respaldar configuraciones y archivos de un servidor web, asegurando su conservación local y en un almacenamiento remoto. El proceso incluye:

  1. Respaldo de configuraciones de Apache2: Cada archivo de configuración se comprime por separado.
  2. Respaldo de sitios web: Cada directorio de un sitio alojado en /var/www/html se comprime individualmente.
  3. Copia a almacenamiento remoto: Los respaldos se transfieren a una carpeta montada en el sistema.
  4. Eliminación de respaldos antiguos: Mantiene una retención de 7 días para optimizar el uso de almacenamiento.
  5. Reporte del estado del respaldo: Envía información del proceso a Zabbix, una herramienta de monitoreo de sistemas.

Estructura del Script

1. Configuración Inicial

El script comienza definiendo rutas y variables esenciales:

DIRECTORIO_APACHE="/etc/apache2" 
DIRECTORIO_HTML="/var/www/html" 
DIRECTORIO_LOCAL="/Respaldos/respaldo-local" 
DIRECTORIO_REMOTO="/mnt/Backups" 
FECHA=$(date +'%d-%m-%Y')

Aquí se especifican las ubicaciones de los archivos de configuración de Apache2, los sitios web, la carpeta local para los respaldos, y el almacenamiento remoto. También se crea un identificador basado en la fecha para organizar los respaldos.

2. Creación de Carpetas y Archivo de Log

El script prepara el entorno de trabajo creando las carpetas necesarias para almacenar los respaldos y un archivo de log donde se documenta el progreso del respaldo:

mkdir -p "$CARPETA_CONF_APACHE" 
mkdir -p "$CARPETA_SITIOS" 
mkdir -p "$CARPETA_REMOTA_FECHA" 
touch "$ARCHIVO_LOG"

3. Respaldo de Configuraciones de Apache2

Cada archivo de configuración en /etc/apache2 se comprime individualmente:

for archivo_apache in $(ls "$DIRECTORIO_APACHE"); do 
    ARCHIVO_TAR="$CARPETA_CONF_APACHE/${archivo_apache}_$FECHA.tar.gz" 
    tar -czf "$ARCHIVO_TAR" -C "$DIRECTORIO_APACHE" "$archivo_apache" 
done

4. Respaldo de Sitios Web

Cada sitio en /var/www/html se respalda en un archivo comprimido único:

for sitio in $(ls "$DIRECTORIO_HTML"); do 
    ARCHIVO_TAR="$CARPETA_SITIOS/${sitio}_$FECHA.tar.gz" 
    tar -czf "$ARCHIVO_TAR" -C "$DIRECTORIO_HTML" "$sitio" 
done

5. Transferencia a Almacenamiento Remoto

Una vez completados los respaldos locales, estos se transfieren a un directorio remoto montado en el sistema:

cp -r "$CARPETA_LOCAL_FECHA"/* "$CARPETA_REMOTA_FECHA"

6. Eliminación de Respaldos Antiguos

Para optimizar el uso de almacenamiento, los respaldos con más de 7 días de antigüedad se eliminan automáticamente:

find "$DIRECTORIO_LOCAL" -maxdepth 1 -type d -mtime +$Retencion -exec rm -rf {} \;
find "$DIRECTORIO_REMOTO" -maxdepth 1 -type d -mtime +$Retencion -exec rm -rf {} \;

7. Reporte a Zabbix

El script utiliza zabbix_sender para enviar el estado del respaldo al servidor de monitoreo:

echo "$HOST_ZABBIX $CLAVE_ESTADO_RESPALDO $ESTADO_RESPALDO" | $RUTA_ZABBIX_SENDER -z $SERVIDOR_ZABBIX -s $HOST_ZABBIX -k $CLAVE_ESTADO_RESPALDO -o $ESTADO_RESPALDO

Script Completo

#!/bin/bash

# Configuración
DIRECTORIO_APACHE="/etc/apache2"
DIRECTORIO_HTML="/var/www/html"
DIRECTORIO_LOCAL="/Respaldos/respaldo-local"
DIRECTORIO_REMOTO="/mnt/Backups"
FECHA=$(date +'%d-%m-%Y')
CARPETA_LOCAL_FECHA="$DIRECTORIO_LOCAL/$FECHA"
CARPETA_REMOTA_FECHA="$DIRECTORIO_REMOTO/$FECHA"
CARPETA_CONF_APACHE="$CARPETA_LOCAL_FECHA/conf_Apache"
CARPETA_SITIOS="$CARPETA_LOCAL_FECHA/Sitios"
ARCHIVO_LOG="$CARPETA_LOCAL_FECHA/respaldo_apache_$FECHA.log"
RUTA_ZABBIX_SENDER="/usr/bin/zabbix_sender"
SERVIDOR_ZABBIX="xxx.xxx.xxx.xxx"
HOST_ZABBIX="APACHE_SERVER"  # Nombre del host en Zabbix
CLAVE_ESTADO_RESPALDO="estado_respaldo"  # Clave para el estado del respaldo
Retencion=7

# Crear carpetas de respaldo locales y el archivo de log
mkdir -p "$CARPETA_CONF_APACHE"
mkdir -p "$CARPETA_SITIOS"
mkdir -p "$CARPETA_REMOTA_FECHA"
touch "$ARCHIVO_LOG"

# Obtener información del sistema
Hostname=$(hostname)
IP=$(hostname -I | awk '{print $1}') # Obtiene la primera IP

# Encabezado del log
{
    echo "=============================="
    echo "      INFORMACIÓN DEL EQUIPO"
    echo "=============================="
    echo "Hostname: $Hostname"
    echo "IP: $IP"
    echo "=============================="
    echo "Inicio del respaldo: $(date +'%d-%m-%Y %H:%M')"
    echo "=============================="
} > "$ARCHIVO_LOG"

# Función para escribir en el log
escribir_log() {
    local MENSAJE="$1"
    echo "$(date +'%d-%m-%Y %H:%M') - $MENSAJE" >> "$ARCHIVO_LOG"
}

# Función para eliminar respaldos antiguos
eliminar_respaldo_antiguo() {
    local directorio="$1"
    local log="$2"
    # Busca los directorios que tengan más de $Retencion días
    find "$directorio" -maxdepth 1 -type d -mtime +$Retencion -print | while IFS= read -r dir; do
        if [ -d "$dir" ]; then
            echo "Borrando el directorio $dir" >> "$log"
            rm -rf "$dir" 2>> "$log"
        fi
    done
}

# Inicialización de estado de salida
ESTADO_RESPALDO=0

# Respaldar archivos de configuración de Apache
for archivo_apache in $(ls "$DIRECTORIO_APACHE"); do
    ARCHIVO_TAR="$CARPETA_CONF_APACHE/${archivo_apache}_$FECHA.tar.gz"
    if tar -czf "$ARCHIVO_TAR" -C "$DIRECTORIO_APACHE" "$archivo_apache" >> "$ARCHIVO_LOG" 2>&1; then
        escribir_log "Respaldo con éxito de $archivo_apache en $ARCHIVO_TAR."
    else
        escribir_log "Error al respaldar $archivo_apache."
        ESTADO_RESPALDO=1
    fi

done

# Respaldar sitios publicados en /var/www/html
for sitio in $(ls "$DIRECTORIO_HTML"); do
    ARCHIVO_TAR="$CARPETA_SITIOS/${sitio}_$FECHA.tar.gz"
    if tar -czf "$ARCHIVO_TAR" -C "$DIRECTORIO_HTML" "$sitio" >> "$ARCHIVO_LOG" 2>&1; then
        escribir_log "Respaldo con éxito del sitio $sitio en $ARCHIVO_TAR."
    else
        escribir_log "Error al respaldar el sitio $sitio."
        ESTADO_RESPALDO=1
    fi
done

# Copiar archivos al directorio remoto
if cp -r "$CARPETA_LOCAL_FECHA"/* "$CARPETA_REMOTA_FECHA" >> "$ARCHIVO_LOG" 2>&1; then
    escribir_log "Copias locales trasladadas con éxito a $CARPETA_REMOTA_FECHA."
else
    escribir_log "Error al copiar archivos al directorio remoto $CARPETA_REMOTA_FECHA."
    ESTADO_RESPALDO=1
fi

# Llamar a la función para eliminar los respaldos antiguos
eliminar_respaldo_antiguo "$DIRECTORIO_LOCAL" "$ARCHIVO_LOG"
eliminar_respaldo_antiguo "$DIRECTORIO_REMOTO" "$ARCHIVO_LOG"

# Mantener logs de los últimos 7 días en los directorios locales y remotos
find "$DIRECTORIO_LOCAL" -name "respaldo_apache_*.log" -type f -mtime +7 -exec rm -f {} \; >> "$ARCHIVO_LOG" 2>&1
find "$DIRECTORIO_REMOTO" -name "respaldo_apache_*.log" -type f -mtime +7 -exec rm -f {} \; >> "$ARCHIVO_LOG" 2>&1
escribir_log "Eliminación de respaldos y logs antiguos completada."
escribir_log "Proceso de respaldo completado. Estado del respaldo: $ESTADO_RESPALDO."

# Enviar estado de respaldo a Zabbix
if echo "$HOST_ZABBIX $CLAVE_ESTADO_RESPALDO $ESTADO_RESPALDO" | $RUTA_ZABBIX_SENDER -z $SERVIDOR_ZABBIX -s $HOST_ZABBIX -k $CLAVE_ESTADO_RESPALDO -o $ESTADO_RESPALDO >> "$ARCHIVO_LOG" 2>&1; then
    escribir_log "Estado de respaldo enviado a Zabbix con éxito. Estado: $ESTADO_RESPALDO."
else
    escribir_log "Error al enviar estado de respaldo a Zabbix."
    ESTADO_RESPALDO=1
fi

# Pie de página para los logs
{
    echo "=============================="
    echo "      RESUMEN DEL LOG"
    echo "=============================="
    echo "Errores encontrados: $(grep -c '^.*Error al.*$' "$ARCHIVO_LOG")"
    echo "Respaldos exitosos: $(grep -c 'con éxito' "$ARCHIVO_LOG")"
    echo "=============================="
    echo "Fin del log: $(date +'%d-%m-%Y %H:%M')"
} >> "$ARCHIVO_LOG"

# Copiar el archivo de log al directorio remoto
if cp "$ARCHIVO_LOG" "$CARPETA_REMOTA_FECHA" >> "$ARCHIVO_LOG" 2>&1; then
    escribir_log "Archivo de log copiado con éxito a $CARPETA_REMOTA_FECHA."
else
    escribir_log "Error al copiar el archivo de log a $CARPETA_REMOTA_FECHA."
    ESTADO_RESPALDO=1
fi

exit $ESTADO_RESPALDO

¿Por Qué Usar Este Script?

Este script automatiza un proceso crítico en la administración de servidores. Algunas ventajas clave son:

  • Resiliencia: Los respaldos locales y remotos aseguran la recuperación ante fallos en el servidor principal.
  • Optimización de almacenamiento: La eliminación de respaldos antiguos evita el crecimiento descontrolado del espacio utilizado.
  • Monitoreo en tiempo real: La integración con Zabbix permite mantener un control del estado de los respaldos.

Conclusión

Automatizar respaldos no solo protege los datos críticos de un servidor, sino que también simplifica la administración y proporciona tranquilidad. Este script es una solución eficiente y personalizable que se adapta a distintos entornos. ¡Implementarlo en tu infraestructura es un paso hacia una gestión más confiable y profesional!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *