С недавних пор мой хостер FirstVDS делегировал ответственность за резервное копирование на своих пользователей. То есть, бекапы-то он делает, но хранить их при сбоях не обещает, а рекомендует делать это самостоятельно.
Для больших проектов, с большой посещаемостью или большим объемом данных дело понятное. Нечего изобретать велосипед - надо использовать функции посылки резервных копий на удаленный хост, встроенные в ISPmanager.
Но для мелких и средних проектов, в которых объем информации в базе не превышает 5мб, такой путь на мой взгляд не целесообразен. Если конечно таких проектов не десятки/сотни. В нашем же случае можно использовать доброту Яндекса и Гугла. :) Объемы ящиков у них сейчас хорошие и хранить небольшие резервные копии вполне себе удобно.
Поэтому садимся и делаем отсылку резевных копий к нам на почту.
- - -
В первую очередь я для себя решил, что весь проект и сервер бэкапить не имеет смысла. Достаточно сохранить основные настройки сервера и базу данных MySQL.
С учетом этих мыслей и не особо заморачиваясь делаем функцию бэкапа MySQL:
def Backup_bd():
#Папка для бэкапа базы
BACKUP_DIR = '/home/user/backups/mysql'
#Команда для MySQL
MYSQL_CMD = 'mysqldump'
#Тип архива
ZIP_CMD = 'zip'
#Нет папки? Ничего, сделаем...
if not os.path.exists(BACKUP_DIR):
os.mkdir(BACKUP_DIR)
#Дадим имя будущему файлу резервной копии
file_name = "%s.sql" % str(datetime.date.today())
#Сформируем команду для выдачи в консоль
cmd = "%(mysqldmp)s -u %(usr)s --password=%(passw)s %(db)s > %(dir)s/%(file)s" %
{
'mysqldmp' : MYSQL_CMD, #операция
'usr' : DATABASES['default']['USER'], #берем юсера из нашего settings.py
'passw' : DATABASES['default']['PASSWORD'], #Пароль
'db' : DATABASES['default']['NAME'], #Имя базы нашего проекта
'dir' : BACKUP_DIR,
'file': file_name
}
#Выполняем команду
os.system(cmd)
#Формируем путь для архивирования
backup = "%s/%s" % (BACKUP_DIR, file_name)
#Формируем путь + файл
zipfile_name = "%s.zip" % (backup)
#Проверяем есть такой файл или нет. Если есть, удаляем.
if os.path.exists(zipfile_name):
os.remove(zipfile_name)
#Формируем команду для архиватора
zip_cmds = {'zip' : ZIP_CMD, 'zipfile' : zipfile_name, 'file' : backup }
#Архивируем
os.system("%(zip)s -q -9 %(zipfile)s %(file)s" % zip_cmds)
#Проверяем архив
if not os.system("%(zip)s -T -D -q %(zipfile)s" % zip_cmds):
#Если есть проблемы удаляем архив
os.remove(backup)
return zipfile_name
Резервные копии считаем сформированными. Теперь надо их выслать по почте:
def BackupSend():
#Резервируем Mysql и получаем путь
BACKUP_BD = Backup_bd()
#Прописываем путь к резервной копии конфигов VDS
dt=str(datetime.date.today())
BACKUP_C = '/home/user/backups/name_ISPmanager_backup' + dt + '.tar.gz'
#Формируем заголовок письма в зависимости от состава
message = u'Backup user.site date:' + dt
if os.path.exists(BACKUP_BD):
message = message + '\n File:' + BACKUP_BD
BBD = True
else:
message = message + u'Бэкап mysql не сформирован'
BBD = False
if os.path.exists(BACKUP_C):
message = message + '\n File:' + BACKUP_C
BC = True
else:
message = message + u'Бэкап VDS конфигов не сформирован'
BC = True
#Формируем тело письма
msg = EmailMessage(u'Backup user.site' + dt, message, 'email@sender', ['email@receiver'])
#Прикрепляем файлы по наличию
if BBD:
msg.attach_file(BACKUP_BD)
if BC:
msg.attach_file(BACKUP_C)
#Посылаем письмо
msg.send()
#Удаляем ненужный бэкап MySQL Можно не удалять а устроить ротацию с помощью logrotate.
os.remove(BACKUP_BD)
Это весь код. Остается его добавить в cron и получать на почту резервные копии в том режиме который удобен Вам.
P.S. Представленный код не расчитан на резервные копии больше 5Мб!!!
Комментарии