Скрипт писался для бекапа нескольких 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