목차

라즈베리 파이에서 BitTorrentSync로 데이터 동기화하기

시작하기

 Bittorrent Image 음악, 영화, 그리고 (그보다는 작지만) 수많은 문서들 … 대용량의 데이터를 다루기 시작하면서 하드디스크의 용량도 많이 늘어났습니다. 이제는 용량도 중요하지만, 언제 어디서든 안심하고 데이터를 저장해두고 접근할 수 있기를 원합니다. 이에 맞춰 스토리지 시장도 발빠르게 움직이고 있구요.

드롭박스와 같은 클라우드 서비스가 각광을 받고 있습니다. 스마트폰의 폭발적인 보급에 따라 점점 대중화되고 있는 서비스 중 하나입니다. 언제 어디서든 내 파일에 접근할 수 있다는 점, 내가 사용하는 모든 장치에 똑같이 동기화된다는 점은 정말 매력적입니다. 그런데 이 업체들도 자선사업을 하는 건 아니죠. 얼마까지는 무료이지만, 일정 이상의 용량이 필요하면 정해진 요금을 내고 저장공간을 임대해서 사용해야 합니다.

한편 NAS 같은 장비들도 가정용으로 많이 보급이 되는 추세이고, 특히 라즈베리 파이 같은 저전력, 저가의 임베디드 디바이스들 또한 점차 알려지고 있습니다. 이런 장비를 사용해 개인 서버, 저장소 등등 다양하게 응용하시는 분들이 점점 많아지고 있습니다. 저도 얼마 전에 라즈베리 파이를 한 대 장만하여 집에 두고 저전력 서버로 사용하고 있습니다. USB로 집에 있는 노트북 하드디스크를 연결해 라즈베리 파이의 적은 저장공간(SDCARD)의 약점을 극복 중이죠. 물론 이런 싸구려(?) 장비는 전문 NAS 솔루션이 자랑하는 안정성과 성능에 따라올 수 없습니다. 일단 웹서버로 쓰긴 하지만 참 느립니다. 개인적으로 쓸만하지, 익명의 대중을 대상으로 공개할 만한 서버는 아닙니다. 그렇지만 이 가격에 이러한 설비를 갖출 수 있다는 점에서 모든 단점은 용서됩니다.

하지만 지나칠 수 없는 한 가지 심각한 문제가 있습니다. 바로 데이터의 안정성입니다. 라즈베리 파이 서버는 NAS 수준의, 아니 그 절반 만큼도 보장할 수 없습니다. NAS야 원래 데이터를 안정적으로 보관하려는 목적으로 전문 업체에서 심혈을 기울여 만든 솔루션입니다. 그 업체가 보증하고 파는 물건이니 믿고 구매해 안심하고 사용할 수 있지만, 이 놈의 라즈베리 파이는 그렇지 못합니다. 언제 SD 카드의 수명이 다할 지 모르고, 노트북 하드 디스크 달랑 하나에 의지해 데이터를 저장합니다. 웹서버에 중요한 데이터를 보관하려고 사용하는 건데, 솔직히 제 역할을 정말 다해 줄지 의문스럽습니다.

현재 저도 드롭박스 서비스를 이용 중이지만, 솔직히 이 웹서버의 백업을 위해 금액을 지불하면서 드롭박스를 사용하고 싶지는 않습니다. 물론 스카이드라이브 등등의 다른 클라우드 서비스를 이용하면 되겠지만, 그럼 왠지 클라우드 서비스로 범벅이 될 것 같네요. 최근에는 그런 여러 클라우드 서비스를 한 데 묶어 통합 관리해주는 서비스 또한 나왔지만, 그마저도 유료입니다.

저는 2~3대의 PC를 보유하고 있고 자주 사용합니다. 최신의 하드웨어는 아니지만, 각자 하드디스크의 용량은 최소 80GB가 넘습니다. 나쁜 말로 집이 한꺼번에 홀랑 타버리지 않는 이상, 각 하드디스크에 복사본을 만들어 놓기만 해도 2중 3중의 백업이 만들어지는 셈입니다. NAS 수준의 안정성과 효율성은 아니지만, 그래도 꽤 괜찮은 수준의 데이터 백업 및 동기화를 꾸려 나갈 수가 있을 겁니다.

문제는 각 장치끼리 그렇게 스마트하게 해 줄 소프트웨어가 없었던 거지요. 그런데 BitTorrent 기술을 응용해 개인이 소유한 장치끼리 공유/동기화를 시도하는 실험적인 프로젝트가 있더군요. 바로 이번에 소개할 'BitTorentSync'입니다. 개인적으로 불법 자료 공유로 항상 천덕꾸러기 신세를 받던 BitTorrent 기술이 절묘하게 응용된 사례라고 절찬하고 있습니다. :-)

BitTorrent 소개

 앞서 언급했든, 요즘 이슈가 되고 있는 저작권을 위반한 매체들의 불법 공유의 온상으로 이 토렌트 기술이 지적받고 있습니다. 그 덕에 토렌트는 범죄의 온상이라는 오해를 받아 천덕꾸러기 신세를 면치 못하고 있습니다. 그렇지만 공유를 하는 행위의 문제이지, 기술 자체는 그냥 기술일 뿐입니다.

비트토렌트는 파일을 서로 공유하기 위한 프로토콜입니다. 미국 버팔로 대학 출신의 ' 브람 코헨(Bram Cohen)'이라는 사람이 만들었습니다. 비트토렌트에 관한 보다 자세한 설명은 한국어 위키피디아를 참고하시면 됩니다. 본 문서를 읽으시는 여러분들도 적어도 한 번은 토렌트를 이용해 보았고, 토렌트를 어떻게 사용하는지 이해하고 있을 것입니다.

보통 토렌트로 어떤 파일을 받으려면 '.torrent' 파일을 획득해야 합니다. 이 파일은 단순한 'Bencode' 파일이며 이 파일 자체가 구하려는 파일은 아닙니다. '.torrent' 파일을 통해 원하는 파일을 얻으려면 토렌트 클라이언트 프로그램이 필요합니다. uTorrent, BitTorrent, Vuze 등등 여러 종류의 토렌트 클라이언트 프로그램들이 있습니다. 이 클라이언트 프로그램이 '.torrent' 파일을 읽으면 전 세계에 있는 컴퓨터(피어, peer)로부터 찾는 파일을 다운로드 받습니다. 이렇게 내 컴퓨터에 저장이 완료되면 이제부터는 내 피씨도 '시더(seeder, 공유하는 파일을 온전히 가지고 있는 노드를 일컫습니다)'가 되어 전 세계 곳곳에 내가 파일을 받았던 것처럼 다른 누군가에게 다운로드 받은 파일을 공유해줍니다.

BitTorrentSync

BitTorrentSync는 BitTorrentLabs에서 주도하는 비트토렌트 프로토콜을 이용한 다양한 실험 프로젝트 중 하나입니다. 비트토렌트를 이용해 대중이 대중에게 제한없이 파일 공유를 하는 것이 아니라 마치 드롭박스 같은 클라우드 서비스와 같이 나만의 데이터를 내가 가진 장비끼리만 공유하게 하는 것입니다. 아직 더 개발되어야 할 점들은 있지만 저처럼 단순하게 데이터 스냅샷을 여러 장비로 분산시키고 싶을 때 적합합니다.

소개에 따르면 비트토렌트 기술의 특성상 파일의 크기가 클수록 오히려 공유에 유리하며 P2P 방식이기 때문에 온라인인 장치가 많으면 많을 수록 다운로드 속도도 빨라진다고 합니다. 그러므로 어떤 조직에서 대용량의 파일을 효율적으로 배포하기에 이상적입니다. P2P 방식이므로 누구 하나만 온라인이어도 파일을 받을 수 있고, 파일을 보내고 받기 전 파일 요청 및 전송 준비 같은 번거로운 작업도 필요 없이 바로 BitTorrentSync 프로그램을 동작시키면 됩니다.

그 외에 BitTorrentLabs에는 몇몇 실험적인 프로젝트를 진행 중에 있습니다.

BitTorrentSync로 라즈베리 파이 웹서버 동기화

서론이 길었습니다. BitTorrentSync를 이용하여 각 PC끼리 데이터를 동기화하는 작업을 해 보도록 하겠습니다. 라즈베리 파이에 있는 중요한 자료인 저의 개인 위키 데이터를 공유 대상으로 합니다. 문서에서 '클라이언트'는 주로 작업을 하는 데스크탑 PC이고, '서버'는 라즈베리 파이를 지칭합니다.

클라이언트에서 일단 파일을 다운로드 받습니다. 홈페이지에서 'Linux Arm' 용을 다운로드 받습니다. 이 파일을 서버로 파일을 복사합니다.

$ scp btsync_arm.tar.gz <username>@<server_host>:/home/<destination>

물론 서버에서 바로 파일을 받을 수 있습니다.

$ wget -O btsync_arm.tar.gz http://btsync.s3-website-us-east-1.amazonaws.com/btsync_arm.tar.gz

서버에 접속하고 압축을 풀어냅니다.

$ ssh <username>@<server_host>
$ cd ~/<where_btsync_tar_is>
$ mkdir btsync
$ tar xzvf btsync_arm.tar.gz -C ./btsync

btsync는 시스템에서 쓸 생각이므로, 이를 /usr/local/bin으로 옮기도록 하겠습니다.

sudo cp btsync/btsync /usr/local/bin

샘플 설정 파일을 덤프해서 파일로 만듭니다. 이 파일은 JSON인데, C/C++ 스타일의 주석이 허용됩니다.

$ btsync --dump-sample-config > ~/btsync.conf

다음은 위 명령을 바로 실행했을 때 나온 기본값 그대로인 설정 파일입니다.

{ 
  "device_name": "My Sync Device",
  "listening_port" : 0,                       // 0 - randomize port
  
/* storage_path dir contains auxilliary app files
   if no storage_path field: .sync dir created in the directory 
   where binary is located.
   otherwise user-defined directory will be used 
*/
  "storage_path" : "/home/user/.sync",

// uncomment next line if you want to set location of pid file
// "pid_file" : "/var/run/btsync/btsync.pid",

  "check_for_updates" : true, 
  "use_upnp" : true,                              // use UPnP for port mapping


/* limits in kB/s
   0 - no limit
*/
  "download_limit" : 0,                       
  "upload_limit" : 0, 

/* remove "listen" field to disable WebUI
   remove "login" and "password" fields to disable credentials check
*/
  "webui" :
  {
    "listen" : "0.0.0.0:8888",
    "login" : "admin",
    "password" : "password"
  }

/* !!! if you set shared folders in config file WebUI will be DISABLED !!!
   shared directories specified in config file
   override the folders previously added from WebUI.
*/
/*
  ,
  "shared_folders" :
  [
    {
//  use --generate-secret in command line to create new secret
      "secret" : "MY_SECRET_1",                   // * required field
      "dir" : "/home/user/bittorrent/sync_test", // * required field

//  use relay server when direct connection fails
      "use_relay_server" : true,
      "use_tracker" : true, 
      "use_dht" : false,
      "search_lan" : true,
//  enable sync trash to store files deleted on remote devices
      "use_sync_trash" : true,
//  specify hosts to attempt connection without additional search     
      "known_hosts" :
      [
        "192.168.1.2:44444"
      ]
    }
  ]
*/

// Advanced preferences can be added to config file.
// Info is available in BitTorrent Sync User Guide.

}

설정 파일 속성값 설명

변수 값 타입 설명
device_name string 외부에서 보일 장치 이름.
listening_port integer 접속 포트. 0을 입력할 경우 난수화시킴.
storage_path string bitsync 프로그램이 관리하는 파일들이 저장되는 장소입니다. 우리가 공유하고자 하는 파일과는 관계없습니다. 지정하지 않으면 btsync 실행 파일이 있는 곳에 .sync라는 디렉토리를 만들어 보관합니다.
pid_file string PID를 기록하는 파일의 경로를 적습니다. init 스크립트 만들 때 필요합니다.
check_for_updates boolean 업데이트 체크를 수행할지 여부를 결정합니다.
use_upnp boolean NAT UPnP를 사용할지 결정합니다. 특별한 일이 없다면 사용합니다.
download_limit integer 다운로드 속도 한도 (kB/s). 0이면 제한하지 않습니다.
upload_limit integer 업로드 속도 한도 (kB/s). 0이면 제한하지 않습니다.
webui pairs WebUI를 위한 속성들입니다. 아래 3개의 하위 속성이 있습니다.
webui / listen string WebUI를 위한 주소입니다. 기본으로 “0.0.0.0:8888”입니다. 8888포트에서 어디서든 연결을 수락한다는 뜻입니다.
webui / login string WebUI 접속을 위한 아이디입니다.
webui / password string WebUI 접속을 위한 패스워드입니다.
shared_folders list 기본값은 이 항목이 주석화되어 있습니다. 이 항목을 사용하면 WebUI가 비활성화됩니다. 아래 하위 요소를 가집니다.
shared_folders / secret string 공유를 위해 가지는 비밀번호입니다. 이것이 있어 비트토렌트를 이용해 공유를 하더라도 다른 비트토렌트 클라이언트들은 공유하고자 하는 파일에 접근할 수 없는 것입니다. 공유하고자 하는 사람끼리만 서로 알고 있어야 합니다. 필수적으로 입력해야 합니다.
shared_folders / dir string 공유 파일이 저장되는 경로를 적습니다. 필수적으로 입력해야 합니다.
shared_folders / use_relay_server boolean 'true'면 직접 연결 실패시, 릴레이 서버를 사용합니다.
shared_folders / use_tracker boolean 'true'면 트래커를 사용합니다.
shared_folders / use_dht boolean 'true'면 DHT(분산해시테이블)를 사용합니다.
shared_folders / search_lan boolean 'true'면 로컬 네트워크도 검색합니다.
shared_folders / use_sync_trash boolean 'true'면 원격지 파일 삭제시 바로 지워지는 것이 아니라 trash 디렉토리로 옮기는 역할을 합니다.
shared_folders / known_hosts list string값의 list입니다. 이 곳에 확실히 sync 서비스가 운영되고 있다고 생각합니다.
아래 항목은 user guide에 소개된 advanced preference 항목들입니다.
disk_low_priority boolean 기본값: true, 디스크 IO의 우선순위를 낮춥니다. false를 쓰면 읽기 쓰기가 빨라지지만, 하드디스크의 수명을 위해 true를 쓰는 것이 좋겠습니다.
lan_encrypt_data boolean 기본값: true, 로컬 네트워크에서도 암호화를 사용할 지 결정합니다. 그냥 true를 해도 무방합니다.
lan_use_tcp boolean 기본값: false, 로컬 네트워크에서도 TCP를 사용할지 결정합니다.
rate_limit_local_peers boolean 기본값: false, 로컬 네트워크에서도 업/다운 속도를 통제할지 결정합니다. 로컬 네트워크에서는 굳이 제한할 필요가 없겠죠

설정값 만들기

윈도우용 프로그램은 데스크탑용 GUI 프로그램이 따로 있어 매우 편리합니다. 그러나 리눅스용은 GUI가 없고, 라즈베리 파이는 서버용으로 사용중이라 일절 GUI 요소가 없습니다. 그래도 다행이죠. WebUI가 있는 게 어딥니까… 설정값은 두 가지 스타일로 만들어 보겠습니다. 첫번째는 서버를 위한 non-WebUI, 두번째는 데스크탑을 위한 WebUI 스타일입니다. 물론 서버도 WebUI를 사용해도 됩니다. 그러나 라즈베리 파이의 성능 상 왠만하면 서버의 개수를 줄여주는 것이 좋지 않을까 생각도 들고, 여러 옵션으로도 작업해 두는 것이 문서 작성에 도움이 될 것 같습니다. 성능이 넉넉한 NAS라면 편하게 WebUI 스타일로 설정 파일을 만들어 쓰세요.

JSON에 주석을 덕지덕지 달아서 상당히 보기 좋지 않습니다. 옵션만 깔끔하게 정리하도록 하지요.

Non-WebUI

WebUI를 사용하지 않는 설정입니다.

nonwebui.conf
{ 
  "device_name"       : "pi-0",
  "listening_port"    : 65501,  
  "storage_path"      : "/home/btsync/.btsync",
  "pid_file"          : "/home/btsync/btsync.pid",
  "check_for_updates" : true, 
  "use_upnp"          : true, 
  "download_limit"    : 0,                       
  "upload_limit"      : 0, 
 
  "shared_folders" :
  [
    {
        "secret"           : "",
        "dir"              : "",
        "use_relay_server" : true,
        "use_tracker"      : true, 
        "use_dht"          : false,
        "search_lan"       : true,
        "use_sync_trash"   : true,
        "known_hosts"      :
        [
            "192.168.0.2:65501"
        ]
    }
  ],
 
  "disk_low_priority"      : true,
  "lan_encrypt_data"       : true,
  "lan_use_tcp"            : false,
  "rate_limit_local_peers" : false
}

굳이 포트를 난수화할 필요를 느끼지 못해서, 비트토렌트 싱크 서비스는 서버/클라이언트를 막론하고 65501번에서만 작동하도록 고쳤습니다. 이렇게 하면 서버와 클라이언트 모두 설정에서 known_hosts에 항목을 적어줄 수 있겠지요.

공유 폴더를 늘이고 싶다면 shared_folders에 항목을 추가하면 됩니다. 아래는 shared_folders에 2개의 항목을 공유하고 있을 때의 예입니다.

  "shared_folders" :
  [
    {
        "secret"           : "ijsofhHAW09u3#sdf",
        "dir"              : "/home/btsync/share_01",
        "use_relay_server" : true,
        "use_tracker"      : true, 
        "use_dht"          : false,
        "search_lan"       : true,
        "use_sync_trash"   : true,
        "known_hosts"      :
        [
            "192.168.0.2:65501"
        ]
    },
    
    {
        "secret"           : "asdjhewr#kjcw32f",
        "dir"              : "/home/btsync/share_02",
        "use_relay_server" : true,
        "use_tracker"      : true, 
        "use_dht"          : false,
        "search_lan"       : true,
        "use_sync_trash"   : true,
        "known_hosts"      :
        [
            "192.168.0.2:65501",
            "192.168.0.100:65501"
        ]
    } // 목록의 끝에는 ','가 있어서는 안 됩니다.
  ]

아시겠죠? 주의하세요. 목록의 끝에는 ','가 있어서는 안 됩니다.

WebUI

다음은 웹을 이용했을 때의 설정입니다. WebUI쪽이 훨씬 간결합니다.

webui.conf
{ 
  "device_name"       : "pi-0",
  "listening_port"    : 65501,  
  "storage_path"      : "/home/btsync/.btsync",
  "pid_file"          : "/home/btsync/btsync.pid",
  "check_for_updates" : true, 
  "use_upnp"          : true, 
  "download_limit"    : 0,                       
  "upload_limit"      : 0, 
 
  "webui" :
  {
    "listen"   : "0.0.0.0:8888",
    "login"    : "admin",
    "password" : "password"
  },
 
  "disk_low_priority"      : true,
  "lan_encrypt_data"       : true,
  "lan_use_tcp"            : false,
  "rate_limit_local_peers" : false
}

initscript 제작

서버에 btsync라는 사용자를 만들어 이 btsync의 권한으로 프로그램을 동작시키고, 또 btsync의 홈 디렉토리에 데이터를 저장하도록 하겠습니다. 그러면 우선 사용자를 하나 만들어야겠지요.

$ sudo -s   # root 계정으로 갑니다.
# useradd -m -N -G nogroup -s /bin/bash btsync
# passwd -l btsync

설정에서 /home/btsync/.btsync라는 숨겨진 디렉토리를 만드므로,

# mkdir /home/btsync/.btsync
# chown -R btsync:users /home/btsync

이제 initscript를 만들겠습니다. 다음 파일을 /etc/init.d/btsync로 저장합니다.

btsync
### BEGIN INIT INFO
# Provides:          btsync
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Manage BitTorrentSync daemon
# Description:       http://labs.bittorrent.com/experiments/sync.html
### END INIT INFO
 
DAEMON=/usr/local/bin/btsync
DAEMON_OPTS="--config /usr/local/etc/btsync/nonwebui.conf"
DAEMON_CONF="/home/btsync/.btsync"
DAEMON_USER=btsync
PIDFILE=/home/btsync/btsync.pid
NAME=btsync
DESC=btsync
 
test -x $DAEMON || exit 0
 
case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --chuid $DAEMON_USER --user $DAEMON_USER --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --user $DAEMON_USER --pidfile $PIDFILE --exec $DAEMON
        echo "$NAME."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
		rm -fr $DAEMON_CONF
        start-stop-daemon --stop --exec $DAEMON
        sleep 2
        start-stop-daemon --start --chuid $DAEMON_USER --user $DAEMON_USER --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  #reload)
  #    echo -n "Reloading $DESC configuration: "
  #    start-stop-daemon --stop --signal HUP --quiet --user $USER --exec $DAEMON
  #    echo "$NAME."
  #    ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload}" >&2
        exit 1
        ;;
esac
 
exit 0

그리고 이 파일은 루트 권한으로 만듭니다.

$ sudo chown root:root /etc/init.d/btsync
$ sudo chmod 755 /etc/init.d/btsync

업데이트 스크립트 제작

btsync가 자주 업데이트되므로 업테이트 될 때 마다 쉽게 업데이트하도록 스크립트를 만듭니다.

update_btsync
#!/bin/bash
if [ `whoami` != "root" ]; then
        echo "Superuser acceess required!"
        exit 1
fi
 
echo "Beginning update..."
mkdir ./btsync_update_tmp
wget -O - http://btsync.s3-website-us-east-1.amazonaws.com/btsync_arm.tar.gz | tar xz -C ./btsync_update_tmp
cp btsync_update_tmp/btsync /usr/local/bin
rm -fr btsync_update_tmp
 
echo "Update complete!"

동작 테스트

서버측과 클라이언트 측 모두 간단하게 WebUI를 통해 동작을 확인해 보도록 하겠습니다.

서버

설정 파일을 서버의 /usr/local/etc/btsync에 복사합니다. 그리고 이 설정 파일은 루트만 편집할 수 있도록 합니다.

$ sudo mkdir /usr/local/etc/btsync
$ sudo cp webui.conf nonwebui.conf /etc/btsync
$ sudo chown root:root -R /usr/local/etc/btsync
$ sudo chmod 644 /usr/local/etc/btsync/*
$ ls /usr/local/etc/btsync
nonwebui.conf  webui.conf

그다음 싱크 데몬을 동작시켜 봅니다.

$ sudo service btsync start # btsync를 동작시킵니다.
Starting btsync: BitTorrent Sync forked to background. pid = 11408
btsync.
$  ps -ef | grep btsync # btsync가 동작중인지, btsync 권한으로 동작하는지 확인합니다.
btsync   11408     1  1 06:34 ?        00:00:00 /usr/local/bin/btsync --config /usr/local/etc/btsyncwebui.conf
$ sudo service btsync stop # btsync를 멈춥니다.
Stopping btsync: btsync.
$ ps -ef | grep btsync # stop 이후 약간 휴지를 둔 후 이 명령을 입력하세요. btsync가 멈춰있어야 합니다.

클라이언트의 웹브라우저로 접속해봅니다.

사용자 'btsync'의 홈 디렉토리 전부를 공유 디렉토리로 사용하는 것은 별로 좋은 생각이 아닌 것 같습니다. /home/btsync/sync라는 디렉토리를 만들고, 일단 클라이언트와의 테스트를 위해 sync 디렉토리에 'test'라는 디렉토리 또한 만들어 주세요. 디렉토리는 btsync의 소유이고, 쓰기 및 접근 권한이 있어야 합니다.

$ sudo su btsync -c "mkdir -p /home/btsync/sync/test"
$ ls -l /home/btsync /home/btsync/sync
/home/btsync:
total 8
-rw-r--r-- 1 btsync users    6 Jul 17 06:39 btsync.pid
drwxr-xr-x 3 btsync users 4096 Jul 17 07:41 sync
/home/btsync/sync:
total 4
drwxr-xr-x 2 btsync users 4096 Jul 17 07:41 test

클라이언트

클라이언트가 윈도우라면 GUI를 제공할 것입니다. 편하게 그것을 사용하세요. 그런데 리눅스는 WebUI 말고는 답이 없습니다. 저는 리눅스 데스크탑을 이용하므로 클라이언트도 WebUI를 이용하겠습니다. 같은 WebUI이므로 서버에서 했던 세팅과 크게 달라질 것이 없습니다.

서버와 클라이언트간에 btsync 공유

일일이 스크린샷을 넣는 일은 지양하는 편입니다. 텍스트만 보고서도 별 어려움 없이 따라하실 수 있으리라 생각합니다. 서버와 클라이언트 사이의 BitTorrentSync가 올바로 공유를 하는지 간단하게 테스트를 해 보도록 하겠습니다.

다음은 서버 쪽의 절차입니다.

  1. 서버 WebUI에 접속합니다. 관리자 아이디와 패스워드를 설정했으면 입력해줍니다.
  2. 'Add Folder' 버튼을 눌러줍니다. 'Add folder' 창이 나옵니다.
  3. 'Generate' 버튼을 눌러 암호 하나를 무작위로 만듭니다. 이것을 복사해 일단 어딘가에 적어둡니다.
  4. 'Path'는 /home/btsync/sync/test입니다.
  5. 'Add' 버튼을 누르면 서버 측의 세팅은 끝납니다.

다음은 클라이언트 쪽의 절차입니다.

  1. 클라이언트 또한 WebUI에 접속합니다. 마찬가지로 관리자 아이디와 패스워드를 설정했으면 입력해줍니다.
  2. 'Add Folder' 버튼을 눌러줍니다. 'Add folder' 창이 나옵니다.
  3. 서버가 생성한 암호를 이 곳에 붙여넣습니다.
  4. Path로 홈 디렉토리에 적절한 경로를 하나 만들어 주세요.
  5. 'Add' 버튼을 누르면 클라이언트 측의 세팅 또한 완료됩니다.

설정이 모두 올바르다면 각자의 WebUI에서 상대의 device_name이 나타날 것입니다. 그러면 아무 파일이나 적당히 만들어서 파일이 동기화되는지 확인해 보겠습니다. 클라이언트측의 공유 디렉토리에서 다음을 실행해보죠.

$ echo 'Hello, Server!' > hello.txt  # 클라이언트입니다.
$ cat hello.txt
Hello, Server!

서버에서 이 파일이 생성되었는지 확인해볼까요?

$ cd /home/btsync/sync/test  # 서버입니다.
$ ls
hello.txt
$ cat hello.txt
Hello, Server!
$ sudo su btsync -c 'echo Hello, Client! >> hello.txt'
$ cat hello.txt
Hello, Server!
Hello, Client!

서버에서 파일이 변경되었으니, 클라이언트도 같이 변경되었나 확인해봅니다.

$ cat hello.txt # 클라이언트입니다.
Hello, Server!
Hello, Client!

토렌트를 이용한 네트워크상의 동기화입니다. 명령어를 입력한 후 효과는 즉시 일어나진 않고 조금의 지연이 있습니다. 아무튼 테스트는 성공적입니다. 이제 웹서버의 데이터를 non-WebUI로 동기화해보도록 하겠습니다.

웹서버의 내용을 로컬 PC와 동기화

이제는 라즈베리 파이 웹서버의 내용을 로컬 데스크탑과 동기화하도록 하겠습니다. 제가 생각할 때 라즈베리 파이를 이렇게 동기화 시킬 경우 데이터 백업 효과 이상의 장점이 있습니다. 바로 데스크탑의 월등한 성능을 활용할 수 있다는 점이죠. 라즈베리 파이가 아무리 날고 기어도 데스크탑 PC의 성능과는 비교할래야 비교할 수 없습니다.

가령 저는 위키의 문서를 공개할 때 PDF 형태도 변환하여 외부로 공개합니다. 위키에 PDF 변환 플러그인이 있어 손쉽게 변환을 할 수 있습니다. 이 변환 과정에서 PHP 스크립트가 상당히 많이 작업을 합니다. 물론 데스크탑에서 변환을 하면 즉시 응답이 옵니다. 그러나 라즈베리 파이에서는 이게 변환이 잘 되지가 않습니다. 성능이 너무 열악한 탓에 처리 시간이 너무 오래 걸려 버리는 것입니다.

앞서 테스트에서도 보셨겠지만, 말이 '서버'와 '클라이언트'이지, 데이터는 항상 양방향으로 동기화됩니다. 어차피 네트워크를 통해 파일만 전송하는 건 라즈베리 파이도 그렇게 느리지 않게 해낼 자신이 있습니다. 그러면 조금 부담이 되는 연산은 오히려 성능이 강력한 PC에서 가뿐하게 처리하고, 결과만 성능이 낮은 서버가 취하면 됩니다. 조금 재밌네요 보통은 이게 반대인데 말이죠… 보통은 서버가 성능이 강력하고 클라이언트가 성능이 열악하지 않던가요? ^_^

언제 어디서나 데이터에 접근이 가능하려고 라즈베리 파이를 서버를 사용합니다. 라즈베리 파이의 웹서버로서의 성능이 그다지 좋은 건 아닙니다. 위키에 글을 쓰고 저장 버튼을 누르면 상당히 시간도 많이 걸리고… 아무튼 가격이 착해서 쓰는 것 뿐이죠. 그런데 이렇게 데이터 공유를 하게 되면 이런 라즈베리 파이의 열악한 성능을 극복할 수 있는 좋은 대안이 됩니다. 꾸준히 클라이언트 PC에 '백업'하며 안정성을 획득하는 동시에 말이죠. 상당히 괜찮지 않나요?

그러면 이제 라즈베리 파이에 꾸역꾸역 쓰고 있는 저의 위키를 데스크탑 PC와 동기화해 보겠습니다. 혹시 클라이언트 측에서 BitTorrentSync가 있다면 잠시 꺼주시거나, test의 공유를 삭제해주세요.

이번엔 non-WebUI 방식을 사용해 볼 겁니다. 그러면 서버의 /etc/init.d/btsync 파일의 한 줄을 손봐주어야 합니다.

$ sudo vi /etc/init.d/btsync

12번째 줄애 DAEMON_OPTS 변수가 보이시죠? 이 값이 webui.conf로 되어 있습니다. 그러므로 이것을 nonwebui.conf로 변경해주어야 합니다.

DAEMON_OPTS="--config /usr/local/etc/btsync/nonwebui.conf"

서버의 도쿠위키는 ~/public_html/dokuwiki에 있습니다. 그리고 이 곳에 모든 파일은 웹서버인 www-data의 소유로 되어 있고, www-data의 그룹으로 되어 있습니다. 우선 btsync를 www-data 그룹으로도 포함시켜 주도록 하지요

$ sudo gpassswd -a btsync www-data
Adding user btsync to group www-data

그리고 도쿠위키의 권한을 조정합니다1)

$ cd ~/public_html/dokuwiki
$ sudo find . -type d -exec chmod 555 {} \;
$ sudo find . -type f -exec chmod 444 {} \;
$ sudo chmod -R 775 data
$ sudo chmod 775 conf/local.php

그리고 nonwebui.conf/home/btsync/sync/dokuwiki가 싱크되도록 설정을 추가합니다.

$ sudo vi /usr/local/etc/btsync/nonwebui.conf

다른 건 건드리지 말고 shared_folders의 엔트리 하나만 수정해 줍니다.

  "shared_folders" :
  [
    {
        "secret"           : "<DOKUWIKI_SECRET>",
        "dir"              : "<WHERE_DOKUWIKI_IS>",
        "use_relay_server" : true,
        "use_tracker"      : true, 
        "use_dht"          : false,
        "search_lan"       : true,
        "use_sync_trash"   : true,
        "known_hosts"      :
        [
        ]
    }
  ],

이제 서버의 btsync를 재시작합니다. 이제부터는 WebUI를 사용할 수 없습니다.

$ sudo btsync restart

클라이언트측에서 적절히 dokuwiki를 위한 디렉토리를 만들고 서버에서 설정한 SECRET을 붙여줍니다. Non-WebUI로도 싱크가 잘 이루어지고 있습니다.

싱크가 다 끝나면 클라이언트 쪽에서도 웹서버를 켜고 위키에 접속해 봅니다. 데스크탑에서 문서를 수정해 보고, 그것이 서버로도 반영되는지 확인해 봅니다. 실제로 저는 이 문장부터는 데스크탑에서 작성 중이랍니다. 믿어주세요 :-) 역시 데스크탑의 성능이 월등하군요. 작업하기 훨씬 더 쾌적합니다. 일단 데이터가 다 싱크된 후에는 그렇게 많은 정보가 변화하지 않으므로 잠깐잠깐 기다려주면 금방 싱크가 유지됩니다. 만일 일이 생겨 다른 장비를 가지고 어디를 가든지 인터넷과 연결되어 있으면 최소한 라즈베리 파이의 서버를 통해 싱크를 맞출 수 있습니다.

이제 라즈베리 파이가 재부팅되면 btsync도 자동으로 실행되도록 처리하기만 하면 됩니다.

$ sudo update-rc.d btsync defaults

문제 해결

저도 싱크가 가능하도록 만들기 위해서 꽤 시행착오를 했습니다. 시행착오 중 알게 된 사항을 같이 기록합니다.

싱크된 파일의 소유권 및 권한 문제

서로 다른 시스템간에 파일이 오가는 것이므로 소유권과 권한 문제가 야기될 수 있습니다. 이렇게 되면 위키 프로그램이 올바르게 데이터를 읽고 쓰기가 어려워집니다. 이 경우 싱크를 맞추는 시스템끼리 서로 계속 소유권과 권한을 확인하여 수정하는 수 밖에 없습니다. BitTorrentSync가 알아서 맞춰 주면 좋겠습니다.

도쿠위키 디렉토리에 다음과 같이 쉘 스크립트를 작성합니다.

make_ready.sh
#!/bin/bash
if [ $HOSTNAME = "desktop" ]; then
	DOKUROOT=/home/changwoo/public_html/dokuwiki
	/bin/chown changwoo:apache -R $DOKUROOT/data $DOKUROOT/conf $DOKUROOT/lib/plugins
elif [ $HOSTNAME  = "MiniServer" ]; then
	DOKUROOT=/home/changwoo/public_html/dokuwiki
	/bin/chown changwoo:apache -R $DOKUROOT/data $DOKUROOT/conf $DOKUROOT/lib/plugins
elif [ $HOSTNAME = "namchang-uui-Mac-mini.local" ]; then
	DOKUROOT=/Users/changwoo/public_html/dokuwiki
	/bin/chown -R _www:_www $DOKUROOT/data $DOKUROOT/conf $DOKUROOT/lib/plugins
fi
#echo $DOKUROOT
/bin/chmod -R 777 $DOKUROOT/data $DOKUROOT/conf $DOKUROOT/lib/plugins

$HOSTNAME = “X_HOST”에 각 서버의 host이름을 적어줍니다. 그리고 DOKUROOT 변수는 각 시스템에 위치한 도쿠위키의 루트 디렉토리를 적습니다. 물론 이 경로는 링크여도 관계없습니다. 그리고 저장합니다. 파일에 실행 권한을 줍니다.

$ chmod a+x make_ready.sh

그리고 각 시스템이 N분마다 이 스크립트를 실행하도록 만듭니다.

$ sudo crontab -e
*/N * * * * <PATH_WHERE_SCRIPT_IS>/make_ready.sh

N을 적절 히 숫자로 바꾸어주세요.

마무리

최신 P2P 기술인 BitTorrent를 응용한 데이터 동기화 프로그램인 BitTorrentSync를 이용하여 라즈베리 파이 웹서버의 데이터를 동기화시켜 보았습니다. 라즈베리 파이 웹서버는 아주 저렴한 가격으로 쉽게 웹서버를 구축할 수 있게 해 주었습니다. 그러나 기기 자체의 퍼포먼스가 그렇게 좋지 않고, 견고한 데이터의 안정성을 보장해 주지 못합니다. 그렇기 때문에 간단한 작업을 하더라도 병목 현상이 잦은데다, 언제 발생할지 모르는 데이터 재난에 매우 취약합니다.

이렇게 열악한 라즈베리 파이 서버에 BitTorrentSync를 접목시키면 웹서버의 데이터를 여러 벌 분산시켜 보관할 수 있습니다. 물론 드롭박스나 엔드라이브 같은 전문적인 서비스의 안정성에 비할 바는 아닙니다만, BitTorrentSync는 내가 가진 하드디스크를 이용할 수 있으므로 무진장한 용량의 데이터를 마음대로 활용하는 것이 가능합니다. 데스크탑의 강력한 자원을 활용하여 작업을 처리하고 처리한 결과를 다시 라즈베리 파이가 수용할 수 있기 때문에 보다 쾌적한 작업이 가능합니다. 라즈베리 파이로서도 작업량의 부담을 덜 수 있어서 좋습니다. 라즈베리 파이나 조금 성능이 열악한 NAS로 개인 웹서버를 운영하시는 분께는 이러한 방법을 한 번 추천드리고 싶습니다.

물론 BitTorrentSync가 완벽한 대안은 아닙니다. 싱크가 잘 된다고 방심하시면 절대 안 됩니다. 반드시 평소 해 오시던 백업과 혼용하세요. BitTorrentSync는 아직 시험적인 서비스에 불과합니다. 참신하고 혁신적인 서비스이지만 조금 더 지켜봐야 할 겁니다. 한편 제가 예를 든 도쿠위키의 핵심 데이터는 잘 정리해서 압축하면 그렇게 많은 용량을 차지하지 않습니다. 대부분의 개인 웹서버의 데이터는 이럴 것입니다. 이렇게 스냅샷을 만들어 클라우드 스토리지 서비스와 혼용하면 더욱 이상적으로 웹서버 데이터를 유지관리하실 수 있으리라 생각합니다.

참고할 만한 문서들

1)
설명은 모든 도쿠위키의 파일에 대해 권한을 재조정하는 식으로 되어 있습니다.