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 $CURDIRVocê pode executar o script de backup executando:
/root/scripts/mybackup.shou você pode adicioná-lo como um trabalho cron (por exemplo, todos os dias às 22:30):
crontab -ee acrescente a seguinte linha:
30 22 * * * /root/scripts/mybackup.sh > /dev/null 2>> /var/log/backup.logNotas 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.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.