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 $CURDIRPuedes ejecutar el script de copia de seguridad ejecutando:
/root/scripts/mybackup.sho puedes agregarlo como un trabajo cron (por ejemplo, todos los días a las 22:30):
crontab -ey agregar la siguiente línea:
30 22 * * * /root/scripts/mybackup.sh > /dev/null 2>> /var/log/backup.logNotas 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.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.