8 min read

옵시디언 self-hosted livesync를 사용한 실시간 동기화 환경

옵시디언 self-hosted livesync를 사용한 실시간 동기화 환경

최근 옵시디언을 아이패드 환경에서 사용하고자 다양한 sync 방법들을 테스트하고 있는데, 그 중에서도 실시간 동기화를 구현해놓은 self-hosted livesync 플러그인을 사용해 실시간 동기화 환경을 구축하였습니다.

필자는 개인 서버를 가지고 있어 도큐멘테이션에서 추천하는 fly.io가 아닌 selfhosted 환경에서 구축하였습니다.

Dependency

이 글을 통해 환경을 구축하기 위해서는 아래와 같은 개념들에 대한 사전 이해가 필요합니다.

  • docker와 docker-compose
  • reverse proxy 또는 port-forwarding
  • NAS 혹은 selfhosting 되는 서버 (linux 기반의)

기존 환경

옵시디언 노트 앱과 sync
로컬 폴더 기반의 노트 앱인 옵시디언에 대해서 알아보도록 합니다.

기존 환경에서는 remotely sync를 사용한 동기화 시스템을 구축해서 사용하고 있었습니다. remotely sync 플러그인의 단점으로는

  • synology 기준 폴더 단위 권한 설정이 까다로움
    • 편한 권한 관리를 위해서는 옵시디언 전용 공유폴더를 만들어야 함...
  • 기존에 윈도우 환경과의 충돌
    • 윈도우 환경에서는 raidrive로 붙어서 로컬을 직접 수정합니다.
    • conflict 관리가 귀찮음
  • 가끔씩 sync가 반영이 안되어있음

등등의 문제점이 있었고, 윈도우 환경에서 remotely sync를 사용해도 되었겠습니다만 기왕 서버있는거 livesync로 구축해보도록 합시다.

self hosted livesync 플러그인

GitHub - vrtmrz/obsidian-livesync
Contribute to vrtmrz/obsidian-livesync development by creating an account on GitHub.

livesync 플러그인에서는 그냥 CouchDB에 붙어서 작업하기 때문에, CouchDB를 도커 등등에 올리고 이를 public하게 호스팅 하면 됩니다. 저는 개인서버에 붙여서 진행하도록 하겠습니다.

도커상에서 구축된 CouchDB를 public하게 호스팅하는 방법은 본 글의 scope를 벗어나 있습니다. 호스팅 서비스를 이용하시는 경우 그냥 inbound/outbound 열어서 접근하시면 될거 같고, 저와 같은 로컬 환경에서는 port-forwarding이나 reverse proxy를 걸어서 사용해야 합니다.

저는 reverse proxy를 걸어 사용하고 있습니다.

CouchDB 설치

docker환경에 CouchDB를 설치해보도록 합시다. CouchDB의 초기 설정을 위한 local.ini 파일을 생성하도록 하겠습니다. 파일의 상세 규격은 아래 documentation의 구버전 readme를 참고하였습니다.

obsidian-livesync/docs/setup_own_server.md at 93e7cbb133334d70cd2f48d38a6a2f7e933825c8 · vrtmrz/obsidian-livesync
Contribute to vrtmrz/obsidian-livesync development by creating an account on GitHub.
[couchdb]
single_node=true
max_document_size = 4294967295

[chttpd]
require_valid_user = true
max_http_request_size = 4294967295
enable_cors = true

[chttpd_auth]
require_valid_user = true
authentication_redirect = /_utils/session.html

[httpd]
WWW-Authenticate = Basic realm="couchdb"
bind_address = 0.0.0.0

[cors]
origins = app://obsidian.md, capacitor://localhost, http://localhost
credentials = true
headers = accept, authorization, content-type, origin, referer
methods = GET,PUT,POST,HEAD,DELETE
max_age = 3600

위 내용이 적힌 local.ini 파일과, 실제 데이터를 백업하기 위해서 빈 data 폴더를 하나 만듭니다. 저는 시놀로지 상에서 작업하였습니다.

이 폴더의 경로를 기억해 두고, docker-compose.yml을 작성합니다.

version: "3.9"
services:
  couchdb:
    image: couchdb
    container_name: obsidian-db
    user: 1000:1000 # 본인의 uuid/guid 
    environment:
      - COUCHDB_USER=admin # <- 여기에 아이디
      - COUCHDB_PASSWORD=password # <- 여기에 비밀번호
    volumes:
      - /syno/docker/obsidian-db/data:/opt/couchdb/data # 본인 디렉토리
      - /syno/docker/obsidian-db/local.ini:/opt/couchdb/etc/local.ini
    ports:
      - 5984:5984
    restart: unless-stopped

본인의 설정에 맞게 진행해 주세요. 해당 docker-compose는 예시라고 생각해 주시면 됩니다.

저는 portainer 상에서 docker-compose를 실행시켰습니다.

성공적으로 띄워진걸 확인할 수 있습니다. 이제 이 컨테이너를 외부에 공개하면 됩니다. 저는 nginx proxy manager를 사용해서 밖으로 띄워뒀습니다.

Obsidian에서 플러그인 설치

설정 페이지에서 Options > Community Plugins > Turn on community plugins 버튼을 클릭해 줍니다.

Browse 선택 후 livesync 검색, 플러그인을 설치합니다.

Enable 버튼을 선택시 아래와 같은 Modal이 나오는데, Open setting dialog를 눌러 계속 진행합니다.

Minimal Setup 선택, Remote Type은 CouchDB로 유지하고

  • 공개된 데이터베이스 접근 주소
  • 닉네임
  • 비밀번호

순서대로 채웁니다. 단순히 inbound/outbound만 열어둔 경우 포트번호를 명시해야 함에 유의합니다.

Database Name의 경우 자유롭게 채워주면 됩니다. 저는 livesync로 했습니다.

Check and fix database configuration 항목으로 이동하면 Fix버튼이 여러개 있습니다. 전부 눌러서 반영하고 apply 후 check 버튼으로 확인합니다.

Confidentiality 에서 End-to-End encryption을 켜주고, 마지막으로 암호화에 필요한 key까지 입력해주면 설정이 완료됩니다.

Presets에서 livesync를 선택 후, Apply로 적용합니다.

설정을 끝내고 나오면 위와 같은 창이 뜨는데, Fetch를 선택합니다. hidden file 안에 플러그인 설정파일 등도 포함이 되어 있습니다.

마지막 비밀번호 설정을 끝내면 링크가 복사되었다는 알림을 주는데, 복사된 해당 링크를 잘 간직해 둡니다. 다른 기기들의 연결을 보다 편하게 할 수 있습니다.

다른 기기와 livesync 하기

저는 윈도우 기기와 mac 기기를 livesync 해보도록 하겠습니다. 앞서 복사한 링크를 준비하고, 플러그인 설치까지는 동일하게 진행합니다. 단, Minimal setup 선택 대신 Use the copied setup URI 를 선택합니다.

준비된 uri를 입력창에 붙여넣고 나면 비밀번호 입력창이 나오며, 앞서 설정했던 비밀번호를 입력해줍니다.

yes 선택해줍니다.

secondary device로 설정을 완료합니다.

이제 livesync가 가능합니다! 🎉

서브 기기에서도 hidden file sync를 켜면 플러그인 sync까지도 가능한데, 문제는 이러면 hidden 파일이 바뀌었다고 자꾸 옵시디언을 재시작하라고 귀찮게 굴기는 합니다.

기본적으로 conflict 관리가 영 귀찮은 느낌으로 만들어져 있기는 해서 그냥 이런것도 있구나 하고 봐주시면 좋겠습니다. 리얼타임 편집이 드라마틱하게 필요하신 분이라면 노션을 가는게 맞고, 사실 제일 좋은건 syncthing 같은거 쓰는건데 아이패드가 하필 그게 안되서 ㅠㅠ