Backups · 6 min read · Dec 02, 2025

Estendendo o Servidor Perfeito - Debian Squeeze [ISPConfig 3] - Página 6

10. Backups dos Clientes

O conteúdo do script mudou em 29-03-2011. Por favor, atualize

Este script NÃO funcionará corretamente para ISPConfig v. 3.0.5 e acima. Você terá que fazer muitas alterações e não é recomendado. Por favor, use a nova forma de backup do ISPConfig.

O seguinte script é uma maneira fácil de fazer backup dos dados dos seus clientes e dos bancos de dados dos clientes na pasta do site deles. Como você deve saber, no ISPConfig3, cada cliente tem uma pasta na forma /var/www/clients/clientXY, na qual estão todos os seus sites. O script fará backup de todos os seus sites em cada pasta da web, juntamente com seus bancos de dados, e o cliente poderá baixá-los. Caso um cliente tenha mais de um banco de dados, todos os bancos de dados serão salvos em seu primeiro site (com base no webID). O script também manterá os últimos 3 dias desses arquivos e os últimos 3 domingos para uso administrativo em um diretório de sua escolha (o padrão é /var/backup/sites).

Este é um script muito simples. Para uma solução mais avançada, veja este post.

Crie o script, torne-o executável e edite-o:

cd /root/scripts/
touch mybackup.sh
chmod 0700 mybackup.sh
nano mybackup.sh

O conteúdo deve ser o seguinte: (Altere as variáveis ispUSER, ispPASS, ispHOST, DEST e SITES para atender às suas necessidades):

#!/bin/bash  
# Script shell para backup do banco de dados MySql e sites dos clientes  
#   
# Última atualização: Março - 2011  
# --------------------------------------------------------------------  
# Este é um script shell gratuito sob a GNU GPL versão 2.0 ou superior  
# Copyright (C) 2011 iopen.gr  
# Comentários/sugestões: http://iopen.gr  
# --------------------------------------------------------------------  
#   
#           DESTINADO ao ISPConfig 3.0.x e acima  
#   
# Este script fará backup de cada pasta da web (web, stats, cgi etc.)  
# de cada cliente juntamente com todos os DBs do cliente  
# Os backups serão colocados na pasta do cliente do site  
# O script manterá o backup atual e os 2 backups anteriores  
# Também manterá os últimos 3 domingos  
# --------------------------------------------------------------------  
  
# Credenciais do banco de dados. Use um usuário de DB com acesso total de leitura ou use o usuário root   
ispUSER="root"                  # Usuário DB  
ispPASS="---suaSenha---"        # senha do usuário  
ispHOST="localhost"             # Nome do host  
  
CURDIR="$(pwd)"   
# Variáveis com o caminho completo para os binários  
MYSQL="$(which mysql)"  
MYSQLDUMP="$(which mysqldump)"  
CHOWN="$(which chown)"  
CHMOD="$(which chmod)"  
GZIP="$(which gzip)"  
TAR="$(which tar)"   
  
# Diretório Principal de Backup do Seu Servidor  
DEST="/var/backup"  
   
# Diretório de backup (APENAS) dos Sites no seu Diretório Principal de Backup  
SITES="$DEST/sites"  
    
# Variáveis para Datas no 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 || :  
   
# Dê apenas acesso root aos backups nas pastas deste script  
$CHOWN 0.0 -R $SITES  
$CHMOD 0600 $SITES  
  
# --------------------------------------------------------------------------   
# Remover backups anteriores (atuais) do diretório do cliente  
# Os backups estão na forma :  
# *BU*gz  
# -------- CUIDADO ---------  
# Não armazene nenhum outro arquivo nesta forma no diretório dos 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]}=usuário do domínio / nome da pasta / usuário do sistema, ${col[1]}=clientID / grupo do sistema ,  
        while read -a col  # ${col[2]}=caminho para o site, ${col[3]}= nome do domínio  
do  
                echo "    LIMPAR BACKUPS ANTIGOS na pasta ${col[2]} "  
                for delfile in ${col[2]}/*BU*gz ;   
do [ -f $delfile ] && rm $delfile;   
done  
done  
done  
  
# --------------------------------------------------------------------------   
# Remover qualquer coisa que tenha 22 dias e tenha a forma :  
# *[data 22 dias atrás]*gz  
# do diretório $SITES do servidor  
# --------------------------------------------------------------------------   
                echo "-------------------------------------------------------------"  
                echo "    LIMPAR BACKUPS ANTIGOS na pasta SITES "  
                for delfile in $SITES/*$BACK22*gz ;   
do [ -f $delfile ] && rm $delfile;    
done  
echo "-------------------------------------------------------------"  
echo "                                                             "  
echo "                                                             "  
  
# --------------------------------------------------------------------------   
# Para cada cliente, faça backup de seu banco de dados na pasta do site dele   
# Para clientes com múltiplos sites, faça backup de todos os dbs em seu primeiro site  
# Além disso, copie o backup de hoje no diretório $SITES do servidor   
# Remova o backup que é mais antigo que 3 dias do diretório $SITES do servidor  
# Mantenha os ú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]}=usuário do domínio / nome da pasta / usuário do sistema,  
        while read -a col   #${col[3]}=clientID / grupo do sistema , ${col[4]}=caminho para o site  
do  
                echo "          DB: "${col[0]}   
echo "-------------------------------------------------------------"  
echo "Fazendo Backup do DB:" ${col[0]}  "em:"  ${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 ] # se 3 dias atrás não for domingo  
                        then    #remover o  backup  
                                [ -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, faça backup de seus sites na pasta do site dele   
# Além disso, copie o backup de hoje no diretório $SITES do servidor   
# Remova o backup que é mais antigo que 3 dias do diretório $SITES do servidor  
# Mantenha os ú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]}=usuário do domínio / nome da pasta / usuário do sistema, ${col[1]}=clientID / grupo do sistema ,  
        while read -a col   # ${col[2]}=caminho para o site, ${col[3]}= nome do domínio  
do  
                echo "                                                             "  
echo "         Site:" ${col[3]}  
echo "-------------------------------------------------------------"  
echo "Fazendo Backup do site: " ${col[2]}/  "em:"  ${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 ] # se 3 dias atrás não for domingo  
                        then    #remover o backup  
                                [ -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 $CURDIR

Você pode executar o script de backup executando:

/root/scripts/mybackup.sh

ou você pode adicioná-lo como um trabalho cron (por exemplo, todos os dias às 22:30):

crontab -e

e acrescente a seguinte linha:

30 22 * * * /root/scripts/mybackup.sh > /dev/null 2>> /var/log/backup.log

Notas Finais

Por favor, sinta-se à vontade para comentar qualquer coisa sobre este tutorial em um tópico apropriado nos fóruns do HowtoForge. Comentários úteis serão incluídos em uma versão atualizada futura.

Esta é a primeira versão e, por mais cuidadoso que eu tenha sido, o tutorial pode conter erros. Por favor, me avise sobre eles, para que eu possa corrigi-los o mais rápido possível.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.