Backup небольших проектов по почте

3511 2

     С недавних пор мой хостер 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Мб!!!

 

Комментарии

13 ноября 2012 г. 19:49 owlman
Хостинг делает бэкапы сам на себя. Если сервер слетит то вместе с ним слетят бэкапы. От этого и страхуемся.
13 ноября 2012 г. 17:18 Анна
Я как-то уже смотрела такой вариант. Но хостингш ежедневно делает ночной в-кап и как-то не было с ними пока проблем

Контактные данные

 Россия, г. Москва