어떤 파일은 여러 곳에 저장할 필요가 있습니다. 대표적으로 가족 사진이나 업무 자료와 같은 것이 있죠. 특히 나스를 운영하는 분들은 자료를 오랫동안 모으는 경우가 많으니, 혹시나 하드가 손상되어 자료가 유실되면 눈앞이 더 깜깜하겠죠. 그걸 방지하기 위해 자료를 이중으로 저장하곤 합니다.

나스에서 가장 일반적인 방법은 RAIDRedundant Array of Independent Disk인 것 같습니다. 이 기술은 원래 여러 개의 하드디스크를 묶어 데이터를 동시 관리하는 기술입니다. RAID 0 (Striping) 방식으로 읽기/쓰기 속도를 늘리기도 하고, RAID 1 (Mirroring) 방식으로 데이터를 두 곳에 동시 저장하기도 해요. 이 외에도 RAID 01/10이나 RAID 2-6와 같이 용량 확장과 데이터 안정성을 같이 추구하기도 합니다. 다만 저는 이 방식을 별로 선호하지 않는데요. (RAID 0을 제외한) 이 기술은 무중단 운영 (하드 1개쯤 손상되어도 나스를 계속 운영하며 복구를 할 수 있어요) 에 일차적인 목적이 있지, 안정적인 데이터 이중화는 아니라고 생각해서 그렇습니다. 같은 공간에 같은 전원에 연결되어 동작하는 구조상, 급작스러운 전원 차단이나 낙뢰 피해 같은 상황에서는 이중화 구성된 모든 디스크가 동시에 고장이 날 수도 있습니다.

그래서 저는 원격지에 백업하는 방법을 더 좋아합니다. 결국 백업한 파일을 다른 PC에 저장하면 되는데요, 일반적으로 증분 백업을 많이 하죠. 이 방법은 최초에 모든 데이터를 저장한 뒤, 이후로는 변경사항만 기록하는 방법으로 나중에 데이터를 특정 시점으로 복원할 수 있게 하죠. 업무 자료와 같이 자주 수정되고, 특정 시점으로 복원이 꼭 필요한 데이터는 이렇게 저장할 필요도 있습니다. 이 방식은 특히 랜섬웨어와 같은 파일 변조 공격에도 대처할 수 있다는 장점이 있어요!

하지만 제 자료는 이렇게까지 중요하지는 않아요. 두 군데에 저장하면 좋겠지만, 이왕이면 저장한 곳에서도 유용하게 사용하고 싶어요. (백업 프로그램으로 백업된 자료는 일반적으로는 열람할 수 없거든요) 그래서 파일 동기화 프로그램을 쓰기로 했습니다. 파일을 모든 컴퓨터에 같이 저장함으로써, 백업의 효과도 얻고 그 파일을 로컬에서 접근하는 속도로 이용할 수도 있어요. 상용 서비스 중에서는 구글 드라이브의 백업 및 동기화가 정확히 이 범주에 속하는데요, 용량 제한이 있으니 마음껏 사용하기엔 비용 문제가 크죠. 그리고 이제 무제한 용량 플랜도 사라졌고

오늘은 서론이 길었네요, 아무튼 이번에 소개할 서비스는 Syncthing입니다.


Syncthing

Syncthing 로고
Syncthing 공식 홈페이지

Syncthing은 스웨덴의 비영리 재단에서 주도하는 오픈 소스 P2P 파일 동기화 프로그램입니다. Windows/macOS/Linux/Android 모두 지원하는 높은 범용성을 가지고 있어요. 또한 P2P 방식의 파일 동기화 프로그램이라 원칙적으로는 나스와 같은 서버도 필요하지 않습니다! 하지만, 항상 켜진 상태로 파일 변경 상태를 관리하는 컴퓨터가 있는 것이 더 유용하겠죠. 그런 이유로 P2P 방식임에도 불구하고 중앙 관리 목적을 하는 나스를 둘 거예요.

파일 동기화 구성

사람마다 동기화하고 싶은 구성이 다를 거예요. 나스가 두 개 이상인 분은 두 개의 나스에 동기화 공간을 만드는 방법을 쓸 수도 있겠죠. 안드로이드의 사진 폴더와 동기화함으로써 사진 업로드와 백업을 자동화하는 방법도 가능합니다.

저는 윈도우 PC의 특정 폴더를 나스와 동기화시키는 구성을 할 거예요. PC에서 바로 열람하는 자료를 자연스럽게 백업할 수도 있고, PC가 꺼졌어도 나스에 접속하여 같은 자료를 열람할 수도 있거든요. 스샷 찍기도 편함

사전 작업

설정 폴더 생성

싱크띵의 동기화 설정을 보관할 폴더를 만들어야 해요.

$ mkdir -p /docker/syncthing/config

기본 동기화 폴더 지정

동기화할 자료를 저장하는 폴더를 지정해줘야 합니다. 저는 /data 경로 아래 syncthing이라는 이름으로 만들었어요.

$ mkdir -p /data/syncthing

사용자 및 그룹 확인

싱크띵은 root 계정으로 동작하면 경고를 내기 때문에, 동기화된 파일을 소유할 사용자를 지정해야 합니다. 저는 현재 사용자를 지정하기로 했어요. id 사용자명 명령을 입력해 봅시다.

$ id banyazavi

uid=1000(banyazavi) gid=100(users) groups=100(users),27(sudo)

banyazavi 사용자의 ID (uid) 는 1000이고, users 그룹의 ID (gid) 는 100이네요.

도커 컨테이너 생성

그래서 이 서비스는 바로 docker-compose 파일 내용을 포테이너의 Add Stack > Web editor 아래의 공간에 복사하여 붙여넣으면 됩니다. 싱크띵 깃허브의 도커용 README를 조금 수정했어요.

version: "3"
services:
  syncthing:
    image: syncthing/syncthing
    hostname: Banyazavi-NAS
    environment:
      - PUID=1000
      - PGID=100
    volumes:
      - /docker/syncthing:/var/syncthing
      - /data/syncthing:/var/syncthing/Sync
    network_mode: host
    restart: unless-stopped

이 서비스는 다른 도커 서비스보다 특이한 것이 많은데요, 우선 hostname이 그렇습니다. 이 값은 나중에 싱크띵 내에서 현재 기기로 표현되는 이름입니다. 저는 Banyazavi-NAS라고 지었는데, 이 값은 당연히 기기마다 바뀌어야 하겠죠.

network_mode: host 이 옵션도 흔히 쓰진 않는데요. 이 옵션은 싱크띵의 로컬 탐지 기능을 사용하기 위해 브릿지가 아닌 호스트 네트워크를 쓰겠다는 뜻입니다. 사실 로컬 탐지 방법이 없어도 글로벌 탐지 등의 방법으로 여러 싱크띵 프로그램을 연결할 수 있으므로, 브릿지로 사용해도 큰 문제는 없어요. 다만, 한 나스에 여러 개의 싱크띵 도커를 설치하려면 반드시 브릿지 네트워크로 설정하여 외부 포트를 전부 다르게 해야 합니다.

    network_mode: bridge
    ports:
      - 8384:8384
      - 22000:22000/tcp
      - 22000:22000/udp

브릿지 모드로 사용하려면 위와 같이 설정하면 됩니다. 여러 개의 싱크띵 서비스를 설치하려면 ports 옵션 내의 콜론 (:) 왼쪽 숫자들을 모두 겹치지 않도록 바꿔 주면 돼요.

윈도우 클라이언트 설치

다른 OS 용 설치파일은 싱크띵 다운로드 페이지에서 내려받을 수 있습니다. 윈도우 용 클라이언트 이름은 SyncTrayzor이네요. 설치 방법은 별도의 안내가 없어도 될 정도로 매우 간단해요.

서비스 동작 확인 및 설정

나스의 관리자 인터페이스는 http://나스_IP:8384에서 볼 수 있습니다. 클라이언트는 SyncTrayzor를 실행시키거나 트레이 아이콘을 더블클릭하면 볼 수 있어요. 이제 기본 폴더를 동기화하는 과정을 안내할 건데요. 양쪽 화면이 번갈아 나오니 매우 헷갈릴 수 있어요! 상단 이름이 Banyazavi-NAS인 것이 나스, BANYA-NOTEPC인 것이 클라이언트입니다.

관리자 인터페이스 계정 설정

관리자 인터페이스 계정 설정 경고

처음 만나는 화면은 바로 접속 계정을 설정하라는 내용이에요. 지금은 네트워크 안의 누구나 관리자 인터페이스에 접근하여 동기화 설정을 건드릴 수 있으므로, 접속 계정을 바로 설정하는 것이 좋아요. 설정의 GUI 탭에서 쉽게 사용자와 비밀번호를 설정할 수 있으므로, 여기서는 자세한 방법은 설명하지 않겠습니다.

나스 Syncthing 초기 화면
나스 (Banyazavi-NAS)

나스의 초기 화면이에요. 기본 경로 /data/syncthing에 9.27 GiB 정도의 파일이 담겨 있어, 탐색에 다소 시간이 걸렸습니다. 아직은 공유가 되어 있지 않은 상황이므로 공유되지 않음이라고 표시되고 있어요. 하단의 다른 기기 추가 버튼을 눌러 PC 클라이언트를 추가해 봅시다.

기기 추가

나스 Syncthing 기기 추가
나스 (Banyazavi-NAS)

기기를 추가하는 화면입니다. 연결하려는 PC 클라이언트의 관리자 인터페이스에서 동작 > 기기 ID 번호 보기를 누르면 기기 ID를 볼 수 있어요. 저는 다행히도 주변의 기기 중 하나를 선택할 수도 있습니다.에 기기 ID가 검색되어, 클릭만으로 간편하게 입력할 수 있었어요. 그리고 기기명을 알아보기 쉽게 입력해주면 되는데요. 저는 굳이 별명을 지을 이유는 없어 보여서, PC 클라이언트에서 보이는 이름 그대로 BANYA-NOTEPC라고 지었습니다. 그리고 저장을 누르면,

PC Syncthing 기기 추가 알림
PC (BANYA-NOTEPC)

추가 당한 PC 쪽에서는 바로 알림이 뜹니다. 그래서 같은 작업을 반대편에서 반복할 필요 없이 기기 추가 버튼만 눌러서 추가할 수 있어요.

폴더 공유

이제 폴더 공유를 해 봅시다. 사실 기기를 추가할 때 폴더 공유도 한 번에 할 수 있었는데요. 일부러 단계를 쪼갰어요.

나스 Syncthing 폴더 공유
나스 (Banyazavi-NAS)

Default Folder의 편집 버튼을 누르고, 공유 탭을 보면 위와 같은 설정이 되어 있습니다. 여기에서 폴더를 공유하기로 한 BANYA-NOTEPC를 선택한 다음에 저장하면 돼요. 스크롤을 위로 올려 기기 추가 화면을 보면 공유 탭이 똑같이 존재하는 것을 볼 수 있는데요, 사실 이때 폴더 공유도 같이 설정할 수 있었습니다.

PC Syncthing 폴더 공유 알림
PC (BANYA-NOTEPC)

기기 추가 때와 마찬가지로 폴더 공유도 알림이 뜨게 됩니다. 이때, 같은 폴더 ID 번호를 가진 폴더가 지정되어 있으면 자동으로 그 폴더와 동기화하게 되고요, 만약 그런 폴더가 없으면 어떤 폴더에 동기화할 건지 동기화 폴더를 생성하는 절차에 들어가게 됩니다. 지금은 양쪽에 모두 지정된 default 이름을 가진 폴더를 동기화하니, 다른 설정 없이 바로 두 폴더를 동기화하게 됩니다.

PC Syncthing 동기화 완료 후
PC (BANYA-NOTEPC)

동기화 설정이 완료되면 이제 양쪽의 폴더를 동기화하기 시작합니다. 탐색 후 파일을 주고받는 과정이 끝나면 위 그림과 같이 되죠. 그리고 해당 경로에 가면 파일이 똑같이 구성된 모습을 볼 수 있어요.

이후 양쪽 폴더에 변동이 생기면 해당 내용이 다른 폴더에도 반영되게 됩니다. 고급 설정에서 변경 항목 감시가 켜져 있다면 보통 1분 내외로 파일 변경을 감지해서 동기화를 시도하게 돼요. 혹시 이때 감지하지 못하여 동기화되지 않아도 완전 재탐색 간격 설정에 따라 전체 파일을 비교하여 공유 폴더의 내용을 똑같이 구성하게 됩니다.


그리고 남은 이야기

싱크띵은 파일 동기화에 필요한 여러 고급 설정을 충실하게 가지고 있어요. 파일 버전 관리를 통해서 동기화에 의해 삭제된 파일도 복구할 수 있습니다. (기본값은 꺼져 있어요) 기본적으로 P2P 공유라는 점을 활용하여, 나스와 같은 중앙 서버 없이도 사무실 내 PC 간의 파일 분산 보관 및 공유하는 방식으로 사용할 수도 있고요. 이런 고급 설정을 통한 방법은 제가 안내해드리지는 않지만, 한국어 번역이 굉장히 잘 되어 있는 편이므로 설정을 잘 읽어보면 바로 이해하여 적용해 볼 수 있습니다.

하지만 어떤 기능인지를 완벽하게 이해하기 전에는 실제 자료에 동기화 적용을 하지 마세요! 파일의 삭제 권한을 가지는 서비스는 때때로 어마어마한 사고를 치기도 하거든요.

댓글남기기