Buscar este blog

martes, 15 de marzo de 2011

Respaldo Zimbra Community

Buscando como respaldar el servidor Zimbra en su versión libre Community, encontré una serie de script de los cuales hay unos bastante complejos y otros muy simples, la cuestión es que todos hacen lo mismo y casi de la misma manera.
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:
  1. realiza un backup en caliente con rsync de /opt/zimbra en /backup
  2. baja los servicios Zimbra
  3. realiza un backup en frio con rsync de /opt/zimbra en /backup
  4. levanta los servicios Zimbra
  5. comprime el directorio /backup
  6. 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