| Server IP : 185.11.201.71 / Your IP : 192.168.7.18 Web Server : Apache/2.4.29 (Ubuntu) System : Linux tech-virtual-machine 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64 User : tech ( 1000) PHP Version : 7.4.28 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /comunica/backups/ |
Upload File : |
#!/bin/bash
###############################################################################
# SCRIPT DE BACKUP A NAS SYNOLOGY
#
# - Monta temporalmente la NAS.
# - Genera backup diario de MySQL, webs Apache y carpetas de sistema.
# - Crea copia mensual el día 01 de cada mes.
# - Crea copia anual el día 01 de enero.
# - Mantiene diarios 30 días.
# - Mantiene mensuales 6 meses.
# - Mantiene anuales indefinidamente.
# - Desmonta la NAS al finalizar.
###############################################################################
set -euo pipefail
LOG="/var/log/backup.log"
LOCK="/var/run/backup.lock"
###############################################################################
# CONFIGURACIÓN MYSQL
###############################################################################
BBDDUS="root"
BBDDPW="Machocar02"
###############################################################################
# CONFIGURACIÓN NAS SYNOLOGY
###############################################################################
NAS_IP="192.168.7.95"
NAS_SHARE="SERVIDORES"
NAS_SUBDIR="192.168.7.142"
NAS_MOUNT="/mnt/backup_nas"
NAS_USER="backups"
NAS_PASS="T3ch_1mpuls3!!"
###############################################################################
# FECHAS
###############################################################################
FECHA_DIA="$(date +%Y.%m.%d)"
FECHA_MES="$(date +%Y.%m)"
FECHA_ANIO="$(date +%Y)"
DIA_MES="$(date +%d)"
MES_DIA="$(date +%m%d)"
###############################################################################
# RETENCIÓN
###############################################################################
RETENCION_DIAS=30
RETENCION_MESES=6
###############################################################################
# RUTAS EN NAS
###############################################################################
DESTINO_BASE="${NAS_MOUNT}/${NAS_SUBDIR}"
DESTINO_DIARIO="${DESTINO_BASE}/diarios/${FECHA_DIA}"
DESTINO_MENSUAL="${DESTINO_BASE}/mensuales/${FECHA_MES}"
DESTINO_ANUAL="${DESTINO_BASE}/anuales/${FECHA_ANIO}"
###############################################################################
# EVITAR DOBLE EJECUCIÓN
###############################################################################
exec 9>"$LOCK"
flock -n 9 || {
echo "$(date) - ERROR: backup ya en ejecución" >> "$LOG"
exit 1
}
###############################################################################
# DESMONTAJE SEGURO DE LA NAS AL FINALIZAR
###############################################################################
cleanup() {
sync
if mountpoint -q "$NAS_MOUNT"; then
echo "### DESMONTANDO NAS" >> "$LOG"
umount "$NAS_MOUNT" || {
echo "$(date) - ERROR: no se pudo desmontar $NAS_MOUNT" >> "$LOG"
}
fi
}
trap cleanup EXIT
###############################################################################
# FUNCIÓN PARA GENERAR BACKUP
###############################################################################
crear_backup() {
DESTINO="$1"
###########################################################################
# Crear estructura del backup
###########################################################################
mkdir -p "$DESTINO/bbdd"
mkdir -p "$DESTINO/webs"
mkdir -p "$DESTINO/sistema"
###########################################################################
# Backup de directorios web Apache
###########################################################################
echo "### COPIA WEBS EN $DESTINO" >> "$LOG"
find /var/www/html -mindepth 1 -maxdepth 1 -type d \
! -name "OLD*" \
! -name "comunicados" \
| while read -r WEB; do
NOMBRE="$(basename "$WEB")"
echo "WEB: $NOMBRE" >> "$LOG"
tar -czf "$DESTINO/webs/${NOMBRE}.tar.gz" -C /var/www/html "$NOMBRE"
done
###########################################################################
# Backup de carpetas de sistema
###########################################################################
echo "### COPIA SISTEMA EN $DESTINO" >> "$LOG"
[ -d /etc/apache2 ] && tar -czf "$DESTINO/sistema/etcapache.tar.gz" -C /etc apache2
[ -d /home ] && tar -czf "$DESTINO/sistema/home.tar.gz" -C / home
[ -d /comunica ] && tar -czf "$DESTINO/sistema/comunica.tar.gz" -C / comunica
}
###############################################################################
# INICIO DEL SCRIPT
###############################################################################
echo "######################" >> "$LOG"
date >> "$LOG"
echo "INICIO COPIA" >> "$LOG"
###############################################################################
# Crear punto de montaje local
###############################################################################
mkdir -p "$NAS_MOUNT"
###############################################################################
# Montar NAS Synology
###############################################################################
echo "### MONTANDO NAS" >> "$LOG"
mount -t cifs "//${NAS_IP}/${NAS_SHARE}" "$NAS_MOUNT" \
-o "username=${NAS_USER},password=${NAS_PASS},iocharset=utf8,vers=3.0,file_mode=0600,dir_mode=0700,noperm"
###############################################################################
# Verificar que la NAS está montada
###############################################################################
if ! mountpoint -q "$NAS_MOUNT"; then
echo "$(date) - ERROR: la NAS no se ha montado correctamente" >> "$LOG"
exit 1
fi
###############################################################################
# Crear estructura base en la NAS
###############################################################################
mkdir -p "${DESTINO_BASE}/diarios"
mkdir -p "${DESTINO_BASE}/mensuales"
mkdir -p "${DESTINO_BASE}/anuales"
###############################################################################
# Crear backup diario
###############################################################################
crear_backup "$DESTINO_DIARIO"
###############################################################################
# Crear backup mensual
###############################################################################
if [ "$DIA_MES" = "01" ]; then
echo "### GENERANDO COPIA MENSUAL" >> "$LOG"
rm -rf "$DESTINO_MENSUAL"
cp -a "$DESTINO_DIARIO" "$DESTINO_MENSUAL"
fi
###############################################################################
# Crear backup anual
###############################################################################
if [ "$MES_DIA" = "0101" ]; then
echo "### GENERANDO COPIA ANUAL" >> "$LOG"
rm -rf "$DESTINO_ANUAL"
cp -a "$DESTINO_DIARIO" "$DESTINO_ANUAL"
fi
###############################################################################
# Rotación de backups diarios
###############################################################################
echo "### ROTACION DIARIA: manteniendo ${RETENCION_DIAS} dias" >> "$LOG"
find "${DESTINO_BASE}/diarios" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-mtime +"$RETENCION_DIAS" \
-exec rm -rf {} \;
###############################################################################
# Rotación de backups mensuales
###############################################################################
echo "### ROTACION MENSUAL: manteniendo ${RETENCION_MESES} meses" >> "$LOG"
find "${DESTINO_BASE}/mensuales" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-mtime +180 \
-exec rm -rf {} \;
###############################################################################
# Backups anuales
###############################################################################
# No se eliminan. Se mantienen indefinidamente.
###############################################################################
# FIN DEL SCRIPT
###############################################################################
date >> "$LOG"
echo "FIN COPIA" >> "$LOG"
exit 0