Self-hosted LiveSync

Self-hosted LiveSync는 Obsidian Vault를 직접 운영하는 서버와 동기화할 수 있는 커뮤니티 플러그인이다. 여기서는 CouchDB를 홈서버에 두고 HTTPS를 통해 연결하는 구성을 다룬다. 동기화는 여러 기기의 상태를 맞추는 기능이며, 삭제까지 전파될 수 있으므로 별도 백업을 대신하지 않는다.

먼저 정할 구조

Obsidian의 LiveSync 플러그인
          │ HTTPS
          ▼
Nginx 또는 다른 TLS 종단점
          │ 내부 HTTP 연결
          ▼
CouchDB ── 영속 데이터 볼륨

Cloudflare Tunnel은 서버를 연결하는 선택지 중 하나다. 필수 구성 요소는 아니다. 직접 도메인과 인증서를 관리할 수 있다면 Nginx 등의 리버스 프록시로 HTTPS를 제공할 수 있다.

공식 CouchDB 설정 안내에는 Docker·Compose·직접 설치 방법이 함께 있다. 문서 언어만으로 지원 구성을 판단하지 않고, 사용하는 플러그인 버전과 현재 안내를 확인한다.

CouchDB 데이터 수명부터 분리하기

다음은 Linux 홈서버에서 Nginx를 호스트 프로세스로 실행할 때의 최소 Compose 골격이다. compose.yaml에 저장한다. 이 파일만으로 LiveSync 설정이 모두 끝나는 것은 아니다. CouchDB 초기화, 인증·CORS 설정, HTTPS 연결을 이어서 완료해야 한다.

services:
  couchdb:
    image: couchdb:3
    restart: unless-stopped
    environment:
      COUCHDB_USER: ${COUCHDB_USER:?set COUCHDB_USER}
      COUCHDB_PASSWORD: ${COUCHDB_PASSWORD:?set COUCHDB_PASSWORD}
    ports:
      - "127.0.0.1:5984:5984"
    volumes:
      - couchdb-data:/opt/couchdb/data
      - couchdb-config:/opt/couchdb/etc/local.d

volumes:
  couchdb-data:
  couchdb-config:

여기서 couchdb:3은 3.x 계열 예시다. 실제 운영에서는 검증한 패치 버전이나 이미지 digest를 기록해 업데이트 범위를 통제한다. 관리자 자격 증명은 서버의 비공개 환경 설정으로 전달하고 저장소에 커밋하지 않는다.

127.0.0.1 포트 바인딩은 같은 호스트의 Nginx가 접근하는 구조다. Nginx도 컨테이너라면 이 주소는 Nginx 컨테이너 자신을 가리킨다. 같은 Docker 네트워크에 연결하고 서비스 이름으로 upstream을 지정하는 등 구성을 바꿔야 한다.

데이터와 설정을 볼륨에 두면 컨테이너 교체와 저장 공간을 분리할 수 있다. 하지만 docker compose down -v처럼 볼륨까지 제거하는 명령에는 데이터가 삭제될 수 있다. 볼륨 자체의 백업·복원도 준비한다. Docker 볼륨 문서

연결은 세 단계로 확인하기

서버를 초기화한 뒤, 다음 순서로 범위를 넓혀 확인한다.

  1. CouchDB 자체: 서버에서 인증이 필요한 관리 요청이 올바르게 처리되는지 확인한다. 계정·데이터베이스·권한을 구분한다.
  2. HTTPS 주소: 기기에서 사용할 도메인으로 인증서와 프록시 연결을 확인한다. 신뢰되지 않는 인증서나 만료된 인증서는 앱에서 연결 실패를 일으킬 수 있다.
  3. LiveSync 플러그인: 공식 초기화 안내의 CORS·인증·요청 크기 설정을 적용하고 플러그인의 연결·설정 검사를 수행한다.

프록시가 200을 반환하거나 CouchDB의 환영 JSON이 보인다고 동기화 권한까지 검증된 것은 아니다. 실제 사용할 데이터베이스와 자격 증명으로 플러그인 검사를 통과해야 한다. 설정용 URI를 생성했다면 자격 증명 등이 담길 수 있으므로 공개 글·스크린샷에 그대로 넣지 않는다.

첫 동기화와 추가 기기 연결을 구분하기

처음 서버를 만들 때는 기준으로 삼을 Vault를 정하고 별도 복사본을 보관한다. 기존 로컬 Vault와 원격 DB에 내용이 모두 있다면 바로 덮어쓰기나 재구축을 실행하지 않는다.

새 기기를 연결할 때는 빈 테스트 Vault에서 시작해 작은 노트 하나의 생성·수정·삭제가 양쪽에 어떻게 반영되는지 확인한다. 첨부 파일도 함께 확인한 다음 실제 Vault로 적용한다. 플러그인 버전에 따라 버튼 이름과 프리셋이 달라질 수 있으므로 오래된 “Fetch 후 무조건 덮어쓰기” 절차를 그대로 따르지 않는다.

증상 확인할 범위
서버 내부에서는 되지만 모바일에서 실패 외부 DNS·도달 가능성·인증서·프록시
연결되지만 인증 오류 사용자 정보·DB 권한·프록시의 인증 헤더 전달
일부 큰 첨부 파일만 실패 CouchDB와 프록시의 요청 크기 제한
재배포 뒤 데이터가 비어 있음 같은 볼륨을 마운트했는지, Compose 프로젝트 이름이 바뀌었는지
수정이 반복되거나 충돌이 쌓임 다른 동기화 도구와의 중복 실행·기기별 설정·플러그인 로그

문제를 고치려고 원격 DB를 지우기 전에 로그와 어느 쪽 데이터가 기준인지 확인한다. 설정을 바꾼 뒤에는 연결 성공뿐 아니라 재시작 후 데이터 보존, 작은 변경의 왕복 동기화까지 검증한다.

자료: Self-hosted LiveSync, CouchDB Docker 이미지, CouchDB 초기 설정