Скрипт для ежедневного бэкапа вашего сайта на email через cron

Тема в разделе "Администрирование серверов", создана пользователем AdeQuAte, 30 апр 2008.

Модераторы: mefish, stooper
  1. AdeQuAte

    AdeQuAte

    Регистр.:
    23 мар 2007
    Сообщения:
    353
    Симпатии:
    45
    Sanja v.2 02.09.2007 18:27 / 03.09.2007 01:13


    Начитавшись про вирусы, крадущие FTP-пароли и прочий беспредел, решил сваять небольшой скриптик, который делает архив выбранной папки и базы MySQL и высылает его на email.

    Те готовые скрипты для этой цели, что нашёл мне Google, не подходили - они все используют mutt, а не sendmail, и хотят zip. Мой требует только tar, gzip, sendmail, mysqldump, basename, uuencode и sed, которые есть даже на самых злючих хостингах.

    Нынче Google предоставляет двухсполовинойгигабайтные ящики, конкуренты не отстают. Для цели бэкапа лучше всего завести ящик на Перейти по ссылке, потому что там (а) нет ограничений на размер ящика в принципе и (б) можно создать ящику псевдоним, для которого отключить спамфильтр. Последнее важно - автоматически сгенерированные письма, даже полезные, очень часто летят в "Спам" и удаляются оттуда через месяц.

    Скопируйте код ниже в файл emailbackup.cgi. Отредактируйте текст, вставьте пути к своим файлам и пароль к вашей базе MySQL. Закачайте файл в папку cgi-bin по FTP в ASCII-режиме. Выставьте на файл права 755.

    Откройте Перейти по ссылке в браузере, убедитесь, что всё работает.

    Создайте на сайте папку ВНЕ веб-пространства. ПЕРЕМЕСТИТЕ emailbackup.cgi туда.

    Через контрольную панель хостинга вставьте в cron команду
    /home/users/полный/путь от корня к/emailbackup.cgi >/dev/null 2>&1
    и укажите, чтобы она запускалась раз в сутки по ночам ("волчий час" - пять утра, когда загрузка хостинга минимальна, сойдёт).

    А вот и код:
    #!/bin/sh

    # Скрипт для высылки бэкапов сайта на почту.

    # Настройки доступа к MySQL-базе, которую вы хотите бэкапить:
    DBNAME="имя_базы"
    DBUSER="логин_mysql"
    DBPASS="ваш_пароль_mysql"

    # Имя папки, всё содержимое которой надо бэкапить (без слэша на конце:(
    files_to_backup="/home/бла-бла-бла/html"

    # Имя пустой временной папки за пределами wwwroot,
    # в которую у вас есть права записи. Путь от корня, без слэша на конце:
    TempFiles="/home/бла-бла-бла/TempFiles"

    # Имя временного файла, в который будет запакован бэкап MySQL
    # (вложение в письмо будет называться так:)
    mysql_backup_filename=$TempFiles/mysql_backup.sql.gz
    files_backup_filename=$TempFiles/files_backup.tar.gz
    # (эти файлики будут удалены в конце работы скрипта!)

    # Путь к sendmail; postfix или msmtp тоже сгодятся:
    sendmail=/usr/sbin/sendmail

    # Параметры отправляемого сообщения:
    from=robot@бла-бла-бла.com
    recipient=бла-бла-бла@yahoo.com
    # Subject лучше писать латиницей!
    subject="Backup of бла-бла-бла,com"

    ###################################################
    # Больше ничего редактировать не надо! (наверное)
    #

    printf "Content-Type: text/plain; charset=WINDOWS-1251\n\n"

    echo "Начинаем бэкап..."
    echo "Делаем дамп базы MySQL и пакуем его..."
    # параметр -с запуска gzip означает, что файл для сжатия надо брать со stdin
    mysqldump --opt --quote-names -u $DBUSER -p$DBPASS $DBNAME | gzip -9c > $mysql_backup_filename

    echo "Архивируем файлы..."
    # опция "-f -" означает, что архив надо отправлять в stdout
    tar --create --exclude='parser3.cgi' --exclude='*.so' \
    --file - $files_to_backup | gzip \
    -9c > $files_backup_filename

    echo "Создаём текст сообщения для отправки..."
    msgdate=`date +"%a, %d %b %Y %T %z"`
    boundary="0__=4CBBF9D3DFA196658f9e8a93df938690918c4CBBF9D3DFA19775"
    attachment_mysql=`basename "$mysql_backup_filename"`
    attachment_files=`basename "$files_backup_filename"`
    mimetype="application/x-gzip"

    cat > msg.tmp <<ENDBLOCK
    Date: $msgdate
    From: $from
    To: $recipient
    Subject: $subject [$msgdate]
    Mime-Version: 1.0
    Content-Type: multipart/mixed; boundary="$boundary"
    Content-Disposition: inline

    --$boundary
    Content-Type: text/plain; charset=windows-1251
    Content-Disposition: inline

    Бэкап вашей базы MySQL и файлов, сделанный
    $msgdate

    --$boundary
    Content-Type: $mimetype;name="$attachment_mysql"
    Content-Disposition: attachment; filename="$attachment_mysql"
    Content-Transfer-Encoding: base64

    ENDBLOCK

    echo >> msg.tmp

    echo "Перекодируем дамп MySQL в base64..."
    uuencode -m $mysql_backup_filename $attachment_mysql | sed '1d' >> msg.tmp

    cat >> msg.tmp <<ENDBLOCK

    --$boundary
    Content-Type: $mimetype;name="$attachment_files"
    Content-Disposition: attachment; filename="$attachment_files"
    Content-Transfer-Encoding: base64

    ENDBLOCK

    echo "Перекодируем архив с файлами в base64..."
    uuencode -m $files_backup_filename $attachment_files | sed '1d' >> msg.tmp

    # печатаем последнюю строку email-сообщения:
    echo -e "\n--$boundary--" >> msg.tmp

    echo "Отправляем письмо на адрес $recipient ..."
    cat msg.tmp | $sendmail -t

    echo "Прибираемся за собой..."
    rm msg.tmp
    rm $mysql_backup_filename
    rm $files_backup_filename

    echo "Готово!"
    Раз уж начали стелить соломку, позаботьтесь и о домашнем компьютере. Если у вас толстый безлимитный канал в интернет, подпишитесь на сервис Перейти по ссылке (пакет "Free"), чтобы наиболее важные вам папки бэкапились на этот сайт (квота до двух гигабайт - бесплатно, можно шифровать данные своим ключом). Эта штуковина меня не раз спасала от потери сглюкнувшего почтового файла Outlook Express и случайно удалённой мимо "Корзины" папки со всеми файлами сайта. Первый бэкап будет идти долго, последующие инкрементные бэкапы вы замечать не будете - отсылаются только изменённые части файлов.

    Кто-то использует? Хотелось бы узнать ваше мнение.
     
    Kif и wayker47 нравится это.
  2. Tele2

    Tele2

    Регистр.:
    14 апр 2006
    Сообщения:
    784
    Симпатии:
    94
    Я не уверен, что гугл сможет принять, например, гигабайтное письмо. Я ошибаюсь?
     
  3. mikie

    mikie Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    107
    Симпатии:
    3
    а не проще на /etc/proftpd.conf поставить
    <limit login> и свой IP указать, а еще лучше порт другой указать выше 1000 чтобы был ? ну и в голове держать пароль, а в тотал(кют-фтп) и прочих прогах не сохранять?

    Добавлено через 1 минуту
    вы бы еще root пароль где ни будь сохранили, или не сохраняли, и чтобы был 12345 :D - ip можете в хайде указать :D
     
  4. Muntik

    Muntik

    Регистр.:
    3 июн 2008
    Сообщения:
    457
    Симпатии:
    88
    Пойду инсталить...)) думаю хорошая штуковина, как что отпишу ))
     
  5. docent715

    docent715 Писатель

    Регистр.:
    17 сен 2006
    Сообщения:
    8
    Симпатии:
    1

    [/I]вы бы еще root пароль где ни будь сохранили, или не сохраняли, и чтобы был 12345 :D - ip можете в хайде указать :D[/QUOTE]

    Ну так для этого извилины нужны, а у половины псевдо админов доморощенных оные отсутствуют.

    Самое первое правило ни где не оставлять стандартные пароли.
     
  6. Saboteur

    Saboteur Постоялец

    Регистр.:
    7 авг 2006
    Сообщения:
    130
    Симпатии:
    38
    Какое по размеру письмо сможет принять гугль? Эксперементировать не слишком хочеться на живом серваке.
    А что мешает штатными средствами (панель хостера) делать бекапы и отправлять на мыло?
     
  7. AdeQuAte

    AdeQuAte

    Регистр.:
    23 мар 2007
    Сообщения:
    353
    Симпатии:
    45
    В том то и юмор статьи что это автоматом делается..
     
  8. X-Ception

    X-Ception Прохожие

    Не знаю насколько оправданно делать полные бекапы сайтов и уж тем более отправлять их на почту, потому как размеры сайтов зачастую несоизмеримы с размерами почтовых ящиков, да и SMTP далеко не самый эффективный протокол, чтобы таскать гигабайты информации :)
    А вот бекапы баз данных - это святое, и для этой цели я бы посоветовал использовать AutoMySQLBackup: Перейти по ссылкеэто бесплатный шелл-скрипт, который делает дампы указанных баз, умеет их архивировать, при необходимости, отправляет на почту, ежемесячная/еженедельная/ежедневная ротация архивов - вообщем все что нужно для ежедневных бекапов.
     
  9. nicky

    nicky Создатель

    Регистр.:
    10 фев 2008
    Сообщения:
    25
    Симпатии:
    0
    самый удобный скрипт - скрипт написанный своими руками под свои нужды. написать скрипт выдергивания списка баз, архивации их, отправки куда нужно и ротации - дело 15-ти минут.
     
  10. sens7

    sens7 Постоялец

    Регистр.:
    9 авг 2008
    Сообщения:
    51
    Симпатии:
    7
    отсылать бекапы на почту
    это с головой не дружить....имхо:confused: