Como dice el título, este nuevo script es para realizar copias completas de nuestra web, blog o cualquier otro que tengamos en un host remoto.
Al igual que todos mis scripts está sujeto a cambios para mejorar y simplificar el código y su uso. Está pensado para una distribución basada en arch, pero con unos pocos ajustes sirve para cualquier distro.
Estas son las funciones que ejecuta:
Como utilizarlo:
Primero que nada debemos abrir el fichero y configurar las variables. Al inicio encontraremos esto:
Pasamos a las otras variables:
Las otras 3 opciones es para especificar en días el tiempo que se guardarán los ficheros de copias. Esto es para que no se guarden ficheros de copias muy antiguas. De todos modos, si quieres puedes cambiarlos:
Variables de rutas:
En caso de estar alojada la web dentro de una carpeta ponemos ahí la ruta, en caso contrario lo dejamos con / para que haga la copia de todo el sitio.
Las copias se guardarán en nuestra home dentro de una carpeta llamada Backups
Variables conexión ssh:
evidentemente antes debes tener instalado el paquete ssh y crear tu clave. En caso de tenerla creada, los pasos son muy sencillos:
- Instala open ssh:
- Creamos la clave con:
Con esto ya hemos creado nuestra clave. El script carga de mandarla a nuestro host, por lo que no hace falta preocuparnos.
Los datos a poner:
El resto de variables no las explico, ya que es más de lo mismo:
Código del script:
Hos hago un copy paste del código:
Si lo queréis descargar comprimido: Backup_host
Si queréis ver el código en Github: Github
Como en todos mis aportes, espero recibir sugerencias para mejorarlo y espero que os sea útil.
Al igual que todos mis scripts está sujeto a cambios para mejorar y simplificar el código y su uso. Está pensado para una distribución basada en arch, pero con unos pocos ajustes sirve para cualquier distro.
Estas son las funciones que ejecuta:
- Comprueba que tengas los paquetes necesarios. De lo contrario los instala
- Comprueba los directorios de destino del equipo local. De lo contrario los crea
- Introduce en el servidor de nuestro host la clave pública ssh en caso de no estar instalada
- Crea al local una copia de la base de datos
- Guarda una copia comprimida de la base de datos
- Hace una purga de las copias más antiguas
- Guarda una copia incremental de los ficheros del host a local
- Crea al local una copia comprimida del host
- Purga las copias del host comprimidas más antiguas
- En caso de tenerlo configurado copia los comprimidos a un ftp escogido en las variables
Como utilizarlo:
Primero que nada debemos abrir el fichero y configurar las variables. Al inicio encontraremos esto:
## Esta opción es para activar o desactivar las copias de respaldo al servidor ftpComo dice la opción, es para hacer un duplicado de nuestras copias de seguridad en un espacio ftp si disponemos de el. Tan solo debemos poner si o no, dependiendo de si lo queremos hacer. Si disponemos de el, en el apartado de variables encontraremos esto:
respaldoftp="no"
# Datos respaldo ftpEs muy intuitivo creo con el nombre de las variables. De todos modos lo explico por puntos más detallado:
respftpuser=""
respftppass=""
respftphost=""
respftpDB=""
respftpwww=""
- Usuario ftp del sitio de respaldo
- Password ftp del sitio de respaldo
- Dominio o host ftp del sitio de respaldo
- Ruta de la carpeta para guardar copias comprimidas de la DB
- Ruta de la carpeta para guardar copias comprimidas de los archivos
Pasamos a las otras variables:
# FechasLa fecha no tocar, ya que es para que ponga al nombre del archivo la fecha del día que se realiza la copia.
fecha=`date +%Y-%m-%d`
diasBorraSql="15"
diasBorraSqlGz="30"
diasBorrawwwGz="30"
Las otras 3 opciones es para especificar en días el tiempo que se guardarán los ficheros de copias. Esto es para que no se guarden ficheros de copias muy antiguas. De todos modos, si quieres puedes cambiarlos:
- diasBorraSq: Días de antigüedad que conserva las copias del archivo sql sin comprimir
- diasBorraSqlGz: Días de antigüedad que conserva las copias del archivo sql comprimido
- diasBorrawwwG: Días de antigüedad que conserva las copias de los archivos comprimidos del host
Variables de rutas:
# RutasDe todas estas variables solamente deberías configurar la primera: remoto
remoto="/"
remotoDB="[No disponible]"
remotowww="[No disponible]"
localDescDB="$HOME/Backups/Desc/DB"
localDescwww="$HOME/Backups/Desc/Host"
LocalBackupDB="$HOME/Backups/DB"
LocalBackupwww="$HOME/Backups/Host"
localLogs="$HOME/Backups/Logs"
En caso de estar alojada la web dentro de una carpeta ponemos ahí la ruta, en caso contrario lo dejamos con / para que haga la copia de todo el sitio.
Las copias se guardarán en nuestra home dentro de una carpeta llamada Backups
Variables conexión ssh:
# Datos conexión sshLa conexión ssh es necesaria para mandar el comando mysqldump y hacer la copia de la base de datos.
sshuser=""
sshpass=""
sshhost=""
evidentemente antes debes tener instalado el paquete ssh y crear tu clave. En caso de tenerla creada, los pasos son muy sencillos:
- Instala open ssh:
sudo pacman -S openssh
- Creamos la clave con:
ssh-keygen -t rsa
Con esto ya hemos creado nuestra clave. El script carga de mandarla a nuestro host, por lo que no hace falta preocuparnos.
Los datos a poner:
- sshuser: Usuario ssh que nos proporciona nuestro proveedor del servicio host
- sshpass: Contraseña de nuestro ssh
- sshhost: Dirección para acceder via ssh. Nuestro proveedor de servicio nos lo proporciona
El resto de variables no las explico, ya que es más de lo mismo:
# Datos conexión ftpY ya con esto tenemos listo el script para que nos funcione correctamente.
ftpuser=""
ftppass=""
ftphost=""
# Datos conexión db
dbuser=""
dbpass=""
dbhost=""
dbname=""
Código del script:
Hos hago un copy paste del código:
#!/bin/bash
## Esta opción es para activar o desactivar las copias de respaldo al servidor ftp
respaldoftp="no"
## ----- Variables -----
# Fechas
fecha=`date +%Y-%m-%d`
diasBorraSql="15"
diasBorraSqlGz="30"
diasBorrawwwGz="30"
# Rutas
remoto="/"
remotoDB="[No disponible]"
remotowww="[No disponible]"
localDescDB="$HOME/Backups/Desc/DB"
localDescwww="$HOME/Backups/Desc/Host"
LocalBackupDB="$HOME/Backups/DB"
LocalBackupwww="$HOME/Backups/Host"
localLogs="$HOME/Backups/Logs"
# Datos conexión ssh
sshuser=""
sshpass=""
sshhost=""
# Datos conexión ftp
ftpuser=""
ftppass=""
ftphost=""
# Datos conexión db
dbuser=""
dbpass=""
dbhost=""
dbname=""
# Datos respaldo ftp
respftpuser=""
respftppass=""
respftphost=""
respftpDB=""
respftpwww=""
## ----- Comprobar e instalar paquetes necesarios -----
if [ ! -x /usr/bin/expect ]; then
echo "No tienes instalado el paquete "expect", vamos a instalarlo"
sudo pacman -Sy --noconfirm expect
clear
echo ""
echo "Paquete "expect" instalado correctamente"
sleep 4 && clear
fi
if [ ! -x /usr/bin/ssh ]; then
echo "No tienes instalado el paquete "openssh", vamos a instalarlo"
sudo pacman -Sy --noconfirm openssh
clear
echo ""
echo "Paquete "openssh" instalado correctamente"
sleep 4 && clear
fi
if [ ! -x /usr/bin/tar ]; then
echo "No tienes instalado el paquete "tar", vamos a instalarlo"
sudo pacman -Sy --noconfirm tar
clear
echo ""
echo "Paquete "tar" instalado correctamente"
sleep 4 && clear
fi
if [ ! -x /usr/bin/rsync ]; then
echo "No tienes instalado el paquete "rsync", vamos a instalarlo"
sudo pacman -Sy --noconfirm rsync
clear
echo ""
echo "Paquete "rsync" instalado correctamente"
sleep 4 && clear
fi
if [ ! -x /usr/bin/mysqldump ]; then
echo "No tienes instalado el paquete "mariadb", vamos a instalarlo"
sudo pacman -Sy --noconfirm mariadb
clear
echo ""
echo "Paquete "mariadb" instalado correctamente"
sleep 4 && clear
fi
## Comprobamos si tenemos los directorios para las copias, de lo contrario los crea
if [ ! -x $localDescDB ];then
mkdir -p $localDescDB
fi
if [ ! -x $localDescwww ];then
mkdir -p $localDescwww
fi
if [ ! -x $LocalBackupDB ];then
mkdir -p $LocalBackupDB
fi
if [ ! -x $LocalBackupwww ];then
mkdir -p $LocalBackupwww
fi
if [ ! -x $localLogs ];then
mkdir -p $localLogs
fi
# Introducimos en el remoto la llave pública ssh si no existe
expect -c "
log_user 0
spawn ssh-copy-id ${sshuser}@${sshhost}
match_max 100000
expect "*?assword:*" { send -- "$sshpassr"}
expect 100%
sleep 1
log_user 1
exit
"
# Backup de la base de datos
ssh $sshuser@$sshhost "mysqldump -h $dbhost -u $dbuser -p$dbpass -B $dbname" > $localDescDB/$dbname-$fecha.sql
# Comprime la base de datos y copia el fichero a la carpeta pertinente
tar -czf $LocalBackupDB/$dbname-$fecha.sql.tar.gz $localDescDB/$dbname-$fecha.sql
# Borra los archivos DB más antiguos de la fecha especificada
find $localDescDB/ -mtime +$diasBorraSql -exec rm -rf {} ;
find $LocalBackupDB/ -mtime +$diasBorraSqlGz -exec rm -rf {} ;
# Descarga o actualiza carpeta desde host
rsync -avz --delete --progress -e "ssh" --exclude 'Backups' $sshuser@$sshhost:$remoto $localDescwww >> $localLogs/backup-$fecha.log 2>&1
# comprime la carpeta descargada del host
tar -czf $LocalBackupwww/host-$fecha.tar.gz $localDescwww
if [ $respaldoftp = si ]; then
# Envia las copias comprimidas via ftp a nuestro espacio de respaldo en la nuve
ftp -inv $respftphost <<Done-ftp
user $respftpuser $respftppass
put $LocalBackupDB/$dbname-$fecha.sql.tar.gz $respftpDB/$dbname-$fecha.sql.tar.gz
put $LocalBackupwww/host-$fecha.tar.gz $respftpwww/host-$fecha.tar.gz
bye
Done-ftp
else
echo "No tienes configurado el respaldo por ftp"
sleep 5
clear
fi
# Borra los archivos host más antiguos de la fecha especificada
find $LocalBackupwww/ -atime +$diasBorrawwwGz -exec rm -rf {} ;
Si lo queréis descargar comprimido: Backup_host
Si queréis ver el código en Github: Github
Como en todos mis aportes, espero recibir sugerencias para mejorarlo y espero que os sea útil.