Роман Теличко

Заметки веб-разработчика/админа

Бэкапим Linux-сервер в Dropbox

// | 3820 просмотров | комментариев (0)

Если ваши серверные бэкапы могут вместиться в размер виртуального диска Dropbox’a, то думаю что разумным будет бэкапить файлы, помимо другого веника, ещё и в облако.
Начнём.

Скачиваем с официального сайта дистрибутив для командной строки (в моём случаи архитектура процессора х64, для иных процессоров вот ссылка)

sudo su
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

Перемещаем Dropbox из домашней папки вон:

mv .dropbox-dist /usr/local/lib/dropbox && chown -R root:root /usr/local/lib/dropbox

Запускаем в первый раз Dropbox руками:

/usr/local/lib/dropbox/dropboxd

Видим такое:

This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=2dc73ba6a3aXXXX to link this machine.

Открываем ссылку в браузере, вводим пароль и присоединяем сервер к нашему Dropbox-аккаунту.
После чего в консоли видим

Client successfully linked, Welcome Roman!

Ждём пока все файлы перетянутся из Dropbox’a в папку, иначе будут «бока».
Когда всё завершится — останавливаем процесс нажатием CTRL+C

В домашней директории создалась папка ~/Dropbox/ и подтянулись мои файлы.
Поскольку мне это дело в домашней папке не нужно — я переношу саму папку, за которой следит Dropbox-демон в другое место, оставляя только сим-линк (в моём случаи — /var/__dropbox)

mkdir /var/__dropbox
mv ~/Dropbox/* Dropbox/.d* /var/__dropbox/
rm -Rf ~/Dropbox && ln -s /var/__dropbox ~/Dropbox

Теперь установим Dropbox в качестве сервиса.
Для этого создаём файл /etc/init.d/dropbox с таким содержанием:

### BEGIN INIT INFO
# Provides: dropbox
# Required-Start: $local_fs $remote_fs $network $syslog $named
# Required-Stop: $local_fs $remote_fs $network $syslog $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: false
# Short-Description: dropbox service
### END INIT INFO 
#!/bin/sh

start() {
    echo "Starting dropbox..."
    HOME="/root/" start-stop-daemon -b -o -c root -S -u root -x /usr/local/lib/dropbox/dropbox
}
 
stop() {
    echo "Stopping dropbox..."
    start-stop-daemon -o -c root -K -u root -x /usr/local/lib/dropbox/dropbox
}
 
status() {
        dbpid=$(pgrep -u root dropbox)
        if [ -z $dbpid ] ; then
            echo "dropbox not running."
        else
            echo "dropbox running."
        fi
}
 
case "$1" in
  start)
    start
    ;;
 
  stop)
    stop
    ;;
 
  restart|reload|force-reload)
    stop
    start
    ;;
 
  status)
    status
    ;;
 
  *)
    echo "Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}"
    exit 1
 
esac
 
exit 0

Обратите внимание, что я буду запускать Dropbox от пользователя root, поэтому я устанавливаю ему HOME="/root/" перед запуском демона, для того, чтобы демон понимал где лежат настройки.

Устанавливаем скрипту запуска правильные права

chmod +x /etc/init.d/dropbox

Добавляем в автозагрузку

update-rc.d dropbox defaults

И наконец-то запускаем:

/etc/init.d/dropbox start

Опционально. Есть инструмент на Питоне для отображения текущего статуса работы демона (копирование, простой и пр.)
Если интересует — загружаем его и устанавливаем ему права, иначе — переходим дальше.

wget -O /usr/local/lib/dropbox/dropbox.py "https://www.dropbox.com/download?dl=packages/dropbox.py"
chmod 755 /usr/local/lib/dropbox/dropbox.py

Теперь мы можем смотреть чем занимается демон с помощью команды

/usr/local/lib/dropbox/dropbox.py status

Осталось последнее — написать скрипт, что будет копировать файлы в нашу папку прямо в облако.
Для этого мы будем использовать любимый rsync.

#!/bin/sh

HOST=$(hostname)
SOURCE_DIR="/var/__backup"
DROPBOX_DIR="/var/__dropbox"

/usr/bin/rsync -avz --delete $SOURCE_DIR $DROPBOX_DIR/$HOST/$SOURCE_DIR;

Вот. Теперь папка /var/__backup будет в полном объеме уезжать в облако Dropbox’a (в папку /<имя_сервера>, что удобно, когда есть более одного сервера).

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

vi /etc/crontab
0    5    *    *    *    root    /var/__backup/__scripts/backup_to_dropbox.sh > /dev/null 2>&1