Резервные копии в облаках, или Dropbox на сервере

Резервные копии в облаках, или бэкап сервера в Dropbox

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

Прежде всего вам необходим аккаунт на Dropbox (Дропбокс), если у вас еще его нет. Если уже есть то переходим к следующему шагу.

Авторизуемся у себя на сервере (например, через Putty). Далее выполняем команды:
cd

Для 32-битных:
wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86"

Для 64-битных:
wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86_64"

Распаковываем архив:
tar -tzf dropbox.tar.gz
tar -xvzf dropbox.tar.gz

Запускаем dropboxd
~/.dropbox-dist/dropboxd

Должно отобразиться подобное уведомление:
This client is not linked to any account... Please visit https://www.dropbox.com/cli_link_nonce?nonce==978ad58ad7c256448abd43cdbb259 to link this machine.

Теперь вам нужно перейти по указанной ссылке в любом браузере для того, чтобы привязать свой сервер к аккаунту Dropbox.

Двигаемся дальше и устанавливаем Dropbox-клиент:
mkdir -p ~/bin
wget -O ~/bin/dropbox.py "http://www.dropbox.com/download?dl=packages/dropbox.py"
chmod 755 ~/bin/dropbox.py
~/bin/dropbox.py start

Если вывелось сообщение о том, что Dropbox запущен, то вы всё установили правильно.

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

И так, создайте файл /etc/init.d/dropbox и вставьте в него (в зависимости от вашей операционной системы) следующий код:


Debian/Ubuntu

В третьей строке скрипта DROPBOX_USERS=user1 user2‘ замените user1 user2 на нужных вам пользователей.

#!/bin/sh
#dropbox service
DROPBOX_USERS="user1 user2"
DAEMON=.dropbox-dist/dropbox
start() {
echo "Starting dropbox..."
for dbuser in $DROPBOX_USERS; do
HOMEDIR=`getent passwd $dbuser | cut -d: -f6`
if [ -x $HOMEDIR/$DAEMON ]; then
HOME="$HOMEDIR" start-stop-daemon -b -o -c $dbuser -S -u $dbuser -x $HOMEDIR/$DAEMON
fi
done
}
stop() {
echo "Stopping dropbox..."
for dbuser in $DROPBOX_USERS; do
HOMEDIR=`getent passwd $dbuser | cut -d: -f6`
if [ -x $HOMEDIR/$DAEMON ]; then
start-stop-daemon -o -c $dbuser -K -u $dbuser -x $HOMEDIR/$DAEMON
fi
done
}
status() {
for dbuser in $DROPBOX_USERS; do
dbpid=`pgrep -u $dbuser dropbox`
if [ -z $dbpid ] ; then
echo "dropboxd for USER $dbuser: not running."
else
echo "dropboxd for USER $dbuser: running (pid $dbpid)"
fi
done
}
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

Теперь сделайте скрип исполняемым и добавьте его в автозапуск:
sudo chmod +x /etc/init.d/dropbox
sudo update-rc.d dropbox defaults

Для Debian вам придется добавить в самом начале загрузчика следующие строки:
### 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


Fedora/Redhat

# chkconfig: 345 85 15
# description: Startup script for dropbox daemon
#
# processname: dropboxd
# pidfile: /var/run/dropbox.pid
# config: /etc/sysconfig/dropbox
#
### BEGIN INIT INFO
# Provides: dropboxd
# Required-Start: $local_fs $network $syslog
# Required-Stop: $local_fs $syslog
# Should-Start: $syslog
# Should-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start up the Dropbox file syncing daemon
# Description: Dropbox is a filesyncing sevice provided by dropbox.com
# This service starts up the dropbox daemon.
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
# To configure, add line with DROPBOX_USERS="user1 user2" to /etc/sysconfig/dropbox
# Probably should use a dropbox group in /etc/groups instead.
[ -f /etc/sysconfig/dropbox ] && . /etc/sysconfig/dropbox
prog=dropboxd
lockfile=${LOCKFILE-/var/lock/subsys/$prog}
config=${CONFIG-/etc/sysconfig/dropbox}
RETVAL=0
start() {
echo -n $"Starting $prog"
if [ -z $DROPBOX_USERS ] ; then
echo -n ": unconfigured: $config"
echo_failure
echo
rm -f ${lockfile} ${pidfile}
RETURN=6
return $RETVAL
fi
for dbuser in $DROPBOX_USERS; do
daemon --user $dbuser /bin/sh -c "~$dbuser/.dropbox-dist/dropboxd&"
done
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
status() {
for dbuser in $DROPBOX_USERS; do
dbpid=`pgrep -u $dbuser dropbox | grep -v grep`
if [ -z $dbpid ] ; then
echo "dropboxd for USER $dbuser: not running."
else
echo "dropboxd for USER $dbuser: running (pid $dbpid)"
fi
done
}
stop() {
echo -n $"Stopping $prog"
for dbuser in $DROPBOX_USERS; do
killproc ~$dbuser/.dropbox-dist/dropbox
done
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
# See how we were called.
case "$1" in
start)
start
;;
status)
status
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $prog {start|status|stop|restart}"
RETVAL=3
esac
exit $RETVAL


Gentoo

В строке скрипта DROPBOX_USERS=”user1 user2 замените user1 user2 на нужных вам пользователей.
#!/sbin/runscript
# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
DROPBOX_USERS="user1 user2"
NICENESS=5
opts="${opts} status"
depend() {
need net
}
start() {
ebegin "Starting dropbox..."
for dbuser in $DROPBOX_USERS; do
start-stop-daemon -b -o -N $NICENESS -c $dbuser -S -v -e HOME="/home/$dbuser" -x /home/$dbuser/.dropbox-dist/dropboxd
done
eend $?
}
stop() {
ebegin "Stopping dropbox..."
for dbuser in $DROPBOX_USERS; do
start-stop-daemon -o -c $dbuser -K -x /home/$dbuser/.dropbox-dist/dropbox
done
eend $?
}
status() {
for dbuser in $DROPBOX_USERS; do
dbpid=`pgrep -u $dbuser dropbox`
if [ -z $dbpid ] ; then
echo "dropbox for USER $dbuser: not running."
else
echo "dropbox for USER $dbuser: running."
fi
done
}

Для Gentoo с использованием openrc и baselayout-2 потребуется немного другой код:
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License, v2 or later
# $Header: /var/cvsroot/gentoo-x86/sys-fs/dropbox/files/dropbox.init-1.0,v 1.4 2007/04/04 13:35:25 cardoe Exp $
DROPBOX_USERS="will"
NICENESS=5
depend() {
need localmount net
after bootmisc
}
start() {
ebegin "Starting dropbox..."
for dbuser in $DROPBOX_USERS; do
start-stop-daemon -S -b -m --pidfile /var/run/dropbox-$dbuser.pid -o -N $NICENESS -c $dbuser -v -e HOME="/home/$dbuser" -x /home/$dbuser/.dropbox-dist/dropboxd
done
eend $?
}
stop() {
ebegin "Stopping dropbox..."
for dbuser in $DROPBOX_USERS; do
start-stop-daemon --stop --pidfile /var/run/dropbox-$dbuser.pid
done
eend $?
}
status() {
for dbuser in $DROPBOX_USERS; do
if [ -e /var/run/dropbox-$dbuser.pid ] ; then
echo "dropboxd for USER $dbuser: running."
else
echo "dropboxd for USER $dbuser: not running."
fi
done
eend $?
}


OpenSuse

# chkconfig: 35 85 15
# description: Startup script for dropbox daemon
#
# processname: dropboxd
# config: /etc/dropbox/dropbox.conf
#
### BEGIN INIT INFO
# Provides: dropboxd
# Required-Start: $local_fs $network $syslog
# Required-Stop: $local_fs $syslog
# Should-Start: $syslog
# Should-Stop: $network $syslog
# Default-Start: 3 5
# Default-Stop: 0 1 6
# Short-Description: Start up the Dropbox file syncing daemon
# Description: Dropbox is a filesyncing sevice provided by dropbox.com
# This service starts up the dropbox daemon.
### END INIT INFO
# Shell functions sourced from /etc/rc.status:
# rc_check check and set local and overall rc status
# rc_status check and set local and overall rc status
# rc_status -v ditto but be verbose in local rc status
# rc_status -v -r ditto and clear the local rc status
# rc_failed set local and overall rc status to failed
# rc_failed set local and overall rc status to
# rc_reset clear local rc status (overall remains)
# rc_exit exit appropriate to overall rc status
. /etc/rc.status
# First reset status of this service
rc_reset
# Return values acc. to LSB for all commands but status:
# 0 - success
# 1 - generic or unspecified error
# 2 - invalid or excess argument(s)
# 3 - unimplemented feature (e.g. "reload")
# 4 - insufficient privilege
# 5 - program is not installed
# 6 - program is not configured
# 7 - program is not running
#
# To configure, add line with DROPBOX_USERS="user1 user2" to /etc/dropbox/dropbox.conf
# Probably should use a dropbox group in /etc/groups instead.
prog=dropboxd
config=${CONFIG-/etc/dropbox/dropbox.conf}
test -f $config && . $config
start() {
echo $"Starting $prog: "
if [ -z $DROPBOX_USERS ] ; then
rc_failed 6
echo -n "unconfigured: $config"
rc_status -v
exit
fi
for dbuser in $DROPBOX_USERS; do
DAEMON="/home/$dbuser/.dropbox-dist/$prog"
HOME="/home/$dbuser"
test -x $DAEMON || exit 5
echo "... starting DropBox for user: $dbuser"
/sbin/startproc -u $dbuser $DAEMON
if [ -z `pgrep -u $dbuser dropbox` ]; then
rc_failed 7
fi
rc_status -v
done
}
status() {
echo "Checking for service DropBox: "
for dbuser in $DROPBOX_USERS; do
dbpid=`pgrep -u $dbuser dropbox | grep -v grep`
if [ -z $dbpid ] ; then
echo -n "... dropboxd for USER $dbuser: not running."
else
echo -n ".. dropboxd for USER $dbuser: running (pid $dbpid)"
fi
done
rc_status -v
}
stop() {
echo $"Stopping $prog: "
for dbuser in $DROPBOX_USERS; do
echo -n " ... for USER: $dbuser"
HOME="/home/$dbuser"
DAEMON="/home/$dbuser/.dropbox-dist/dropbox"
killproc $DAEMON
done
rc_status -v
}
# See how we were called.
case "$1" in
start)
start
;;
status)
status
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $prog {start|status|stop|restart}"
exit 1
esac
rc_exit


CentOS

Останавливаем dropbox.py:

~/bin/dropbox.py stop

Теперь выполняем команды:
Создаём файл dropbox: touch /etc/init.d/dropbox
Выставляем на него права 755: chmod 755 /etc/init.d/dropbox
Открываем файл: vi /etc/init.d/dropbox

Нажмите английскую i чтобы начать редактирование файла. Затем вставьте нижеследующее в том виде в каком он есть:

# chkconfig: 345 85 15
# description: Startup script for dropbox daemon
#
# processname: dropboxd
# pidfile: /var/run/dropbox.pid
# config: /etc/sysconfig/dropbox
#
### BEGIN INIT INFO
# Provides: dropboxd
# Required-Start: $local_fs $network $syslog
# Required-Stop: $local_fs $syslog
# Should-Start: $syslog
# Should-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start up the Dropbox file syncing daemon
# Description: Dropbox is a filesyncing sevice provided by dropbox.com
# This service starts up the dropbox daemon.
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
# To configure, add line with DROPBOX_USERS="user1 user2" to /etc/sysconfig/dropbox
# Probably should use a dropbox group in /etc/groups instead.
[ -f /etc/sysconfig/dropbox ] && . /etc/sysconfig/dropbox
prog=dropboxd
lockfile=${LOCKFILE-/var/lock/subsys/$prog}
config=${CONFIG-/etc/sysconfig/dropbox}
RETVAL=0
start() {
echo -n $"Starting $prog"
if [ -z $DROPBOX_USERS ] ; then
echo -n ": unconfigured: $config"
echo_failure
echo
rm -f ${lockfile} ${pidfile}
RETURN=6
return $RETVAL
fi
for dbuser in $DROPBOX_USERS; do
dbuser_home=`cat /etc/passwd | grep "^$dbuser:" | cut -d":" -f6`
daemon --user $dbuser /bin/sh -c "$dbuser_home/.dropbox-dist/dropboxd&"
done
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
status() {
for dbuser in $DROPBOX_USERS; do
dbpid=`pgrep -u $dbuser dropbox | grep -v grep`
if [ -z $dbpid ] ; then
echo "dropboxd for USER $dbuser: not running."
else
echo "dropboxd for USER $dbuser: running (pid $dbpid)"
fi
done
}
stop() {
echo -n $"Stopping $prog"
for dbuser in $DROPBOX_USERS; do
dbuser_home=`cat /etc/passwd | grep "^$dbuser:" | cut -d":" -f6`
killproc $dbuser_home/.dropbox-dist/dropbox
done
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
# See how we were called.
case "$1" in
start)
start
;;
status)
status
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $prog {start|status|stop|restart}"
RETVAL=3
esac
exit $RETVAL

Сохраните внесённые изменения, нажав Esc. Затем введите :wq и нажмите Enter для выхода из режима редактирования файла.

Теперь выполните команду чтобы внести изменения в файл:
vi /etc/sysconfig/dropbox

Нажмите английскую i чтобы начать редактирование файла. Затем вставьте нижеследующее. Однако вместо “имя_пользователя(ей)” вставьте имя пользователя, с помощью которого вы устанавливали Dropbox на сервер (например “root”).
DROPBOX_USERS="имя_пользователя(ей)"

Сохраните внесённые изменения, нажав Esc. Затем введите :wq и нажмите Enter для выхода из режима редактирования файла.

Затем выполните сразу две команды:
service dropbox start && chkconfig dropbox on


Для некоторых ОС придется еще немного доработать для полнофункциональной работы Dropbox.


Fedora/Redhat

Создайте файл /etc/sysconfig/dropbox и добавьте туда только одну строчку с пользователями которые вам нужны:
cat /etc/sysconfig/dropbox DROPBOX_USERS="user1 user2"

Устанавливаем права:
/bin/chmod 0755 /etc/init.d/dropbox
/bin/chmod 0644 /etc/sysconfig/dropbox
/bin/ls -l /etc/init.d/dropbox /etc/sysconfig/dropbox
/usr/bin/chcon -u system_u -t initrc_exec_t /etc/init.d/dropbox
/usr/bin/chcon -u system_u -t etc_t /etc/sysconfig/dropbox
/bin/ls -lZ /etc/init.d/dropbox /etc/sysconfig/dropbox

Запускаем Dropbox:
chkconfig dropbox on

Проверяем:
chkconfig --list | egrep '3:on|5:on' | less

В операционной системе Fedora 15, а так же других системах использующих systemd, добавьте первой строчкой в init.d:
#!/bin/sh

Gentoo

Выполните команду:
rc-update add dropbox default


А теперь очень интересный и важный момент. Дело в том, что после всех настроек у вас будут синхронизироваться не только файлы (резервные копии) на сервере, но так же и абсолютно все файлы находящиеся у вас в Dropbox! То есть, к вам на сервер начнут выгружаться все ваши файлы которые вы положили в любую папку в Dropbox у себя на компьютере/планшетнике/смартфоне.

Ни в коем случае не удаляйте папки на сервере! Если вы их удалите, то потеряете их физически – они удалятся и с вашего компьютера!

Что же делать в данной ситуации? Потребуется добавить «ненужные» папки в исключения следующей командой:
~/bin/dropbox.py exclude add ~/Dropbox/Exclude
Вместо Exclude напишите название своей папки. У меня, к примеру, были только две не нужные мне на сервере папки, это Public и Camera Uploads. Еще один интересный момент – если вы выполните команду:
~/bin/dropbox.py exclude add ~/Dropbox/Camera Uploads
То так вы исключите папку Camera, а не Camera Uploads. Это из-за пробела. Эта папка создается автоматом если вы включаете в Dropbox автоматическую выгрузку изображений и видео со смартфона/планшетника. Поэтому ее лучше не переименовывать. А для того, чтобы исключить из синхронизации на сервере папку Camera Uploads, нужно выполнить такую команду (просто добавляем обратный слеш перед пробелом):
~/bin/dropbox.py exclude add ~/Dropbox/Camera\ Uploads

Теперь, при создании задания на резервное копирование нужных нам файлов, нам необходимо указать в какую папку Dropbox будут ложиться резервные копии:
/root/Dropbox/ВашаПапка

Теперь, если резервные копии файлов (сайта, изображений, базы данных и прочее) у вас создаются каждую ночь, то на каждое утро вы будите видеть все эти файлы у себя на компьютере в папке Dropbox/ВашаПапка.