En mi caso me quede con un script de Daniel W. Martin, creado el 05 de diciembre 2008, el cual en si es bastante simple.
lo traduje y le genere un para de cambios los que dan mayor control sobre el proceso.
El script básicamente hace lo siguiente:
- realiza un backup en caliente con rsync de /opt/zimbra en /backup
- baja los servicios Zimbra
- realiza un backup en frio con rsync de /opt/zimbra en /backup
- levanta los servicios Zimbra
- comprime el directorio /backup
- envía por ftp el archivo compreso a un storage remoto
en estos momentos estoy respaldando 130 GB (opt/zimbra), 295 cuentas, con rsync, que quedan en 50 GB comprimidos, lo que tarda 6 horas con la transferencia al FTP incluida.
lo ideal es disponer de un disco dedicado a esta función en el servidor o conectado a un stotage externo.
este es el script:
#!/bin/bash
# script backupzimbra
# Zimbra Backup Script semanal
# Este script está diseñado para ejecutarse desde el crontab como root
# De uso libre y sin ningún tipo de garantía! Daniel W. Martin, 05 de diciembre 2008
# modificado y traducido por Marco Acevedo, 07, enero, 2011.
# la linea de ejecucuion debe ser algo asi /dir_donde_dejas_los_script/backupzimbrasem >> /backup/backupzimbra.log
# esto es para dejar un log de cada respaldo
# MAC se agrega calculo de duracion para cada proceso 15/03/2011
echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
start_date="$(date +%F)"
dia_sem="$(date +%a)"
# Salidas del inicio de la copia de seguridad, para fines de registro y seguimiento
echo Hora de inicio de copia de seguridad = $start_date at $(date +%T)
before="$(date +%s)"
# rm -rvf /backup/zimbra/*
# sincronizacion en caliente antes de detener Zimbra, para minimizar el tiempo d sincronizació
# con los servicios abajo
# Comentar la linea siguiente si quieres probar un solo sincronizacion en frío
before2="$(date +%s)"
rsync -ahHK --stats --delete /opt/zimbra/ /backup/zimbra
# Calculo y resultados, cantidad de tiempo que tarda el respaldo en caliente
after="$(date +%s)"
elapsed="$(expr $after - $before2)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo el backup en caliente tardo: "$hours horas $minutes minutos $seconds segundos"
# which is the same as: /opt/zimbra /backup
# Incluye la opcion --delete elimina de los archivos de la carpeta destino que no existen e el origen
# esto impide que los respaldos se inflen con contenido que no existe
# Ahora detendremos Zimbra para sincronizar los archivos que estaban o están bloqueados para rsync
# mientras el servicio estaba en marcha
before2="$(date +%s)"
# Detener los servicios de Zimbra
su - zimbra -c "/opt/zimbra/bin/zmcontrol stop"
echo espertando
sleep 20
echo termino de espera
# Mata todos los procesos huérfanos Zimbra
kill -9 `ps -u zimbra -o "pid="`
# Solo habilitar el siguiente comando si necesita matar a todos los procesos de usuario
# propieda de Zimbra antes de la sincronizacion
# ps auxww | awk '{print $1" "$2}' | grep zimbra | kill -9 `awk '{print $2}'`
# Sincronizar el directorio de copia de seguridad
rsync -ahHK --stats --delete /opt/zimbra/ /backup/zimbra
# Reiniciar los servicios de Zimbra
su - zimbra -c "/opt/zimbra/bin/zmcontrol start"
# Calculo y resultados, cantidad de tiempo que el servidor estabo fuera de servicio
after="$(date +%s)"
elapsed="$(expr $after - $before2)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Servidor estubo abajo por: "$hours horas $minutes minutos $seconds segundos"
# Crea un archivo txt en el directorio copia de seguridad que contiene la actual
# version del servidor. Util para saber en que version de Zimbra se puede restaurar la copia seguridad
su - zimbra -c "zmcontrol -v > /backup/zimbra/conf/zimbra_version.txt"
# o examinar su /opt/zimbra/.install_history
# Mostrar estado de servicios de Zimbra
echo "Mostrando estado de servicios de Zimbra ..."
su - zimbra -c "/opt/zimbra/bin/zmcontrol status"
# Crear archivo de un directorio de copia de seguridad para la transferencia fuera del sitio
# cd /backup/zimbra
echo "Creacion de archivo tar ${dia_sem}-mail.yolito.cl.tgz"
tar zcf /backup/${dia_sem}-mail.yolito.cl.tgz /backup/zimbra
echo "Compresion terminada"
# rm -rf /backup/zimbra/*
# envio del tgz al storage de backup y posterior borrado del archivo tgz de origen
before2="$(date +%s)"
echo Inicio de envio por FTP a Storage de backup del archivo ${dia_sem}-mail.yolito.cl.tgz
ncftpput -u sistemas -S .tmp -p otiloy 10.10.10.4 /Volume_1/sistemas/zimbra/ /backup/${dia_sem}-mail.yolito.cl.tgz
if [ "$?" = "0" ]; then
echo Envio terminado con exito
echo "BORRANDO ANRCHIVO ${dia_sem}-mail.yolito.cl.tgz"
# rm -rf /backup/*.tgz
else
echo "******** PROCESO TERMINO CON ERROR $? ********"
# Calculo y resultados, cantidad de tiempo que tarda el la transferencia FTP
after="$(date +%s)"
elapsed="$(expr $after - $before2)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo La transferencia FTP tardo: "$hours horas $minutes minutos $seconds segundos"
fi
# Salidas de tiempo de la copia de seguridad terminada
# echo "Tiempo de copia de seguridad terminada = $(date +%T)"
# Calculo y salidas de tiempo total
after="$(date +%s)"
elapsed="$(expr $after - $before)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Tiempo empleado: "$hours horas $minutes minutos $seconds segundos"
echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo
espero que les sirva