Автоматическое резервное копирование файлов сайта и базы данных


Для каждого из различных веб-сайтов, резервное копирование файлов веб-сайта и связанные с ними базы данных в один от сжатого архива (один zip-файл на сайте) и скачать что в моей локальной машине с Windows Виста. Мои сайты хостятся на машинах Unix доступен по SSH. Я решил использовать Python ткани , как это, кажется, хорошо подходит для работы.

Это работает, но это какая-то лажа, потому что я просто взломал его вместе. Я хочу сделать его чище и немного более обобщенной. Например, сейчас он жесткий-кодов, где я хранения веб-приложений на сервере, но на самом деле для некоторых моих сайтах, они хранятся в разных местах. Кроме того, он чувствует себя немного шаткий, чтобы сохранить файл БД к веб-каталог файлов, но я не знаю, как еще я могу легко сделать это в zip-архиве.

import time
from fabric.api import *

env.hosts = ['example.com']
env.user = 'someuser'
env.password = 'somepassword'

def backup_database(app_name, db_name):
    db_passwords = {'somedatabasename': 'somedbpassword'}
    mysqldump_command = 'MYSQL_PWD=%(password)s ionice -c2 -n6 mysqldump -u' + 
        ' %(database_name)s %(database_name)s ' +
        '> ./webapps/%(app_name)s/%(database_name)s.sql' % {
        'password': db_passwords[db_name],
        'database_name': db_name,
        'app_name': app_name
        }
    run(mysqldump_command)


def backup_site(app_name):
    date = time.strftime('%Y-%m-%d')
    zip_filename = '%(app_name)s-%(date)s.zip' % { 'date': date, 'app_name': app_name }
    zip_command = 'zip -r %(zip_filename)s ./webapps/%(app_name)s > /dev/null' % {
        'zip_filename': zip_filename, 'app_name': app_name }
    run(zip_command)
    get(zip_filename, zip_filename)
    run('rm ' + zip_filename)

def backup_webapp(app_name, db_name):
    backup_database(app_name, db_name)
    backup_site(app_name)
    rm_command = 'rm $HOME/webapps/%(app_name)s/%(database_name)s.sql' % {
        'database_name': db_name,
        'app_name': app_name
    }
    run(rm_command)

def backup():
    backup_webapp('somewebappfoldername', 'somedatabasename')

Используя инструмент ткань я называю скрипт вроде этого:

с:> резервное копирование ФАБ

Если вы не знаете, ткань, файла скрипта на языке Python и выполнения команды выполняются через SSH на удаленном сервере. И сделать команду будет тянуть файл с удаленного сервера на локальную машину.

Что она делает это:

  1. Резервное копирование базы данных в sql-файл и положить его в сайту webdirectory
  2. Зип каталог
  3. Скачать zip на моей локальной машине
  4. Удалить zip-файл на сервере и удалить резервную копию базы данных из веб-каталога


1622
4
задан 14 ноября 2011 в 04:11 Источник Поделиться
Комментарии
1 ответ

Имена выбираются хорошо. Код-это понятно. Очевидно, что для специализированного случая, поэтому есть много констант в коде - это нормально. Это сугубо процедурный характер, который является хорошей вещью - ООП имеет тенденцию только становиться шаблонный для мелких вещей, как эти (это будет полезно, если вы задумали сделать рамку для инструмент для резервного копирования)

Я бы наверняка удалить ненужные переменные.


  • db_passwords = {'somedatabasename': 'somedbpassword'} , которое используется только несколько строк позже, как db_passwords[имя_базы_данных], берем пароль в качестве аргумента в функцию вместо.

  • дата = время.функцию strftime('%г-%м-%д'), Было бы понятно, если бы вам пришлось использовать его дважды и убедитесь, что он по-прежнему был один и тот же день (в этом случае я бы поспорил на аргумент функции), но в вашем случае вы используете только один раз. Чтобы удалить переменную и сделать вместо ... 'дата': время.функцию strftime('%г-%м-%д').

Некоторые переменные может быть лучше в качестве функций, например
- zip_command, я хотел поместить это в функцию, которая будет принимать функция app_name и именем в качестве аргумента, а затем вернуться в команду. Конечно, в день вы хотите, чтобы разные команды Молния в зависимости от размера базы данных или резервное время вы просто добавить дополнительный аргумент.

Возможно, более субъективен, но я бы пошел на новый продвинутый строку форматирования.

Обобщать свой инструмент, я бы сделал одно из двух: а) поставить параметры в командной строке (например, argparse или optparse) или б) использовать файл конфигурации (ткань может иметь среду, файл как аргумент). Я бы только поставил те варианты, которые различаются между сайтами (а не делать все возможное со взрывом в коде не добавил реальная польза).

2
ответ дан 29 ноября 2011 в 01:11 Источник Поделиться