Backup de E-mails do Zimbra OSE com o Zmbackup

Um dos maiores problemas de se utilizar a versão Community do Zimbra é o fato de não existir uma ferramenta confiável de backup que seja gratuita e Open Source. Você tem escolhas pagas, como o Zextras (recentemente fez parceria com a Synacor para lançar a ferramenta Zimbra Plus), ou o próprio Zimbra Network Edition. De gratuito temos scripts feitos pela comunidade que estão disponíveis no GitHub ou o zmbkpose, uma ferramenta de backup que faz um tempo que não recebe correções. Essa inexistência de uma opção gratuita que me fez desenvolver o Zmbackup.

 

Zmbackup – A Solução Open Source Free de Backup

 

Zmbackup nada mais é do que uma ferramenta de backup Open Source totalmente escrita em shell script para o Zimbra OSE, feita em base de outra ferramenta chamada Zmbkpose. A ideia inicial seria que o projeto mante-se a estrutura da ferramenta anterior, para então se tornar algo amais, adicionando novas funções a cada release, além de aperfeiçoar a ferramenta, já que a mesma era extremamente lenta. Isso foi feito pois o Zmbkpose é uma ferramenta de longa data da comunidade, mesmo que não seja mais atualizado.

Atualmente o zmbackup faz as seguintes atividades:

  • Backup Completo da conta (configuração e e-mails);
  • Backup Incremental da conta desde a ultima sessão;
  • Backup de Alias;
  • Backup de Listas de Distribuição;

Para começarmos a utilizar ele, primeiramente precisamos instalar ele em nosso servidor. Para isso, acesse a página do GitHub do projeto e baixe e descompacte a versão mais recente do pacote (1.1.2), ou clone a branch master do repositório com o comando git clone:

git clone https://github.com/lucascbeyeler/zmbackup.git -b master

Antes de executar o script de instalação, primeiramente baixe as dependências do zmbackup na máquina, no caso os pacotes parallel, wget, e curl. Esses pacotes possuem os mesmos nomes tanto no CentOS quando no Debian/Ubuntu, então basta utilizar o gerenciador de pacotes dessa distribuição para baixa-los.

CentOS:

$ yum install parallel wget curl grep

Ubuntu:

$ apt-get install parallel wget curl grep

Agora entre no diretório do zmbackup que você criou na sua máquina ao descompactar o arquivo ou baixar via git clone, e então execute o instalador zmbackup_wizard. Siga as instruções do instalador, e ao final você terá o zmbackup instalado e configurado na máquina. Para validar, vire o usuário zimbra e execute o comando zmbackup -v, para que o mesmo te retorne a versão que foi instalada.

# bash zmbackup_wizard
# su - zimbra
$ zmbackup -v
$ zmbackup version: 1.1.3

 

Estrutura do Zmbackup

 

O Zmbackup é composto por 5 arquivos que você precisa ter conhecimento: sessions.txt, zmbackup, zmbhousekeep, zmbackup.conf, e o zmbackup.cron. O conhecimento deles ajuda na hora de tentar entender porque algo não está funcionando corretamente no script.

 

sessions.txt

Esse arquivo é aonde fica armazenado o log de cada backup realizado pelo zmbackup. Seria o equivalente a uma base de dados, porém armazenada em arquivo. Isso é o remanescente do antigo zmbkpose, e existe plano para que já comece a sua descontinuação a partir das novas versões do script. Para manipular-lo você possui o comando zmbackup -l, que lista os backups realizados, além de uma pequena descrição do que se trata essa sessão de backup.

zmbackup -l
Session: full-09777043423
Accounts: 600
    Type: Full Backup

 

zmbackup

Esse é o script principal, e ele só deve ser executado pelo usuário zimbra devido a alguns comandos estarem configurados somente para executarem com esse usuário. Através desse script é que você poderá solicitar que seja feito um backup completo ou incremental, o restore, listagem de sessões concluídas, entre outros. Veremos mais adiante como usar os parâmetros desse script.

 

zmbhousekeep

Esse script é quem fará a manutenção do servidor, removendo arquivos antigos e lixo mantido pelo zmbackup (como por exemplo arquivo vazio de backup incremental). Esse script também fará limpeza no arquivo sessions.txt toda vez que um backup for removido por ele.

 

zmbackup.conf

Todas as opções que você pode ativar no zmbackup, além de configuração de login de usuário do zimbra para backup e o admin do ldap ficam nesse arquivo, localizado dentro de /etc/zmbackup. Dentre as opções disponíveis, as que mais valem a pena comentar e que talvez sejam interessantes para você alterar são:

  • WORKDIR: Diretório aonde o backup será salvo. Por padrão é mantido no /backup, porém você pode criar em outros diretórios, como o /opt/zimbra/backup (default da ferramenta de backup do zimbra);
  • MAX_PARALLEL_PROCESS: Ao contrário de seu antecessor, o zmbackup possui um suporte melhor a paralelismo graças ao pacote parallel. Por default o número de processos paralelizados são 3, mas você pode aumentar o número para quantos você achar melhor, lembrando de tomar cuidado somente para não sobrecarregar seu servidor;
  • ROTATE_TIME: Tempo que será mantido de backups na máquina, sendo o default 30 dias. Após esse período, o backup é excluido na primeira execução do zmbhousekeep;
  • LOCK_BACKUP: Por default o Zmbackup só permite um backup por dia de contas, alias e listas de distribuição. Mais do que isso e você receberá uma mensagem de erro. Essa feature é feita como uma maneira de impedir de que fique com multiplos backups do mesmo dia, gerenciando melhor o espaço em disco, porém pode ser ativado alterando o valor da opção de TRUE para FALSE.

 

zmbackup.cron

O zmbackup não possui um daemon no momento, por isso ele conta com o serviço de agendamento de tarefas (cron) para que possa ser executado. Por padrão já possui uma configuração dentro de /etc/cron.d/zmbackup.cron para quando sua rotina deve ser executada, porém nada te impede de alterar o agendamento para outros horários que você achar melhor. Tome cuidado para não desativar acidentalmente o zmbhousekeep, ou os antigos backups não serão eliminados. Abaixo segue um exemplo do conteúdo que se encontra no arquivo zmbackup.cron:

$ vim /etc/cron.d/zmbackup.cron
###############################################################################
#                             ZMBACKUP CRON FILE                              #
###############################################################################
# This file is used to manage the time and day each backup activity will be
# executed. Please modify this file rather than create a new one.
# Default values for each activity:
#       Full Backup: Every Sunday at 1 AM
#       Incremental Backup: From Monday to Saturday at 1 AM
#       Alias: Every day at 1 AM
#       Distribution List: Every day at 1 AM
#       Backup Rotation: Every day at Midnight
###############################################################################
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
MAILTO=root
0 1 * * 0     zimbra    zmbackup -f
0 1 * * 1-6   zimbra    zmbackup -i
0 1 * * *     zimbra    zmbackup -f -dl
0 1 * * *     zimbra    zmbackup -f -al
0 0 * * *     zimbra    zmhousekeep

 

Trabalhando na Prática com Zmbackup

 

Para que o script não nos atrapalhe com a limitação de 1 backup por dia durante nossos testes, vamos desativar ela no zmbackup.conf (reative posteriormente se quiser ainda manter essa proteção). Para isso abra o arquivo /etc/zmbackup/zmbackup.conf e edite a opção LOCK_BACKUP de TRUE para FALSE:

$ vim /etc/zmbackup/zmbackup.conf
...
LOCK_BACKUP=FALSE
...

Com ela desativada, agora vamos começar a fazer os backups de nosso servidor. Para executar o backup full, basta executar zmbackup -f. Se não passar nenhum outro parâmetro, será executado um backup full da mailbox e das contas de ldap. Você pode limitar o backup para um grupo de contas simplesmente passando uma lista separada por “,” (vírgula). O backup incremental funciona da mesma maneira, basta usar a opção -i, lembrando que se não existe nenhum backup, um full será realizado no lugar.

$ zmbackup -f account01@domain.com,account02@domain.com...,accountn@domain.com

Para restaurar um backup, você precisa do nome da sessão que deseja restaurar. O nome da sessão sempre é <tipo>-<data>, como por exemplo “full-09232017093022”, aonde é o backup full feito no dia 23 de Setembro de 2017 ás 09:30:22. Você consegue encontrar essas informações executando o comando zmbackup -l, ou entrando dentro do diretório aonde você armazenou seus backups. O nome da sessão é o mesmo que o nome do diretório.

$ zmbackup -r -m full-09232017093022 account01@domain.com,account02@domain.com...,accountn@domain.com

A opção -m é necessária para informar que tipo de restore você deseja executar. Diferente do zmbkpose, o zmbackup só restaura aquilo que você solicitar. Ele não irá restaurar o LDAP exceto se você usar a opção -ldp no lugar da -m, e vice versa. Um ponto interessante de quando você executa um restore com base de um full backup: todos os incrementais posteriores também são restaurados sem a necessidade de executar manualmente um a um eles.

Por ultimo, caso deseje deletar um backup, basta executar o comando com o parâmetro -d informando o nome da sessão que deseja excluir. O rotacionamento de backup não é feito através desse comando… ele só serve para jogar fora manualmente uma sessão ou outra, caso seja necessário. O script zmbhousekeep é quem cuida de rotacionar as sessões de backup, jogando fora aquelas que passaram do tempo informado no arquivo zmbackup.conf.

$ zmbackup -d full-09232017093022

 

Conclusões

 

Com isso termino esse artigo sobre o Zmbackup. Existem diversas ideias que pretendo colocar em prática, mas tudo depende de quão viável esse projeto se mostre com o passar do tempo para que eu possa me dedicar mais a ele. Nesse momento o projeto encontra-se na versão 1.1.3 estável dentro do GitHub (ultima atualização lançada no dia 21 de Abril de 2017). Você poderá seguir o projeto através do link abaixo:

Links:

  • https://github.com/lucascbeyeler/zmbackup – Zmbackup
  • https://github.com/bggo/Zmbkpose – Zmbkpose

45 comentários

  1. fagner Responder

    boa tarde.. poderia deixar um pouco mais claro as opçoes de restauração? perdoe minha ignorância… o backup a principio foi executado com sucesso.. porem a restauração em outro servidor não estou conseguindo fazer… poderia detalhar como seria o processo de restauração full ? nesse novo servidor?

    aguardo contato.

    CentOS 7, Zimbra 8.8.10, zmbackup version: 1.2.3

    • Lucas Costa Beyeler Autor do postResponder

      Se forem servidores com hostname diferentes, você precisará fazer algumas alterações para que isso funcione. O arquivo LDAP estará ainda apontando para o antigo, e isso impede que você consiga importar os e-mails… Altere o arquivo de cada conta para o novo servidor e isso funcionará corretamente.

  2. Maycon Ritzmann Responder

    Estou tendo problemas com o envio de e-mails a partir da ferramenta, alguma sugestão de como debugar o erro?

  3. Dalton Responder

    Lucas,

    eu estava tendo um erro em que o arquivo tgz estava sendo gerado com 0kb. Identifiquei que isso estava ocorrendo porque uso um certificado auto-assinado. Para resolver o problema, tive que adicionar o parâmetro –auth-no-challenge no seu script, na função loop_mbldp_backup().

    Assim, o código foi alterado de:

    loop_mbldp_backup()
    {
    load_config
    if [ “$3” == “INC” ]; then
    DATE=$(grep $1 $WORKDIR/sessions.txt | tail -1 | awk -F: ‘{print $3}’ | cut -d’-‘ -f2)
    AFTER=’&'”start=”$(date -d $DATE +%s)”000″
    fi
    ldapsearch -x -H $LDAPSERVER -D $LDAPADMIN -w $LDAPPASS -b ” \
    -LLL “(&(|(mail=$1)(uid=$1))$2)” > $TEMPDIR/$1.ldiff
    wget –timeout=5 –tries=2 –quiet -O $TEMPDIR/$1.tgz –user $ADMINUSER \
    –password $ADMINPASS “https://$MAILHOST:7071/home/$1/?fmt=tgz$AFTER” –no-check-certificate
    echo $SESSION:$1:$(date +%m/%d/%y) >> $TEMPSESSION
    }

    para

    loop_mbldp_backup()
    {
    load_config
    if [ “$3” == “INC” ]; then
    DATE=$(grep $1 $WORKDIR/sessions.txt | tail -1 | awk -F: ‘{print $3}’ | cut -d’-‘ -f2)
    AFTER=’&'”start=”$(date -d $DATE +%s)”000″
    fi
    ldapsearch -x -H $LDAPSERVER -D $LDAPADMIN -w $LDAPPASS -b ” \
    -LLL “(&(|(mail=$1)(uid=$1))$2)” > $TEMPDIR/$1.ldiff
    wget –timeout=5 –tries=2 –quiet -O $TEMPDIR/$1.tgz –user $ADMINUSER \
    –password $ADMINPASS “https://$MAILHOST:7071/home/$1/?fmt=tgz$AFTER” –no-check-certificate –auth-no-challenge
    echo $SESSION:$1:$(date +%m/%d/%y) >> $TEMPSESSION
    }

    • Lucas Costa Beyeler Autor do postResponder

      O que sugiro: abra uma issue no github com essa correção que irei incluir no código 🙂

      Eu posso fazer isso, mas não sei se gostaria de ter essa correção em seu nome lá…

  4. João Pinheiro Responder

    Estou com um problema nesta versão zmbackup version: 1.2.3. Estou rodando em um servidor antigo CentOS 5.9 (por enquanto) para fazer o backup do Zimbra na versão 6.0.16 (por enquanto). O pro é o seguinte:
    [zimbra@mail root]$ zmbackup -f
    /usr/local/lib/zmbackup/bash/ListAction.sh: line 46: truncate: command not found
    parallel: Warning: YOU ARE USING –tollef. IF THINGS ARE ACTING WEIRD USE –gnu.
    parallel: Warning: –tollef is obsolete and will be retired 20140222.
    parallel: Warning: See: http://lists.gnu.org/archive/html/parallel/2013-02/msg00018.html
    Backup session full-20181012173955 started on Sex Out 12 17:39:55 BRT 2018
    parallel: Warning: YOU ARE USING –tollef. IF THINGS ARE ACTING WEIRD USE –gnu.
    parallel: Warning: –tollef is obsolete and will be retired 20140222.
    parallel: Warning: See: http://lists.gnu.org/archive/html/parallel/2013-02/msg00018.html
    Backup session full-20181012173955 finished on Sex Out 12 17:39:56 BRT 2018

    • Lucas Costa Beyeler Autor do postResponder

      Olá João,

      Infelizmente nunca testei essa ferramenta no CentOS 5, até porque o parallel funciona de maneira diferente nessa versão. O que sugiro, abra o código fonte e inclua o parâmetro –gnu em todas as chamadas do Parallel… Talvez isso resolva.

  5. Marcelo Responder

    parallel… [NOT FOUND]

    You’re missing some dependencies OR they are not on zimbra’s PATH.
    Please correct the problem and run the installer again.

    Zimbra 8.8.9 , baixei via git e rodei o wizard.
    Existe algum diretorio padrão que deja ser colocado ?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *