Copias de seguridad · 6 min read · Dec 02, 2025

Ampliando Perfect Server - Debian Squeeze [ISPConfig 3] - Página 6

10. Copias de Seguridad de Clientes

El contenido del script cambió el 29-03-2011. Por favor actualiza

Este script NO funcionará correctamente para ISPConfig v. 3.0.5 y versiones superiores. Tienes que hacer muchos cambios y no se recomienda. Por favor, utiliza la nueva forma de hacer copias de seguridad de ISPConfig.

El siguiente script es una forma fácil de hacer copias de seguridad de los datos de tus clientes y de las bases de datos de tus clientes en su carpeta de sitio web. Como sabes, en ISPConfig3 cada cliente tiene una carpeta en la forma /var/www/clients/clientXY, en la que están todos sus sitios web. El script hará una copia de seguridad de todos sus sitios web en cada carpeta web, junto con sus bases de datos y el cliente podrá descargarlas. En caso de que un cliente tenga más de una base de datos, entonces todas las bases de datos se respaldarán en su primer sitio (basado en webID). El script también mantendrá los últimos 3 días de esos archivos y los últimos 3 domingos para uso administrativo en un directorio de tu elección (el predeterminado es /var/backup/sites).

Este es un script muy simple. Para una solución más avanzada, consulta esta publicación.

Crea el script, hazlo ejecutable y edítalo:

cd /root/scripts/
touch mybackup.sh
chmod 0700 mybackup.sh
nano mybackup.sh

El contenido debe ser el siguiente: (Cambia las variables ispUSER, ispPASS, ispHOST, DEST y SITES para adaptarlas a tus necesidades):

#!/bin/bash  
# Script de shell para hacer copias de seguridad de la base de datos MySql y sitios web de clientes  
#   
# Última actualización: marzo - 2011  
# --------------------------------------------------------------------  
# Este es un script de shell gratuito bajo la GNU GPL versión 2.0 o superior  
# Copyright (C) 2011 iopen.gr  
# Comentarios/sugerencias: http://iopen.gr  
# --------------------------------------------------------------------  
#   
#           DESTINADO para el ISPConfig 3.0.x y superior  
#   
# Este script hará una copia de seguridad de cada carpeta web (web, stats, cgi, etc.)  
# de cada cliente junto con todas las bases de datos del cliente  
# Las copias de seguridad se colocarán en la carpeta del cliente del sitio web   
# El script mantendrá la copia de seguridad actual y las 2 anteriores  
# También mantendrá los últimos 3 domingos  
# --------------------------------------------------------------------  
  
# Credenciales de la base de datos. Usa un usuario de DB con acceso completo de lectura o usa el usuario root   
ispUSER="root"                  # Usuario de DB  
ispPASS="---tucontraseña---"        # contraseña del usuario  
ispHOST="localhost"             # Nombre del host  
  
CURDIR="$(pwd)"   
# Variables con la ruta completa a los binarios  
MYSQL="$(which mysql)"  
MYSQLDUMP="$(which mysqldump)"  
CHOWN="$(which chown)"  
CHMOD="$(which chmod)"  
GZIP="$(which gzip)"  
TAR="$(which tar)"   
  
# El directorio principal de copias de seguridad de tu servidor  
DEST="/var/backup"  
   
# Directorio de copias de seguridad de sitios (SOLO) en tu directorio principal de copias de seguridad  
SITES="$DEST/sites"  
    
# Variables para fechas en formato yymmdd  
TODAY=`date +%Y%0m%0d`  
YESTERDAY=`date -d '1 day ago' +%Y%0m%0d`  
BACK2=`date -d '2 day ago' +%Y%0m%0d`  
BACK3=`date -d '3 day ago' +%Y%0m%0d`  
BACK22=`date -d '22 day ago' +%Y%0m%0d`  
   
[ ! -d $SITES ] && mkdir -p $SITES || :  
   
# Dar solo acceso root a las copias de seguridad en las carpetas de este script  
$CHOWN 0.0 -R $SITES  
$CHMOD 0600 $SITES  
  
# --------------------------------------------------------------------------   
# Eliminar copias de seguridad anteriores (actuales) del directorio del cliente  
# Las copias de seguridad están en la forma :  
# *BU*gz  
# -------- PRECAUCIÓN ---------  
# No almacenes ningún otro archivo en esta forma en el directorio de los clientes  
# --------------------------------------------------------------------------   
echo "-------------------------------------------------------------"  
  
QRY="use dbispconfig; SELECT web_domain.system_user, web_domain.system_group, \  
web_domain.document_root, web_domain.domain FROM web_domain WHERE  \  
web_domain.type!='alias' AND web_domain.system_user IS NOT NULL AND (LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) ;"  
  
echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line  
do  # ${col[0]}=usuario de dominio / nombre de carpeta / usuario del sistema, ${col[1]}=clientID / grupo del sistema ,  
        while read -a col  # ${col[2]}=ruta al sitio web, ${col[3]}= nombre de dominio  
do  
echo "    LIMPIANDO COPIAS DE SEGURIDAD ANTIGUAS en la carpeta ${col[2]} "  
for delfile in ${col[2]}/*BU*gz ;   
do [ -f $delfile ] && rm $delfile;   
done  
done  
done  
  
# --------------------------------------------------------------------------   
# Eliminar cualquier cosa que tenga 22 días de antigüedad y tenga la forma :  
# *[fecha 22 días de antigüedad]*gz  
# del directorio $SITES del servidor  
# --------------------------------------------------------------------------   
                echo "-------------------------------------------------------------"  
echo "    LIMPIANDO COPIAS DE SEGURIDAD ANTIGUAS en la carpeta SITES "  
for delfile in $SITES/*$BACK22*gz ;   
do [ -f $delfile ] && rm $delfile;    
done  
echo "-------------------------------------------------------------"  
echo "                                                             "  
echo "                                                             "  
  
# --------------------------------------------------------------------------   
# Para cada cliente, hacer una copia de seguridad de su base de datos en su carpeta de sitio web   
# Para clientes con múltiples sitios, hacer una copia de seguridad de todas las bases de datos en su primer sitio  
# Además, copiar la copia de seguridad de hoy en el directorio $SITES del servidor   
# Eliminar la copia de seguridad que tenga más de 3 días del directorio $SITES del servidor  
# Mantener los últimos 3 domingos  
# --------------------------------------------------------------------------   
  
QRY="use dbispconfig; SELECT web_database.database_name , web_database.database_user ,\  
 min(web_domain.system_user) as muser, web_domain.system_group, min(web_domain.document_root) as mpath, \  
web_domain.domain FROM web_database, web_domain WHERE web_database.sys_userid=web_domain.sys_userid \  
AND web_database.sys_groupid=web_domain.sys_groupid AND web_domain.type='vhost' \  
AND web_domain.system_user IS NOT NULL AND (LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) \  
 GROUP BY web_database.database_name , web_database.database_user,  web_domain.system_group;"  
  
echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line  
do  # ${col[0]} = dbname, ${col[1]}=dbuser , ${col[2]}=usuario de dominio / nombre de carpeta / usuario del sistema,  
        while read -a col   #${col[3]}=clientID / grupo del sistema , ${col[4]}=ruta al sitio web  
do  
echo "          DB: "${col[0]}   
echo "-------------------------------------------------------------"  
echo "Haciendo copia de seguridad de DB:" ${col[0]}  "en :"  ${col[4]}/${col[0]}BU.gz  
$MYSQLDUMP -u $ispUSER -h $ispHOST -p$ispPASS -c --add-drop-table --add-locks \  
 --quick --lock-tables ${col[0]} | $GZIP -9 > ${col[4]}/${col[0]}BU.gz  
cp ${col[4]}/${col[0]}BU.gz $SITES/${col[0]}.$TODAY.gz  
        if [ `date -d '3 day ago' +%u` -ne 7 ] # si hace 3 días no es domingo  
        then    #eliminar la  copia de seguridad  
                [ -f $SITES/${col[0]}.$BACK3.gz ] && rm $SITES/${col[0]}.$BACK3.gz  
        fi  
$CHOWN ${col[2]}:${col[3]} ${col[4]}/${col[0]}BU.gz  
$CHMOD 0660 ${col[4]}/${col[0]}BU.gz  
echo "-------------------------------------------------------------"  
echo "                                                             "  
done  
done  
  
# --------------------------------------------------------------------------   
# Para cada cliente, hacer una copia de seguridad de sus sitios en su carpeta de sitio web   
# Además, copiar la copia de seguridad de hoy en el directorio $SITES del servidor   
# Eliminar la copia de seguridad que tenga más de 3 días del directorio $SITES del servidor  
# Mantener los últimos 3 domingos  
# --------------------------------------------------------------------------   
  
QRY="use dbispconfig; SELECT web_domain.system_user, web_domain.system_group,\  
 web_domain.document_root, web_domain.domain FROM web_domain WHERE  \  
web_domain.type!='alias' AND web_domain.system_user \  
IS NOT NULL AND (LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) ;"  
  
echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line  
do     # ${col[0]}=usuario de dominio / nombre de carpeta / usuario del sistema, ${col[1]}=clientID / grupo del sistema ,  
        while read -a col   # ${col[2]}=ruta al sitio web, ${col[3]}= nombre de dominio  
do  
echo "                                                             "  
echo "         Sitio:" ${col[3]}  
echo "-------------------------------------------------------------"  
echo "Haciendo copia de seguridad del sitio: " ${col[2]}/  "en :"  ${col[2]}/${col[3]}BU.tar.gz  
cd ${col[2]}  
sudo -u ${col[0]} $TAR -czf ${col[2]}/${col[3]}BU.tar.gz .  
cp ${col[2]}/${col[3]}BU.tar.gz $SITES/${col[3]}.$TODAY.tar.gz  
        if [ `date -d '3 day ago' +%u` -ne 7 ] # si hace 3 días no es domingo  
        then    #eliminar la copia de seguridad  
                [ -f $SITES/${col[3]}.$BACK3.tar.gz ] && rm $SITES/${col[3]}.$BACK3.tar.gz  
        fi  
$CHOWN ${col[0]}:${col[1]} ${col[2]}/${col[3]}BU.tar.gz  
$CHMOD 0660 ${col[2]}/${col[3]}BU.tar.gz  
  
echo "-------------------------------------------------------------"  
echo "                                                             "  
done  
done  
cd $CURDIR

Puedes ejecutar el script de copia de seguridad ejecutando:

/root/scripts/mybackup.sh

o puedes agregarlo como un trabajo cron (por ejemplo, todos los días a las 22:30):

crontab -e

y agregar la siguiente línea:

30 22 * * * /root/scripts/mybackup.sh > /dev/null 2>> /var/log/backup.log

Notas Finales

Por favor, siéntete libre de comentar cualquier cosa sobre este tutorial en un hilo apropiado en los foros de HowtoForge. Comentarios útiles se incluirán en una futura versión actualizada.

Esta es la primera versión y, por cuidadoso que haya sido, el tutorial puede contener errores. Por favor, házmelo saber para corregirlos lo antes posible.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.