Резервное копирование сайтов в Яндекс Диск



Благодаря статье Михаила Воеводского заметил, что тема резервного копирования востребована в сообществе. Решил поделиться своим скриптом резервного копирования написанным на Python. Примечателен он тем, что полностью удовлетворяет закону импортозамещения заливает файлы на Яндекс Диск, раскладывая их по папочкам вида ГГГГ-ММ-ДД. Это не все его приятные особенности, вот список:

  • Умеет удалять старые бекапы с ЯДиска, если они старее чем N дней (настраивается в config.yaml)
  • Умеет удалять старые логи с сервера
  • Раскладывает бекапы на ЯДиске по папкам вида: ГГГГ-ММ-ДД
  • Бекапит системные папки: /etc/, /var/log/, /root/

В итоге, на Яндекс Диске, в папке для бекапов указанной в config.yaml, мы получаем список файлов, похожий на этот:

Не обращайте внимания на имена пользователей u1-u15 — это у меня на сервере панелька назначает их автоматически. Если вы называете пользователей в системе по-другому, то и на Яндекс Диске они будут называться также.

Примечание

Сервер обязательно должен быть настроен по этой инструкции:

  • На каждый сайт создаётся свой пользователь в системе (1 сайт = 1 пользователь)
  • Все сайты-пользователи располагаются в /var/www/
  • Имя пользователя сайта, название и имя пользователя БД одинаковые

Инструкция по установке в Linux Ubuntu, Debian и т.п.

У вас уже должен быть установлен на сервере Python 3.

  1. Устанавливаем менеджер пакетов для Python 3:
    apt-get install python3-pip
  2. Устанавливаем пакеты для Python, от которых зависим скрипт:
    pip3 install requests
    pip3 install pyyaml
  3. Закидываем папку с бекапером куда-нибудь на сервер, например в /root/scripts/py/
  4. Настраиваем config.yaml. В конфиге указывается:
    • Имя/пароль mysql root
    • Имя/пароль от Яндекс Диска
    • Временная папка, в которую закидывать бекапы на сервере
    • Папка на Яндекс Диске, где будут лежать бекапы
    • Что бекапить (системные папки, базу, файлы)
    • Удалять ли старые логи
    • Сколько дней хранить бекапы на Яндекс Диске (более старые будут удаляться)
    На самом деле файл config.yaml хорошо оснащён комментариями (благо формат yaml позволяет), поэтому разобраться там будет совершенно легко.
  5. Вызываем
    sudo crontab -e
    и прописываем ежедневный запуск в 2 часа ночи:
    0 2 * * * /usr/bin/env python3 /root/scripts/py/YaDiskBackuper/backuper.py

Вот собственно и всё. Теперь вы можете запустить скрипт и проверить, корректно ли он работает. В консоли от рута запускаем:
sudo python3 /root/scripts/py/YaDiskBackuper/backuper.py
Замените путь до скрипта на свой.

На сервере заходим во временную папку с бекапами, заходим на Яндекс Диск и наблюдаем, появляются ли там файлы.
26 june 2016, 14:04    Павел Гвоздь   
23    790 +14

Comments (14)

  1. Наумов Алексей 27 june 2016, 11:19 # 0
    Привет! Попробовал. При запуске руками из консоли через пару секунд увидел сообщение «Enter password:».

    Проверил пароли, вроде все верно… Это к чему запрос относится? Файлы, кстати, на Яндекс.Диск начали появляться… логи и папка etc по крайней мере :)
    1. Павел Гвоздь 27 june 2016, 11:33 # 0
      Привет! Странно, сейчас проверил у себя, запроса нет. Может пароль от root юзера просит? Потому что в скриптах такого запроса нет.
      А файлы сайтов и базы появились на Яндекс Диске?
      1. Наумов Алексей 27 june 2016, 11:53 # 0
        Да, они начали появляться, правда я потом консоль закрыл и все остановилось :)

        Решил подождать пока сработает крон…
    2. Алексей Добряков 27 june 2016, 21:25 # 0
      Можно сделать проще без установки питонов
      1. Павел Гвоздь 27 june 2016, 22:05 # 0
        Как на счёт подробностей?
      2. Alex Vakhitov 28 june 2016, 16:58 # 0
        По моему лучше было бы загрузить пакет в pypi и сделать скрипт исполняемым, чтобы не мучатся. Ну и провести рефакторинг чтобы все работало на python 2, тогда сразу на любой версии ubuntu можно будет запускать. Ну и исправить нейминг :) уже давно не видел кэмэлкейс в именах файлов и модулей, а лучше просто добавить этот пакет который вы используете как зависимость
        1. Павел Гвоздь 28 june 2016, 17:01 # 0
          Покажи, как надо, пожалуйста, в соседнем топике.
          1. Alex Vakhitov 28 june 2016, 17:12 # +1
            Ну показывать если честно лень, для себя мне это не нужно учитывая что есть официальный консольный ЯД, и таки вещи по мне проще реализовать на bash. Но решение имеет право на жизнь и каждый пункт можно легко реализовать с помощью гугла, пофакту нужно просто настроить все в setup.py прри формирования пакетаю
        2. Наумов Алексей 17 august 2016, 10:32 # 0
          Привет!
          Есть небольшая проблемка, не сохраняются бекапы баз, файлы все ок, а вот баз нет.

          Пароль в конфиге root пользователя проверил 3-ды, верный.

          Куда еще посмотреть можно?..
          1. Павел Гвоздь 17 august 2016, 17:12 # +1
            Можно попробовать вручную подобную операцию проделать в терминале сервера:

            mysqldump --skip-lock-tables -u[[+mysqlUser]] -p[[+mysqlPassword]] [[+dbName]] | bzip2 -c > filename.sql.bz2
            1. Наумов Алексей 18 august 2016, 09:39 # +1
              Попробовал, увидел ошибку… связанную с тем, что мой пароль начинается с символа "&", экранирует ли скрипт пароль при выполнении команды? Может быть в этом дело?, см. superuser.com/questions/123928/escaping-a-password-using-mysqldump-console
              1. Наумов Алексей 18 august 2016, 09:40 # +1
                Ну а сама команда, когда я заключил пароль в кавычки, выполнилась успешно.
                1. Павел Гвоздь 19 august 2016, 09:13 # 0
                  Об этом речь? — github.com/gvozdb/YaDiskBackuper/commit/45dc46e5967b99a4322c74a129573e9c1c019661

                  Сообщи, пожалуйста, когда проверишь скрипт.
                  1. Наумов Алексей 19 august 2016, 09:19 # 0
                    Да, про это.

                    Бекапы раз в неделю)

                    Сообщу позже, если не забуду)))
            You need to login to create comments.