개인적으로 호스팅을 Cafe24에서 두 개 받고 있습니다. 하나는 이 블로그가 돌아가는 웹호스팅이고, 다른 하나는 개발 및 이것 저것 좀 돌려보는데 사용하는 가상 서버 호스팅입니다.

둘 다 복구 할 수 없는 데이터들이 담겨있는 서버이기 때문에 백업에 신경을 쓰고 싶은데 이게 쉽지 않았습니다. 로컬 디스크에 받아놓아봤자 디스크가 깨지거나 파일 시스템에 문제가 생기면 아무 소용없을 것입니다. 제대로 백업을 해 두려면 원격으로 해 놓아야 하는데 매번 SSH나 SFTP로 백업을 하려고 접속하는 것도 번거로운 일입니다. 이를 자동화 하려면 24시간 내내 동작하는 컴퓨터가 필요합니다. 물론 제가 회사 서버를 관리하기 때문에 그 장비를 사용 할 수도 있지만 개인적인 용도에 회사 자원을 이용하는 것은 마음이 편하지 않습니다.

그러던 중 현재 사용하고 있는 Dropbox를 이용해서 백업을 하면 어떨까 싶었습니다. Dropbox는 여러 운영체계를 잘 지원하기 때문에 분명히 터미널에서도 사용 가능한 방법이 있을 것이라 생각했습니다. 찾아보니 역시 있더군요. 그래서 현재 Dropbox로 호스팅 2개의 데이터를 백업 중입니다.

그럼 Dropbox로 어떻게 서버 데이터를 백업하는지 적어보도록 하겠습니다.

웹호스팅의 호스트 이름은 webhost(IP:1.1.1.1), 가상 서버의 호스트 이름은 virhost(IP:2.2.2.2) 로 하겠습니다. 그리고 가상 서버의 계정 이름은 foobar 입니다. 설정에서 이런 값이 사용된 부분들은 사용자 환경에 따라 알맞게 수정하셔야 합니다.

우선 웹호스팅의 데이터를 가상서버로 rsync를 통해서 복사 할 수 있게 하겠습니다.

가상 서버의 /etc/xinetd.d/rsyncdisable = yes 값을 no 로 수정합니다. 그리고 /etc/rsyncd.secrets 파일에 rsync용 계정과 비밀번호를 설정합니다. 이 작업을 하기 위해서는 root 권한이 필요합니다.

1
rsyncusername:rsyncpassword

그리고, /etc/rsyncd.conf 파일을 생성합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
max connections = 2
log file = /var/log/rsync.log
timeout = 300

[backup]
comment = shared data stored here
path = /home/foobar/.backup/
read only = false
list = yes
uid = foobar
gid = foobar
auth users = rsyncusername
secrets file = /etc/rsyncd.secrets
hosts allow = 1.1.1.1

uidgid는 알맞게 수정하시고 auth users/etc/rsyncd.secrets 파일의 계정과 일치시키시면 됩니다. hosts allow는 웹호스팅의 IP로 설정하시면 됩니다.

rsync 관련 설정이 끝났으면 xinetd를 재시작 합니다. 물론 웹호스팅 쪽에서 rsyncd로 접근 가능하게 방화벽 설정을 변경해야 합니다.

1
service xinetd restart

그 다음은 웹호스팅의 데이터를 로컬에 tar로 백업하도록 만들었습니다.

1
2
3
4
5
6
7
8
9
#! /bin/sh

BACKUP_HOME=~/backup

cd ${BACKUP_HOME}
rm -f ${BACKUP_HOME}/*.gz
mysqldump bkworm | gzip > backup_www_mysql.sql.gz
tar -czf backup_www_web.tar.gz ~/www
rsync -a ${BACKUP_HOME}/ rsyncusername@virhost::backup

이 스크립트를 backup.sh 라는 이름으로 ~/bin 폴더에 생성한 후에 crontab –e 로 실행하도록 했습니다.

1
11 1 * * *      ~/bin/backup.sh > /dev/null 2>&1

매일 새벽 1시 11분에 DB와 웹 폴더가 웹호스팅 로컬에 백업된 후 rsync를 통해 가상 서버의 ~foobar/.backup 폴더 안으로 복사됩니다.

이제 Dropbox에 ~foobar/.backup 폴더 안의 백업 파일들을 백업하도록 설정합니다. 우선 Dropbox 프로그램을 자신의 운영체제에 맞춰 다운로드 합니다.

다운로드 받은 파일을 ~foobar/.dropbox-dist 폴더에 풀어놓습니다. 그리고 실행을 하면 아래와 같은 메시지가 나옵니다.

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

Dropbox 웹사이트에 로그인한 상태로 링크 주소를 복사해서 웹브라우저에 붙여넣으면 바로 동기화가 활성화 됩니다. Ctrl-C로 Dropbox 프로세스가 종료되지 않으므로 다른 터미널을 하나 열어 실행했던 Dropbox 프로세스를 kill 합니다.

root 권한으로 /etc/sysconfig/dropbox 파일을 다음 내용으로 생성합니다.

1
DROPBOX_USERS="foobar"

그리고 /etc/init.d/dropbox 파일을 생성해서 아래 내용을 복사해 넣습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 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

그 뒤 아래의 명령들을 하나씩 차례대로 실행합니다.

1
2
3
4
5
6
7
/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
chkconfig dropbox on

마지막으로 dropbox를 실행합니다.

1
service dropbox start

이제 ~foobar/Dropbox 안에 들어가는 모든 파일의 생성, 수정, 삭제는 Dropbox에 자동으로 반영됩니다. 아까 ~foobar/.backup 디렉토리 안에 옮겨놓은 백업 파일을 이동시키도록 crontab에 등록합니다.

1
33 3 * * *      mv ~/.backup/*.gz ~/Dropbox

Dropbox를 이용한 백업의 또 다른 장점은 파일 변경 이력을 Dropbox에서 30일 동안 남겨두기 때문에 여러벌의 백업을 유지 할 필요가 없다는 점입니다. 이 점 때문에 무료로 사용 가능한 2G의 용량으로도 꽤 활용도 있게 사용하는 것이 가능합니다.

다만 Dropbox는 외국의 서비스이기 때문에 매일 많은 양을 백업하려고 한다면 호스팅 업체에서 제한이 들어올 가능성도 있습니다.

국내에서 WebDAV 등 리눅스에서 사용 가능한 연동 방식을 제공하는 클라우드 서비스가 등장한다면 한 번 사용해보고 싶습니다.