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

AdeQuAte

Профессор
Регистрация
23 Мар 2007
Сообщения
353
Реакции
47
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 и случайно удалённой мимо "Корзины" папки со всеми файлами сайта. Первый бэкап будет идти долго, последующие инкрементные бэкапы вы замечать не будете - отсылаются только изменённые части файлов.

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

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

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

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

Самое первое правило ни где не оставлять стандартные пароли.
 
Какое по размеру письмо сможет принять гугль? Эксперементировать не слишком хочеться на живом серваке.
вы бы еще root пароль где ни будь сохранили,
А что мешает штатными средствами (панель хостера) делать бекапы и отправлять на мыло?
 
Не знаю насколько оправданно делать полные бекапы сайтов и уж тем более отправлять их на почту, потому как размеры сайтов зачастую несоизмеримы с размерами почтовых ящиков, да и SMTP далеко не самый эффективный протокол, чтобы таскать гигабайты информации :)
А вот бекапы баз данных - это святое, и для этой цели я бы посоветовал использовать это бесплатный шелл-скрипт, который делает дампы указанных баз, умеет их архивировать, при необходимости, отправляет на почту, ежемесячная/еженедельная/ежедневная ротация архивов - вообщем все что нужно для ежедневных бекапов.
 
самый удобный скрипт - скрипт написанный своими руками под свои нужды. написать скрипт выдергивания списка баз, архивации их, отправки куда нужно и ротации - дело 15-ти минут.
 
отсылать бекапы на почту
это с головой не дружить....имхо:confused:
 
Назад
Сверху