Программирование, радиоэлектроника,
саморазвитие и частичка из моей жизни здесь...

Скрипт удаленного резервного копирования сайтов (Python class, ssh, scp, Linux)

Раньше уже был опубликован скрипт для удаленного резервного копирования сайтов с использованием WinSCP, он был удобен при работе в ОС Windows. Если же работать под Linux то данный вариант уже не подойдет.

Принял решение написать на Питоне(Python) универсальный класс для удаленного резервного копирования сайтов через протоколы SSH(Secured Shell) и SCP(Secured Copy) с поддержкой конфигурационных файлов...

Содержание:

  1. Для чего это нужно
  2. Особенности и возможности
  3. Как работает скрипт
  4. Конфигурационный файл
  5. Пример использования python-класса
  6. Режим меню
  7. Скачать скрипт

Для чего это нужно

Скрипт + класс удаленного резервного копирования сайтов и баз данных MySQL (python, ssh, linux)

Сначала как всегда бросился на поиски готовых решений в интернете, порылся в пакетах для Linux, попробовал несколько решений, почитал но ничего подходящего не нашел. А нужно было вот что:

  • Простой скрипт (1-2 файла) на Bash, Python, PHP или другом языке;
  • Без необходимости устанавливать его как сервис в системе или на удаленном сервере;
  • Используем протоколы SSH, SCP;
  • Хранение настроек в простом конфигурационном файле;
  • Резервирование нескольких сайтов за раз, нескольких БД для каждого сайта.

Находились интересные скрипты на разных языках, которые написаны умельцами для своих нужд, но ни один из них мне не подходил по приведенным выше требованиям.

Решил написать свой универсальный класс-скрипт на Питоне и поделиться им со всеми кто ищет простое решение для удаленного резервного копирования своих(и не только) сайтов и проектов используя протокол SSH(SCP).

Особенности и возможности

Основные особенности и возможности скрипта(класса):

  • Требует для работы Linux, Python + пакет Paramiko;
  • Работает через протокол SSH (22 порт по умолчанию);
  • Резервирование как отдельного сайта, так и всего списка сайтов за раз;
  • Создание и архивация дампов одной или нескольких баз данных MySQL;
  • Архивация файлов и папок на удаленном сервере в любом указанном количестве;
  • Создание архива в одном из форматов - ZIP, 7Z, TAR;
  • Защита архивов ZIP, 7Z при помощи пароля;
  • Хранение настроек для резервирования в конфигурационном файле (*.conf);
  • Хранение пароля для доступа к SSH в конфигурации или же интерактивный ввод во время работы;
  • Возможность задать шаблон для названия создаваемых архивов (имя, дата, время, таймстемп, свой текст).
  • Отображение прогресса скачивания файла с удаленного сервера по SCP

Для работы скрипта нужно установить пакет Paramiko для Питона, делается это вот такой командой:

pip install paramiko

Все, в принципе для работы скрипта больше ничего не нужно.

Как работает скрипт

Вот примерно то что делает скрипт с каждым сайтом, по пунктам:

  1. Из имени сайта генерируется псевдоним, к примеру SuperGlobalSite.info -- superglobalsite_info, этот псевдоним будет использоваться для создания временной папки резервного копирования на сервере в директории /tmp, а также как опция в имени скачиваемого архива;
  2. Проверяем указан ли пароль к SSH, если нет - просим его ввести;
  3. Подключаемся к серверу по SSH, проходим авторизацию с указанными авторизационными данными;
  4. Создаем на сервере временную директорию используя в качестве ее имени псевдоним(см. пункт 1);
  5. Проходимся по списку всех указанных Баз Данных MySQL и создаем для каждой дамп + лог файл создания дампа;
  6. Проходимся по списку файлов и директорий для архивации, добавляем их в очередь;
  7. Определяем настройки создания архивов (формат, имя, пароль);
  8. Пакуем файлы, папки, дамбы БД и сохраняем архив во временной директории на удаленном сервере;
  9. Скачиваем файл-архив с удаленного сервера;
  10. Чистим за собой мусор (удаляем на сервере временную папку что была создана для резервирования сайта);
  11. Переходим к следующему сайту или завершаем работу.

В файле sbackup_by_ph0en1x.net.py есть снизу примеры использования класса - его можно прикрутить к какому-то приложению или использовать как есть совместно с конфигурационным файлом где прописаны настройки скрипта и всех сайтов для удаленного резервирования.

Конфигурационный файл

Расскажу о структуре конфигурационного файла для работы в самостоятельном режиме - интерактивное меню для резервирования. По умолчанию, так как сейчас настроено в скрипте, конфигурационный файл называется projects.conf и должен лежать рядом со скриптом. Файл конфигурации - это обычный текстовый файл в формате ключ-значение, который разбит на секции.

Пример содержимого конфигурационного файла projects.conf с комментариями:

[General]
# полный путь к директории где будут сохраняться скачанные архивы
store_path=/home/
# Установка метода архивации
# 7z - защита паролем + шифрование заголовка архива + лучшая степень сжатия
# zip - защита паролем
# tar - сжатие (защита паролем не поддерживается)
archive_type=7z
# установка пароля для создаваемых архивов (только 7z, zip)
archive_password=somepassword_for_7z
# шаблон имени файла для создаваемых архивов
archive_name_tpl=[site_name]_[day]-[month]-[year]_[hour]-[minute]_[timestamp]

[JohnHomeSite.net]
# имя хоста сервера или IP-адрес
server_hostname=173.4.4.4
# имя пользователя для доступа по SSH
server_ssh_user=john
# пароль пользователя для доступа по SSH
# если указать пустым то будет запрошен в процессе работы
server_ssh_password=hNW1XwD0r8S
# Указываем архивировать все что содержится в папке www
1_fs_to_backup=/var/www/johnhome/johnhomesite.net/www/*
# Указываем принудительно архивировать файл .htaccess
2_fs_to_backup=/var/www/johnhome/johnhomesite.net/www/.htaccess
# Резервируем конфиг сервиса (Sphinx)
3_fs_to_backup=/usr/local/sphinx/etc/sphinx.conf
# Пакуем в архив также файл со своими заметками
4_fs_to_backup=/home/john/my_notes.txt
# Указываем хот или IP для сервера MySQL
1_mysql_hostname=127.0.0.1
# Имя пользователя MySQL
1_mysql_user=johnsql
# Пароль пользователя MySQL
1_mysql_password=CV7ZlddCEq3UYMW
# Имя резервируемой базы данных, что принадлежит сайту
1_mysql_dbname=homesitedb
# В дополнение резервируем еще одну базу данных
2_mysql_hostname=127.0.0.1
2_mysql_user=stats
2_mysql_password=jfT6fu8f4dLhGG
2_mysql_dbname=statistics

Для добавления еще одного сайта, к примеру andromeda.host - добавляем секцию [Andromeda.host] и пишем по аналогии настройки как в примере.

Если нет необходимости архивировать дамп базы данных то можно не вписывать в секцию опции 1_mysql_*, 2_mysql_* и им подобные. Количество папок и файлов для архивации можете указать сколько угодно, только не забывайте увеличивать нумерацию 1_fs_to_backup...154_fs_to_backup, это же правило касается и списка БД, думаю разберетесь ).

Пример использования python-класса

Приведу простой и с пояснениями пример как можно использовать класс Sites_Backup.

s = Sites_Backup()
s.set_site_data({
    'site_name': 'site.net',
    'server_hostname': '88.28.8.18',
    'ssh_port': 22,
    'ssh_username': 'siteuser',
    'ssh_password': '4556344jkfTEDfk',
    'archive_type': '7z',
    'archive_password': '1',
    'archive_filename_tpl': '[site_name]_[day]-[month]-[year]_[timestamp]',
    'store_path': '/tmp/',
})
s.add_mysql_database('127.0.0.1', 'sqluser', 'hdkutSQLjPasswrod', 'dbname4234')
s.add_files('/var/www/site.net/www/*')
s.add_files('/var/www/site.net/www/.htaccess')
s.backup_site()

Как видим - все просто, создаем экземпляр класса, загружаем при помощи метода set_site_data словарь с настройками, добавляем при помощи метода add_mysql_database данные для резервного копирования одной БД MySQL, при помощи метода add_files добавляем файлы и директории для архивации, а в конце запускаем процесс архивации вызвав метод backup_site.

Методы add_mysql_database и add_files можно вызывать сколько нужно раз для резервирования другиг файлов и директорий, а также нескольких баз данных MySQL.

Режим меню

Здесь таким же образом создается экземпляр класса и заполняется данными, только эти данные берутся из конфигурационного файла, для каждого сайта - отдельная секция, а секция General - общая для всех сайтов.

s = Sites_Backup()
s.set_config_file_path('projects.conf')
s.config_load_general_options()
s.config_print_menu()

Здесь все также просто: создаем экземпляр класса, указываем путь где искать конфигурационный файл, загружаем опции из секции General в конфигурационном файле, строим простое интерактивное меню на основе секций-сайтов в конфигурационном файле.

Скачать скрипт

В скрипте примерно 400 строк, поэтому выкладывать его текст здесь мы не будем.

Скачать скрипт с примером конфигурационного файла можно тут: python-sites-backup-script-ssh-scp-ph0en1x.net.zip (5 КБ)

Запускать скрипт можно как от root, так и от имени обычного пользователя. Все операции по резервированию производятся удаленно на серверах где лежит каждый сайт.

Пользуйтесь! )

0 799 Python