Скрипт для ежедневного бэкапа вашего сайта на 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 предоставляет двухсполовинойгигабайтные ящики, конкуренты не отстают. Для цели бэкапа лучше всего завести ящик на http://mail.yahoo.com, потому что там (а) нет ограничений на размер ящика в принципе и (б) можно создать ящику псевдоним, для которого отключить спамфильтр. Последнее важно - автоматически сгенерированные письма, даже полезные, очень часто летят в "Спам" и удаляются оттуда через месяц.

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

    Откройте http://бла-бла-бла/cgi-bin/emailbackup.cgi в браузере, убедитесь, что всё работает.

    Создайте на сайте папку ВНЕ веб-пространства. ПЕРЕМЕСТИТЕ 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 "Готово!"
    Раз уж начали стелить соломку, позаботьтесь и о домашнем компьютере. Если у вас толстый безлимитный канал в интернет, подпишитесь на сервис https://mozy.com/registration/free (пакет "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: http://sourceforge.net/projects/automysqlbackup/это бесплатный шелл-скрипт, который делает дампы указанных баз, умеет их архивировать, при необходимости, отправляет на почту, ежемесячная/еженедельная/ежедневная ротация архивов - вообщем все что нужно для ежедневных бекапов.
     
  9. nicky

    nicky Создатель

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

    sens7 Постоялец

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