Автоматический бекап файлов и баз сайтов на удаленный ftp

Скачать Автоматический бекап файлов и баз сайтов на удаленный ftp
Недавно искали:

Itnull

Команда форума
Администратор
Регистрация
22.05.13
Сообщения
25.531
Реакции
9.481
Веб-сайт
itnull.me
  • Автор темы
  • Администратор
  • Модер.
  • Команда форума
  • #1
backup.sh:
Код:
    #!/bin/sh
    
    ########################################
    # простейший bash-скрипт для создания и хранения резервной копии сайта БД Mysql
    # резервные копии сохраняются ежедневные (daily), а также Пн (monday), Ср (wednesday), Пт (friday)
    # Copyleft (c) Sayid Munawar. [email protected]
    # LICENSE: anyone can copy / modify / distribute. whatever lah
    #
    # пример задания в crontab ( выполнится Пн-Пт в 18:00)
    # 0 18 * * 1-5 /home/backup/backup.sh
    ########################################
    
    PATH=$PATH:/usr/bin:/bin:/usr/local/bin
    
    inifile=`dirname $0`/backup.ini
    
    # Настройки подключения к FTP
    FTP_SERVER="ftp://ftp.host.net"
    FTP_USER="ftplogin:ftppassword"
    ## Далее ничего не изменяем
    
    DATENAME=`date %A | tr "[:upper:]" "[:lower:]"`
    if [ $DATENAME != monday -a $DATENAME != friday -a $DATENAME != wednesday ] ; then
    DATENAME="daily"
    fi
    
    ##Проверяем, есть ли файл с настройками копирования в папке со скриптом
    test ! -r $inifile && echo "ERROR! backup.ini not found nor readable" && exit 1
    
    ##Проверяем, применен ли chmod 600 к файлу настроек (запретить доступ на чтение и запись для всех, кроме владельца)
    echo -n `stat -c '%a' $inifile` | grep -q '[0-7]00' >/dev/null 2>&1
    test $? -gt 0 && echo "ERROR! $inifile can be read by others" && exit 2
    
    ## Парсим ini файл (backup.ini)
    #
    # $1 -> file.ini
    # $2 -> section
    _parse_ini () {
    if [ -z "$1" ] || [ -z "$2" ]; then return 0; fi
    eval `cat $1 |
    sed -e 's/[[:space:]]*=[[:space:]]*/=/g'
    -e 's/;.*$//'
    -e 's/[[:space:]]*$//'
    -e 's/^[[:space:]]*//'
    -e "s/^(.*)=([^"']*)$/1="2"/" |
    sed -n -e "/^[$2]/,/^s*[/{/^[^;].*=.*/p;}"`
    }
    
    
    _parse_ini $inifile main
    
    ## Проверяем подключение к MySQL
    mysql -u $mysql_user -p${mysql_pass} -e '' > /dev/null 2>&1
    test $? -gt 0 && echo "ERROR! Failed to connect to mysql" && exit 4
    
    ## Проверяем наличие/создаем директорию назначения на локальном сервере
    test ! -d $target && mkdir -p $target
    
    # Получаем pwd - текущую папку
    cwd=`pwd`
    
    # Производим операцию архивирования
    for section in `cat $inifile | grep '^[' | grep -v main | sed 's/[//' | sed 's/]//'`; do
    outdir=$target/$section/$DATENAME
    echo Backing up ${section} to $outdir...
    # парсим .ini
    _parse_ini $inifile $section
    # Проверяем, есть ли вообще папка-источник
    test ! -d $path && echo "Warning: $path not found. Backup process of $section skipped" && echo && continue
    mysql -u $mysql_user -p${mysql_pass} -e '' $mysql_db > /dev/null 2>&1
    test $? -gt 0 && echo "Warning: Database $mysql_db not found. Backup process of $section skipped" && echo && continue
    
    test ! -d $outdir && mkdir -p $outdir
    cd $path
    ## Архивируем папку-источник таром с одновременным гзипованием в папку назначения на локальном сервере
    tar -czpf $outdir/$section.tar.gz .
    cd $cwd
    ## Дампим базу данных и гзипуем в папке назначения на локальном сервере
    mysqldump -Q -u $mysql_user -p${mysql_pass} $mysql_db | gzip > $outdir/${mysql_db}.sql.gz
    ## Создаем символические ссылки на последние версии архивов
    ln -fs $outdir/$section.tar.gz $target/$section/latest.tar.gz
    ln -fs $outdir/${mysql_db}.sql.gz $target/$section/latest.sql.gz
    ## Коннектимся к ФТП и кладем архивы в соответствующие папки
    curl -T $outdir/$section.tar.gz $FTP_SERVER/$DATENAME/$section.tar.gz --user $FTP_USER
    curl -T $outdir/${mysql_db}.sql.gz $FTP_SERVER/mysql/$DATENAME/$section.sql.gz --user $FTP_USER
    done

Как видим, все очень просто. В соответствующей секции (комментарии подскажут) нужно указать настройки подключения к ФТПшнику. Никаких особых заморочек с инкрементальным архивом и т.п. Т.е. для огромных проектов этот скрипт не подойдет (точнее, не будет столь удобен, как инкрементальные архивы). Не забудьте заранее создать на ФТПшнике папки: monday, wednesday, friday, daily; mysql/monday, mysql/wednesday, mysql/friday, mysql/daily. На всякий случай бекап храним в четырех версиях - дневной, за понедельник, среду, пятницу. Файл backup.sh должен быть разрешен для выполнения (chmod +x backup.sh)

А теперь о настройке источников резервирования. Наверняка на сервере под каждый сайт (или группу сайтов) заведен свой пользователь, а это значит, что путь к папкам с файлами сайтов будет отличаться от пользователя к пользователю. Именно это и есть причина указания папок в файле настроек. Ну, и базы... Наверняка ведь разные :)

backup.ini:
Код:
    [main]
    target = /home/backup/storage ; Путь для сохранения бекапов на локальном сервере
    mysql_user = root ; root может подключиться к любой БД
    mysql_pass = secret ; mysql root пароль
    
    [vasyapupkin]
    path = /home/vasyapupkin/vasyapupkin.com/public_html ; Путь к файлам сайта
    mysql_db = vasyapupkin ; Имя базы данных
    
    [petyarus]
    path = /home/petyarus/petya.ru/public_html
    mysql_db = test


Секции (в квадратных скобках) можно называть, например, именем сайта (domen.vasya.com). Соответственно для первой пользовательской секции в настройках файлы бекапов будут иметь имена: vasyapupkin.tar.gz - файлы, vasyapupkin.sql.gz - база. Секция [main] является обязательной, поскольку хранит данные для коннекта к БД и путь для сохранения бекапов на локальном сервере. Файл backup.ini должен иметь chmod 600 и находиться в той же папке, что и backup.sh.

Команда для крона указана в шапке backup.sh.
 
Назад
Сверху Снизу