parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

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

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