Mini-tutorial de backup de sites em servidores

29/04/2018

Script para backup automatizado

#!/bin/bash
#
# /usr/local/bin/backup.sh: Um script simples para backup de banco de dados e arquivos de um(ou vários sites).
#
# Uso: ./backup.sh [clear|sites|mysql|both]
# * Não se esqueça de alterar as variáveis $USUARIO_MYSQL, $SENHA_MYSQL e $DIR_WEBSERVER!!!
# 
# Script criado por Lucas Saliés Brum a.k.a. sistematico, <lucas@archlinux.com.br>

DIR_WEBSERVER="/var/www"
USUARIO_MYSQL="root"
SENHA_MYSQL="SENHA"
DIAS=30 # Dias para manter o backup
DIR="/tmp/backup"
DIR_DB="$DIR/dbs"
DIR_SITES="$DIR/site"

backupMysql() {
	if [ ! -d $DIR_DB ]; then
		mkdir -p $DIR_DB
	else
		rm -f "$DIR_DB/*gz" > /dev/null 2>&1
	fi

	databases=$(mysql -u $USUARIO_MYSQL -p$SENHA_MYSQL -e "SHOW DATABASES;" | tr -d "| " | egrep -v "Database|mysql|performance_schema|phpmyadmin|information_schema")

	for db in $databases; do
    	if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
			banco="$(date +%Y%m%d).$db.sql"
        	mysqldump -u $USUARIO_MYSQL -p$SENHA_MYSQL --databases $db > $DIR_DB/$banco
      		gzip --force $DIR_DB/$banco
    	fi
	done	
}

backupSites() {
	SITES=$(ls -1 $DIR_WEBSERVER)

	if [ ! -d $DIR_SITES ]; then
        mkdir -p $DIR_SITES
	else
		rm -f "$DIR_SITES/*gz" > /dev/null 2>&1
    fi

	for site in $SITES; do
		if [[ "$site" != "storage" ]] && [[ "$site" != "test" ]]; then
			/usr/bin/rsync -a $DIR_WEBSERVER/$site $DIR_SITES/ --delete >/dev/null 2>&1
			gzip -r --force $DIR_SITES/$site
		fi
	done	
}

if [ "$1" == "mysql" ]; then
	echo -e "[*] Backup do MySQL"
	backupMysql
elif [ "$1" == "sites" ]; then
	echo -e "[*] Backup dos Arquivos"
	backupSites
elif [ "$1" == "both" ]; then
	echo -e "[*] Backup do MySQL"
	backupMysql
	echo -e "[*] Backup dos Arquivos"	
	backupSites
elif [ "$1" == "clear" ]; then
	echo -e "[*] Limpando backups mais antigos que $DIAS dias"
	arquivos=$(find $DIR -mtime +$DIAS)
	echo "Os arquivos:"
	echo "$arquivos"
	echo "Serão apagados."
	echo
	read -p "Você tem certeza? [s/N]: " resposta
	if [[ "$resposta" = *[sS]* ]]; then
		echo "A resposta foi sim."
		sleep 5
	else
		echo "A resposta foi não.."
	fi
fi