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:
- Respaldo de configuraciones de Apache2: Cada archivo de configuración se comprime por separado.
- Respaldo de sitios web: Cada directorio de un sitio alojado en
/var/www/html
se comprime individualmente. - Copia a almacenamiento remoto: Los respaldos se transfieren a una carpeta montada en el sistema.
- Eliminación de respaldos antiguos: Mantiene una retención de 7 días para optimizar el uso de almacenamiento.
- 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:
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:
3. Respaldo de Configuraciones de Apache2
Cada archivo de configuración en /etc/apache2
se comprime individualmente:
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:
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:
7. Reporte a Zabbix
El script utiliza zabbix_sender
para enviar el estado del respaldo al servidor de monitoreo:
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!