Создаём локальный бекап своего сайта (bash, бекап ftp и mysql)

1

Автор Ангел Куликов | Рубрики Archевод, Bash-скриптинг, Интернет, Программирование | Опубликовано 23-07-2011

Web-сервера — дело ненадёжное. Сайты часто взламывают, засоряют скриптами с последующим уничтожением/повреждением информации. В большинстве случаев у хостера есть возможность создавать бекапы сайта, но если ваш хостинг не даёт вам возможности создавать бекап — можно эту возможность сделать самому.. Скрипт, который я вам покажу — будет полезен многим, ведь когда у вас есть локальная копия, в смысле у себя на машине (компьютер, ноутбук, свой сервер) .. Зачастую так безопаснее и, как говорится, можно спокойно спать. Ну а теперь, разобравшись с проблемой, начнём со скрипта:

Вот он, собственно:

#!/bin/bash

MyUSER="пользователь базы данных"     # USERNAME
MyPASS="пароль для базы данных"       # PASSWORD
MyHOST="хост для базы данных"          # Hostname
FTPHOST="хост ftp"
FTPUSER="пользователь ftp"
FTPPASS="пароль к ftp"

# Linux bin paths, change this if it can not be autodetected via which command
MYSQL="sudo $(which mysql) -w --reconnect"
MYSQLDUMP="sudo $(which mysqldump) -v --force --single-transaction --dump-date --create-options --quick --extended-insert --debug-info --debug-check --skip-lock-tables --set-charset --allow-keywords --max-allowed-packet=64M"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"

# Backup Dest directory, change this if you have someother location
DEST="путь к месту синхронизации"

# Main directory where backup will be stored
MBD="$DEST/mysql/" # Здесь сохраняются бекапы для базы данных
TMP="$DEST/tmp"    # Здесб сохраняются бекапы для фтп

# Get hostname
HOST="$MyHOST"

# Get data in dd-mm-yyyy format
NOW="$(date +"%Y.%m.%d")"

# File to store current backup file
FILE=""
# Store list of databases
DBS=""

# Не синхронизировать эти бд (через запятую..)
IGGY=" information_schema, databases, --------------, show, information_schema"

[ ! -d $MBD ] && mkdir -p $MBD || :
[ ! -d $TMP ] && mkdir -p $TMP || :
[ ! -d "$DEST/ftp/" ] && mkdir -p "$DEST/ftp/" || :

# Only root can access it!
$CHOWN -hR  $DEST
$CHMOD 0644 $DEST

# Get all database list first
DBS="$($MYSQL --user=$MyUSER --host=$MyHOST --password=$MyPASS -Bse 'show databases')"

for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ];
    then
	for i in $IGGY
	do
	    [ "$db" == "$i" ] && skipdb=1 || :
	done
    fi

    if [ "$skipdb" == "-1" ] ; then
	FILE="$TMP/$db.$MyHOST.$NOW.$(date +%s).gz"

	# do all inone job in pipe,
	# connect to mysql using mysqldump for select mysql database
	# and pipe it out to gz file in backup dir :)
        $MYSQLDUMP --user=$MyUSER --host=$MyHOST --password=$MyPASS $db | $GZIP -9 > $FILE
    fi
done

CT=$NOW.$(date +%s);
tar -C $TMP/ -czpvf - . | cat > $TMP/../db_backup_$CT.tgz
rm -r $TMP/* --interactive=never
mv $TMP/../db_backup_$CT.tgz $MBD/
rm -r $TMP
progressfilt ()
{
    local flag=false c count cr=$'\r' nl=$'\n'
    while IFS='' read -d '' -rn 1 c
    do
        if $flag
        then
            printf '%c' "$c"
        else
            if [[ $c != $cr && $c != $nl ]]
            then
                count=0
            else
                ((count++))
                if ((count > 1))
                then
                    flag=true
                fi
            fi
        fi
    done
}

cd $DEST
wget --progress=bar:force -m --no-passive-ftp --ftp-user=$FTPUSER --ftp-password=$FTPPASS ftp://$FTPHOST -c 2>&1 | progressfilt
tar -C $DEST/$FTPHOST/ -czpvf - . | cat > $DEST/ftp_backup_$CT.tgz | mv $DEST/ftp_backup_$CT.tgz "$DEST/ftp/"
rm -r $DEST/$FTPHOST/

Надеюсь, вам пригодится данный скрипт. Себе же я поставил его на так называемый «сервер». В CRONTAB выставляем следующее:

@daily /путь/к/скрипту/<имя скрипта>

Таким образом синхронизация (создание локального бекапа) будет проводится ежедневно в 00:00.

С ув. Ангел Куликов

Теги статьи: , , , , , , , ,

Комментариев (1)

Написать комментарий

Вы должны войти чтобы добавить свой комментарий.