Рубрики
Резервное копирование

Резервное копирование на Яндекс.Диск через davfs

Резервное копирование — важная задача, которую необходимо выполнять на любом сервере, где располагаются важные данные. Решить её можно различными методами. Для больших систем — это соответствующее программное обеспечение, способное создавать бэкапы без заметной задержки в работе сервера.

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

Можно зарегистрировать выделенную учётную запись в Яндексе, а можно воспользоваться почтовым ящиком на своём домене, работающем на Почте для доменов.

Содержание статьи:

  • 1 Что нужно для такого бэкапа?
  • 2 Настройка davfs
  • 3 Создание точки монтирования и записи в /etc/fstab
  • 4 Скрипт резервного копирования

Что нужно для такого бэкапа?

Всё, что понадобится, — это пакет davfs2, посредством которого будет монтироваться раздел webdav в системе.

# aptitude install davfs2

Настройка davfs

Его конфигурационные файлы находятся в папке /etc/davfs2. В файле davfs.conf прописаны все доступные настройки со значениями по-умолчанию. Его, пока что, не будем трогать.

Интересен второй файл — secrets, содержащий логины, пароли, параметры прокси и сертификатов. Конкретнее — раздел «Credential Line», где нужно прописать запись вида:

/mnt/yadisk vashemail@yandex.ru vashparol

Первый аргумент — это точка монтирования, второй — ваша почта в Яндексе (логин), третья — пароль. Это всё, что требуется указать.

Создание точки монтирования и записи в /etc/fstab

Раздел нужно куда-то монтировать. Как видно в примере выше, это каталог /mnt/yadisk, который можно заменить на свой. Создадим его с правами доступа только для root:

# mkdir -m 0700 /mnt/yadisk

После чего редактируем файл /etc/fstab, прописывая там строку:

https://webdav.yandex.ru /mnt/yadisk davfs noauto,noexec,nosuid,file_mode=0600,dir_mode=0700    0    0

Здесь первое — адрес для подключения к Яндекс.Диску, вторая — точка монтирования, третья — тип файловой системы, четвёртая — опции.

  • noauto — отключает монтирование файловой системы при запуске ОС, либо командой mount -a
  • noexec, nosuid — запрещает запуск исполняемых файлов и установку suid/sgid битов на файлы и папки.
  • file_mode/dir_mode — устанавливает права доступа к файлам и папкам соответственно только для владельца (root, если не указан пользователь и группа в параметрах uid и gid

Почему бы не монтировать раздел автоматически? Он нужен только во время резервного копирования. А после будет а) висеть без дела, б) будет потреблять небольшое количество трафика, синхронизируя содержимое.

После сохранения fstab можно проверить, корректно ли монтируется раздел командой mount /mnt/yadisk.

Скрипт резервного копирования

У меня на сервере немного сайтов. В основном, контент изменяется нечасто и можно воспользоваться методом полного копирования.

Для этих целей написал небольшой простенький скрипт на bash.

#!/bin/bash #Инициализируем переменные BACKUPDIR="/var/tmp" #Каталог для бэкапов TMPDIR="backup" #Временная папка для копий файлов, которая потом архивируется YADISK="/mnt/yadisk" #Точка монтирования SQLDIR="sqldb" #Папка для баз данных SQLUSER="root" SQLPASS="12345" TIMEY=$(date +%F_%H%M%S) #Время в формате ГОД-МЕСЯЦ-ДЕНЬ_часминутасекунда #Проверяем наличие папки для баз данных, если её нет, создаются все необходимые. if [ ! -d "$BACKUPDIR/$TMPDIR/$SQLDIR" ]; then   mkdir -p -m 0700 "$BACKUPDIR/$TMPDIR/$SQLDIR" fi #Подключаем Яндекс.Диск mount "$YADISK" #Создаём бэкапы #1 баз данных cd "$BACKUPDIR/$TMPDIR/$SQLDIR" for database in `mysql -s -r -e 'SHOW DATABASES' | grep -v Database | grep -v information_schema | grep -v performance_schema | grep -v mysql`; do mysqldump "$database" > "$database".sql;done #2 Всех пользователей cd / tar -cf "$BACKUPDIR"/"$TMPDIR"/home.tar home #3 системных настроек tar -cf "$BACKUPDIR"/"$TMPDIR"/system.tar etc var/spool/cron/crontabs # Упаковываем в bzip-архив cd "$BACKUPDIR" tar -cjf backup-"$TIMEY".tbz2 "$TMPDIR" mv backup-"$TIMEY".tbz2 "$YADISK" # Удаляем временные файлы rm -r "$TMPDIR" # Удаляем старые архивы find "$YADISK" -type f -mtime +4 | xargs rm -f #Отключаем Яндекс.Диск umount "$YADISK" exit 1

Он запускается дважды в сутки по крону. Создаёт копии баз данных, определённых системных настроек, а также пользовательских данных (сайты). Частично он состоит из скрипта для копирования только баз данных, опубликованного ранее.

Иногда в syslog-е может появляться ошибка:

mount.davfs: open files exceed max cache size by 50 MiBytes

В этом случае монтируем раздел Яндекс.Диска и смотрим, что лежит в папке lost+found. Вычищаем её. Затем вычищаем содержимое папки /var/cache/davfs2/.

Рубрики
Резервное копирование

Скрипт резервного копирования баз Mysql в локальную папку

Решил полностью отказаться от использования ispmanager, ибо ресурсы занимает, а используется только для одного — резервного копирования данных. Но раз это можно сделать собственноручно, то держать панель на сервере для десяти сайтов вообще нет смысла.

А потому первейшей задачей становится создание резервных копий баз данных mysql. Базы небольшие по размеру, поэтому будет использоваться самый простейший вариант бэкапов — создание архивов и размещение их в определённой папке сервера.

Скрипт резервного копирования баз Mysql в локальную папку

Конечно, куда надёжней было бы отправлять бэкап по sftp куда-нибудь на другой сервер в другом дата-центре (и стране, чего уж там), но поскольку мои сайты меняются пару раз в месяц, то скачивание бэкапов раз в два дня нельзя назвать тяжёлым занятием. :)

Опыта в написании скриптов на Bash у меня не было до этого момента. Но разобраться не составило труда, учитывая многочисленные примеры скриптов резервного копирования mysql на различных сайтах об администрировании серверов.

Сам скрипт mysqlbackup.sh:

#!/bin/bash #Инициализируем переменные  TMPDIR="sqlfiles" BACKUPDIR="/storage" USER="root" PASS="xxx" TIMEY=$(date +%Y-%m-%d)  #Проверяем наличие папки для бэкапов  if [ ! -d "$BACKUPDIR" ]; then   mkdir -m 0700 "$BACKUPDIR" fi  #Проверяем наличие временного каталога  if [ ! -d "$BACKUPDIR/$TMPDIR" ]; then   mkdir -m 0700 "$BACKUPDIR/$TMPDIR" fi  #Сохраняем копии  cd "$BACKUPDIR/$TMPDIR" for database in `mysql -s -r -e 'SHOW DATABASES' | grep -v Database | grep -v information_schema | grep -v performance_schema | grep -v mysql`; do mysqldump $database > $database.sql;done  #Создаём архив  cd "$BACKUPDIR" tar -cjf databases-"$TIMEY".tbz2 "$TMPDIR" chmod 0600 databases-"$TIMEY".tbz2  #Удаляем временную папку  rm -r $TMPDIR echo "Базы данных сохранены!" exit 1

Работа с mysql выполняется непосредственно от пользователя root, так как он имеет доступ сразу ко всем базам данных.

Из бэкапа исключаются базы данных information_schemamysqlperformance_schema. Затем все базы помещаются в bzip2-архив и складируются в определённую папку, откуда их потом можно скачать.

В планировщике Cron прописывается задание на выполнение скрипта раз в сутки, например, в час ночи.

00 01 * * * sh ~/mysqlbackup.sh

Если в настройках крона задан верный email, то на почту придёт отчёт, в котором будут перечислены сохранённые базы данных.

P.S. Также можно создавать резервные копии и несколько раз в день. Для этого нужно в имени архива указывать ещё и время создания, чтобы файл не перезаписывался.