Скрипт писался для бекапа нескольких WPMU приложений.
Имеет возможность бекапить несколько сайтов WordPress по данным, указанным в файле конфигурации.
Создаёт tar.gz
архив для файлов сайта, и sql
-файл — для дампа базы данных.
Файл конфигурации обрабатывается модулем ConfigParser
.
Структура каталогов:
$ tree -d 2 . . ├── bin ├── conf └── data ├── database └── www
bin
— исполняемый файл «утилиты»;conf
— файл настроек создания бекапов;data
— каталог для хранения бекапов:database
— дампы баз;www
— архивы с файлами;
Разбито по директориям, что бы позже проще было расширить функционал (добавить restore
, загпрузку бекапов в AWS S3 и/или Glacier и т.д.)
Файл конфигурации:
$ cat conf/wp_backup.ini [site1.co.uk] www_data = '/var/www/vhosts/site1.co.uk' mysql_db = 'site1_live' mysql_host = 'localhost' mysql_user = 'user1' mysql_pass = 'pass1' [site2.de] www_data = '/var/www/vhosts/site2.de' mysql_db = 'site2_live' mysql_host = 'localhost' mysql_user = 'user2' mysql_pass = 'pass2'
Сам скрипт:
#!/usr/bin/env python from __future__ import print_function import os import datetime import subprocess import tarfile import ConfigParser TOOL_ROOT = '/home/user/backups/' BACKUPS_ROOT = os.path.join(TOOL_ROOT, 'data') WWW_BACKUPS_ROOT = os.path.join(BACKUPS_ROOT, 'www') DB_BACKUPS_ROOT = os.path.join(BACKUPS_ROOT, 'database') WEB_ROOT = '/var/www/vhosts/' config = os.path.join(TOOL_ROOT, 'conf', 'wp_backup.ini') parser = ConfigParser.ConfigParser() if len(parser.read(config)) == 0: raise Exception('ERROR: No config file {} found!'.format(config)) def www_backup(source_dir, output_file): with tarfile.open(output_file, "w:gz") as tar: tar.add(source_dir, arcname=os.path.basename(source_dir)) #print ("\nBackup content: ") #with tarfile.open(output_file, 'r') as tar: # for data in tar.getmembers(): # print(data.name) for section in parser.sections(): print('Executing WWW data backup on: {}'.format(section)) today = datetime.datetime.now().strftime('%d-%m-%Y-%H-%M') source_dir = parser.get(section, 'www_data').strip("\'") backup_name = os.path.join(WWW_BACKUPS_ROOT, section + '-' + today + '.gz') www_backup(source_dir, backup_name) print('\nExecuting MySQL data backup on: {}\n'.format(section)) mysql_host = parser.get(section, 'mysql_host') mysql_db = parser.get(section, 'mysql_db') mysql_user = parser.get(section, 'mysql_user') mysql_pass = parser.get(section, 'mysql_pass') mysql_backup_file = os.path.join(DB_BACKUPS_ROOT, parser.get(section, 'mysql_db') + '-' + today + '.sql') print ('Using: HOST: {}\nDB: {}\nUSER: {}\n'.format(mysql_host, mysql_db, mysql_user, mysql_pass)) dump_cmd = ['mysqldump ' + '--user={mysql_user} '.format(mysql_user=mysql_user) + '--password={db_pw} '.format(db_pw=mysql_pass) + '--host={db_host} '.format(db_host=mysql_host) + '{db_name} '.format(db_name=mysql_db) + '> ' + '{filepath}'.format(filepath=mysql_backup_file)] dump = subprocess.Popen(dump_cmd, shell=True) dump.wait()
Его выполнение:
$ ./wp_backup.py Executing WWW data backup on: site1.co.uk Executing MySQL data backup on: site1.co.uk Using: HOST: 'localhost' DB: 'site1_live' USER: 'user11' Executing WWW data backup on: site2.de Executing MySQL data backup on: site2.de Using: HOST: 'localhost' DB: 'site2_live' USER: 'user2'
Результат бекапа выглядит так:
$ tree -a /home/user/backups/data/ /home/user/backups/data/ ├── database │ ├── site1_live-10-06-2016-11-11.sql │ └── site2_live-10-06-2016-11-11.sql └── www ├── site1.co.uk-10-06-2016-10-55.gz └── site2.de-10-06-2016-10-55.gz