Бэкап сайта на Яндекс.Диск в Debian

Дмитрий Корнев
3 февраля 2015

Создавать копии файлов и базы сайта очень важно. Хорошо, если ваш хостинг облегчил задачу и занимается этим самостоятельно. Но если нет, или предлагает это за отдельную плату, то можно посмотреть в сторону Яндекс.Диска.

Особенности:

Для Яндекс.Диска существует консольный клиент, который можно легко использовать на веб-сервере с Debian и другими операционками Linux. Вот официальная страница помощи, а здесь подробно расписана техническая сторона.

Я для веб-сервера предпочитаю Debian 7 и поэтому дальнейшее руководство составлено и опробовано именно в этой ОС. Подключаем репозиторий Яндекса, для чего в файле /etc/apt/sources.list добавляем строчку:

deb http://repo.yandex.ru/yandex-disk/deb/ stable main

Импортируем GPG-ключ:

wget -O YANDEX-DISK-KEY.GPG http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
apt-key add YANDEX-DISK-KEY.GPG

Обновляем список пакетов и устанавливаем Яндекс.Диск:

apt-get update
apt-get install yandex-disk

В процессе установки Яндекс.Диска мастер настройки спросит:

Если вопросов не последовало, то запустите мастер настройки вручную:

yandex-disk setup

Вот так всё легко! По сути вы просто отвечаете на вопросы мастера настройки, а сразу после этого Яндекс.Диск готов к работе.

Любые файлы и каталоги, которые вы поместите в каталог Yandex.Disk (название по умолчанию) будут автоматически синхронизироваться. Ну и, конечно, если у вас Яндекс.Диск и так уже не был пустым, то всё его содержимое тоже появится здесь же.

По умолчанию работает полная синхронизация данных. Убедитесь, что у вас достаточно места на диске веб-сервера.

В процессе установки Яндекс.Диск создает файл конфигурации ~/.config/yandex-disk/config.cfg. По умолчанию в нем немного параметров и их назначение не вызывает вопросов. В этот же файл можно добавлять свои параметры, в частности:

# Не синхронизировать указанные каталоги.
exclude-dirs="exclude/dir,path/to/another/exclude/dir"

Из командной строки Яндекс.Диск понимает:

yandex-disk start [OPTION]
yandex-disk stop [OPTION]
yandex-disk status [OPTION]

Соответственно, — старт, стоп и статус работы демона.

Последняя команда может показывать состояние и ошибки синхронизации, список синхронизированных файлов, общее и свободное пространство на Яндекс.Диске.

Параметры в командах можно упустить.

Я привёл не полный набор команд и параметров Яндекс.Диска, кому нужно больше, ищите подробности в официальном руководстве, ссылка выше была.

Для удобства консольный Яндекс.Диск поддерживает работу с символическими ссылками. Это действительно иногда может сильно упростить задачу синхронизации тех или иных файлов и каталогов.

Корзина Яндекс.Диска

При работе с Яндекс.Диском нужно обязательно учитывать его особенность — Корзину. Когда файлы удаляются (любым способом), то они переносятся в корзину. При этом их не видно, но они продолжают занимать место. Создание бэкапов — это цикличный процесс. Старые файлы удаляются, на их месте создаются новые, и так до бесконечности. Очевидно, что если в данном случае не чистить корзину, то однажды она переполнится и доступного для бэкапов места просто не останется. Создание бэкапов остановится!

Чистить корзину Яндекс.Диска можно только через веб-интерфейс. Никакой консольной команды или опции для работы с корзиной не существует. Однако, есть разные хитрости. Во-первых, здесь описана одна из наиболее рекомендуемых.

Во-вторых, вот другая хитрость, которой я раньше пользовался: можно создать скрипт бэкапа таким образом, чтобы старые файлы не удалялись! Старые файлы можно просто переименовывать и перезаписывать. Число файлов при этом меняться не будет и удаленных файлов в корзине тоже появляться не будет. Вот пример бэкапа каталога /etc:

#!/bin/bash
cd /root/Yandex.Disk
# переименовываем старые бекапы
mv etc_4.tar.gz etc_temp.tar.gz
sleep 10
mv etc_3.tar.gz etc_4.tar.gz
sleep 10
mv etc_2.tar.gz etc_3.tar.gz
sleep 10
mv etc_1.tar.gz etc_2.tar.gz
sleep 10
mv etc_temp.tar.gz etc_1.tar.gz
sleep 10
# запуск создания бэкапа
tar -czf /tmp/etc_work.tar.gz /etc
# перезаписываем старый бэкап
mv /tmp/etc_work.tar.gz etc_1.tar.gz

Сохраняем код в файл, куда удобно, например, в /root/backup_etc.sh, устанавливаем на него права 740 (с возможностью запуска) и добавляем в крон, допустим, для ежедневного выполнения.

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

Для верности между некоторыми командами скрипта я добавил команду sleep 10, которая обеспечивает 10-ти секундную паузу. Дело в том, что в процессе работы по такому принципу я замечал, что у меня иногда всё же образовывались лишние/удалённые файлы. Видимо, когда команды переименования и замены файлов выполняются слишком быстро, то Яндекс.Диску иногда может срывать крышу. Благодаря добавлению паузы и неторопливому выполнению команд этого удалось полностью избежать!

Автозапуск Яндекс.Диска

Мастер настройки Яндекс.Диска задает вопрос при установке: хотим ли мы запускать программу при старте системы? Конечно, на это стоит отвечать утвердительно. Так сделал и я. Но несмотря на это демон не стартовал у меня в Debian 7 автоматически. И судя по этой ссылке я не одинок. Автору заметки по ссылке отдельное спасибо! Я поступил аналогично, у меня автостарт заработал. Если коротко, то создаем скрипт запуска yandex_autorun.sh:

#!/bin/sh
yandex-disk start --dir=/root/Yandex.Disk --auth=/root/.config/yandex-disk/passwd

Это для настроек по умолчанию и пользователя root. Если при установке Яндекс.Диска вы меняли основной каталог и расположение конфигурации, то, соответственно, измените их и здесь.

Файл скрипта располагаем, где удобно, например, в каталоге того же пользователя: /root/yandex_autorun.sh. Устанавливаем на него права 740 (с возможностью запуска). Добавляем в файл /etc/crontab строчку:

@reboot sleep 60 && /root/yandex_autorun.sh

После редактирования crontab выполняем:

crontab -u root /etc/crontab

Готово, можно перезагружать веб-сервер и смотреть на результат.

Что еще плохого у Яндекс.Диска?

Кроме особенностей корзины и неработающего по умолчанию автозапуска меня озадачило, что Яндекс.Диск при синхронизации съедает определённое количество ресурсов. В частности показатель Load average на моём новом веб-сервере возрастает примерно в два раза — вместо обычных 0.4...0.8 в часы пик может доходить примерно до 1.5.

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

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

6 комментариев

Па
Спасибо за статью, некоторые команды буду сейчас применять для настройки бэкапа своего сервера. Добавлю, что команда tar хорошо кушает оперативку. Раньше я делал полный бэкап сервера, и через несколько минут архивации он уходил в своп, откуда потом долго выбирался. Теперь архивирую частями. И ещё, имхо удобней не держать yandex-disk запущенным, а использовать команду синхронизации когда нужно /usr/bin/yandex-disk sync
Как-то прошла мимо моих глаз команда yandex-disk sync. И правда, так очень даже удобно пользоваться. Спасибо за подсказку!
sh
переименование файлов конечно вариант - но есть <a href="https://tech.yandex.ru/disk/api/reference/trash-delete-docpage/" rel="nofollow">очистка корзины через api</a> - не могли бы вы его расписать подробно для чайников ? - требует знание api яндекс диска
Спасибо за ссылку, посмотрю на досуге. Использовать дополнительно api - это тоже еще тот вариант. Я все надеюсь, что яндекс сделает по-человечески - дополнительную консольную команду, которая будет чистить корзину.
sh
bash скрипт в крон в котором нужный запрос к api - думаю ничего сложного
Спасибо ещё раз! Подробное описание действий опубликовал <a href="https://d1mon.com/n/1237" rel="nofollow">здесь</a>.