왜 자체 구축인가?
옵시디언은 본질적으로 로컬 마크다운 파일을 다루는 도구다. 그런데 PC와 모바일을 오가며 쓰기 시작하는 순간, "어떻게 동기화할 것인가"라는 문제가 생긴다. 공식 Obsidian Sync는 깔끔하지만 매월 $5~$10이 나가고, 한때 인기였던 Remotely Save는 2025년 7월 유료화 예정이라 무료 대안의 자리도 좁아졌다.
이 글에서 만드는 환경은 다르다. 본인의 PC나 NAS에 CouchDB + Caddy 조합으로 동기화 서버를 직접 띄우고, 옵시디언 커뮤니티 플러그인 Self-hosted LiveSync로 연결한다. 데이터는 외부 클라우드를 거치지 않고 본인 서버에만 머문다. 비용은 0원이다.
Obsidian Sync 공식
월 $5~$10 · 1~10GB 제한 · 외부 서버 경유
Remotely Save
2025.07 유료화 예정 · 클라우드 의존
자체 구축 (이 가이드)
무료 · 무제한 · 완전 통제 · E2E 암호화
시스템 구성도
전체 구조는 단순하다. 옵시디언 클라이언트(PC·모바일)가 HTTPS로 Caddy에 접속하면, Caddy가 SSL을 처리하고 내부의 CouchDB로 요청을 전달한다.
┌─────────────┐ HTTPS (443) ┌──────────────┐
│ 옵시디언 │ ─────────────────►│ Caddy │
│ (PC·모바일) │ │ 리버스 프록시│
│ │ │ + SSL 자동 │
└─────────────┘ └───────┬──────┘
│ localhost:5984
▼
┌──────────────┐
│ CouchDB │
│ 데이터베이스 │
└──────────────┘
사용 기술 스택
| 기술 | 역할 | 비용 | |---|---|---| | CouchDB | NoSQL DB · 실시간 동기화 백엔드 | 무료 (오픈소스) | | Caddy | 리버스 프록시 · SSL 자동 발급/갱신 | 무료 (오픈소스) | | Self-hosted LiveSync | 옵시디언 커뮤니티 플러그인 | 무료 (오픈소스) | | Let's Encrypt | SSL 인증서 | 무료 |
기존 서버를 활용한다면 총 구축 비용은 0원이다. CouchDB는 아이들 상태에서 RAM 50~100MB만 쓰고 CPU는 거의 0%다. NAS나 파일서버에 얹어도 부담이 없다.
1단계. 사전 준비
필수 체크리스트
- 24시간 가동되는 PC 또는 서버 (Windows / Linux / macOS)
- 고정 IP 또는 DDNS 설정
- 도메인 보유 (SSL 인증서 발급에 필수)
- 공유기 관리자 접근 권한 (포트포워딩용)
권장 서버 사양
| 항목 | 최소 | 권장 | |---|---|---| | CPU | 1코어 | 2코어 이상 | | RAM | 512MB | 1GB 이상 | | 디스크 | 1GB | 10GB 이상 | | OS | Windows 10+ | Windows 10/11, Ubuntu 22.04+ |
💡 이 가이드는 Windows 기준으로 작성됐다. Linux/macOS도 명령어만 다를 뿐 흐름은 동일하다.
2단계. CouchDB 설치
CouchDB 공식 페이지에서 Windows 인스톨러를 다운로드한다.
📥 https://couchdb.apache.org/#download
설치 도중 관리자 계정(사용자명·비밀번호) 을 설정하라는 화면이 나온다. 이 정보는 이후 옵시디언 연결과 모든 명령어에서 계속 쓰이므로 반드시 메모해둔다.
설치 확인
PowerShell을 열고 다음 명령어를 실행한다.
curl.exe http://localhost:5984/
정상 응답:
{"couchdb":"Welcome","version":"3.5.1",...}
브라우저에서 http://localhost:5984/_utils 에 접속하면 CouchDB 웹 관리 화면(Fauxton)도 사용할 수 있다. 데이터베이스를 GUI로 둘러보기 좋은 도구다.
3단계. 데이터베이스 초기화
시스템 DB 3개 생성
CouchDB는 첫 실행 시 시스템 데이터베이스 3개를 직접 만들어줘야 한다.
curl.exe -X PUT http://localhost:5984/_users -u "계정:비밀번호"
curl.exe -X PUT http://localhost:5984/_replicator -u "계정:비밀번호"
curl.exe -X PUT http://localhost:5984/_global_changes -u "계정:비밀번호"
옵시디언 전용 DB 생성
curl.exe -X PUT http://localhost:5984/obsidian-vault -u "계정:비밀번호"
각 명령어 실행 시 {"ok":true} 응답이 나오면 성공이다.
❌ PowerShell curl 함정: PowerShell에서
curl은Invoke-WebRequest의 별칭이다. 반드시curl.exe로 실행해야 한다. 그렇지 않으면 "매개 변수 이름 'X'과(와) 일치하는 매개 변수를 찾을 수 없습니다" 오류가 난다.
⚠️ 비밀번호 특수문자:
!,),@같은 특수문자가 포함된 경우 작은따옴표로 감싼다.
curl.exe -X PUT http://localhost:5984/_users -u 'admin:p@ss!word'
4단계. CORS 설정
옵시디언 LiveSync 플러그인은 브라우저 환경에서 동작하기 때문에 CouchDB가 CORS를 허용해야 한다.
local.ini 파일 위치 찾기
Get-ChildItem -Path "C:\" -Recurse -Filter "local.ini" -ErrorAction SilentlyContinue 2>$null
보통 C:\Program Files\Apache CouchDB\etc\local.ini 에 있다.
CORS 설정 추가
local.ini 파일을 열고 맨 아래에 다음 내용을 추가한다.
[chttpd]
enable_cors = true
[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
CouchDB 서비스 재시작
net stop "Apache CouchDB"
net start "Apache CouchDB"
5단계. Caddy 설치 및 SSL 자동 설정
Caddy는 리버스 프록시와 SSL 인증서 자동 관리를 한 번에 해결해주는 웹 서버다. nginx + certbot 조합을 한 줄짜리 설정 파일로 대체한다.
Caddy 다운로드
mkdir C:\caddy
curl.exe -o C:\caddy\caddy.exe -L "https://caddyserver.com/api/download?os=windows&arch=amd64"
Caddyfile 생성
Set-Content -Path "C:\caddy\Caddyfile" -Value @"
obsidian.your-domain.com {
reverse_proxy localhost:5984
}
"@
obsidian.your-domain.com 부분은 본인이 사용할 실제 서브도메인으로 바꾼다. Caddy는 이 도메인에 대해 Let's Encrypt에서 SSL 인증서를 자동으로 발급해준다.
Caddy 실행 (테스트)
cd C:\caddy
.\caddy.exe run --config Caddyfile
로그에 certificate obtained successfully 메시지가 나타나면 SSL 인증서 발급이 끝난 것이다. 이때 Ctrl+C로 종료해도 인증서는 캐시되어 있으니 다시 실행할 때 즉시 사용된다.
6단계. 공유기 포트포워딩
공유기 관리자 페이지에 접속해서 두 개의 포트를 열어준다.
| 외부 포트 | 내부 IP | 내부 포트 | 용도 | |---|---|---|---| | 80 | 서버 내부 IP | 80 | Let's Encrypt 인증서 발급/갱신 | | 443 | 서버 내부 IP | 443 | HTTPS 동기화 트래픽 |
서버 내부 IP 확인
ipconfig
IPv4 주소 항목을 확인한다 (예: 192.168.0.100).
⚠️ 5984 포트(CouchDB)는 절대 외부로 열지 않는다. 모든 외부 접근은 Caddy(443)를 통해서만 들어와야 한다.
7단계. DNS 설정
도메인 DNS 관리 페이지에서 A 레코드를 추가한다.
| 타입 | 이름 | 값 | |---|---|---| | A | obsidian | 서버의 고정 공인 IP |
정상 동작 확인
브라우저에서 https://obsidian.your-domain.com 으로 접속한다.
{"couchdb":"Welcome","version":"3.5.1",...}
이 응답이 나오면 DNS + SSL + 리버스 프록시가 모두 정상이라는 뜻이다. 여기까지 왔다면 서버 쪽 작업은 사실상 끝난 것이다.
8단계. 옵시디언 플러그인 설정 (첫 번째 기기)
플러그인 설치
옵시디언 → 설정 → 커뮤니티 플러그인 → Browse → "Self-hosted LiveSync" 검색 → 설치 → 활성화
초기 설정 순서
- "I am setting this up for the first time" 선택
- "Yes, I want to set up a new synchronisation" 클릭
- "Enter the server information manually" 선택
- E2E 암호화: 체크 + passphrase 입력 (기억 필수)
- 서버 타입: "CouchDB" 선택
서버 정보 입력
| 항목 | 입력값 |
|---|---|
| URL | https://obsidian.your-domain.com |
| Username | CouchDB 사용자명 |
| Password | CouchDB 비밀번호 |
| Database Name | obsidian-vault |
CouchDB 이슈 자동 감지 및 수정
플러그인이 서버 설정을 점검하고 부족한 부분을 자동으로 수정해준다.
- "Detect and Fix CouchDB Issues" → 표시되는 모든 Fix 버튼 클릭
- "All checks passed successfully!" 확인
- "Test Settings and Continue" 클릭
- "Restart and Initialise Server" 클릭
- 확인 체크박스 3개를 모두 체크 → "I Understand, Overwrite Server"
- "Replication completed" 메시지 확인
❌ E2E Passphrase 분실 주의: E2E 암호화 passphrase를 분실하면 다른 기기에서 데이터를 복호화할 수 없다. 한 번 설정한 passphrase는 비밀번호 관리자 등 안전한 곳에 반드시 기록해둔다.
9단계. 추가 기기 연결
이제 두 번째, 세 번째 기기를 같은 동기화 환경에 추가한다. 핵심은 빈 볼트로 시작해서 서버에 있는 데이터를 끌어오는 흐름이다.
설정 순서
- 새 기기에서 옵시디언 실행 → 빈 볼트 새로 생성
- Self-hosted LiveSync 플러그인 설치 / 활성화
- "I am adding a device to an existing synchronisation setup" 선택
- "Enter the server information manually" 선택
- E2E passphrase: 첫 번째 기기와 정확히 동일하게 입력
- 서버 정보: 첫 번째 기기와 동일하게 입력
- Vault 상태: "This Vault is empty..." 선택
- "Reset and Resume Synchronisation" 클릭
✅ 서버에 저장된 노트가 자동으로 다운로드된다. 이후 양쪽 기기에서 편집한 내용이 실시간으로 동기화된다. 모바일도 동일한 순서로 추가한다.
10단계. Caddy 서비스 등록
PowerShell 창에서 caddy.exe run으로 띄우면 그 창을 닫는 순간 Caddy가 종료되어 동기화가 끊긴다. Windows 서비스로 등록해서 백그라운드에서 항상 실행되도록 만든다.
cd C:\caddy
.\caddy.exe stop
.\caddy.exe install --config C:\caddy\Caddyfile
.\caddy.exe start
이제 PC를 재부팅해도 Caddy는 자동으로 다시 실행된다. CouchDB도 설치 시 기본적으로 Windows 서비스로 등록되어 있어 둘 다 백그라운드에서 영구적으로 동작한다.
11단계. 트러블슈팅
실제로 셋업할 때 만나게 되는 문제들과 해결법이다.
PowerShell curl 오류
증상: 매개 변수 이름 'X'과(와) 일치하는 매개 변수를 찾을 수 없습니다
해결: curl → curl.exe로 변경. PowerShell의 curl은 Invoke-WebRequest의 별칭이라 리눅스 curl과 문법이 완전히 다르다.
CouchDB 인증 실패
증상: {"error":"unauthorized"}
해결: Fauxton(http://localhost:5984/_utils)에서 직접 로그인을 시도해본다. 비밀번호에 특수문자가 있으면 작은따옴표로 감싼다.
SSL 인증서 발급 실패
확인할 것은 세 가지다.
- DNS A 레코드가 서버 공인 IP를 정확히 가리키는지
- 포트 80, 443이 외부에서 접근 가능한지
- Windows 방화벽에서 해당 포트가 허용되어 있는지
방화벽 규칙 추가:
netsh advfirewall firewall add rule name="Caddy HTTP" dir=in action=allow protocol=tcp localport=80
netsh advfirewall firewall add rule name="Caddy HTTPS" dir=in action=allow protocol=tcp localport=443
보안 권장사항: CouchDB 외부 접근 차단
CouchDB의 5984 포트는 외부에서 직접 접근하지 못하도록 명시적으로 차단한다. 모든 외부 트래픽은 Caddy 리버스 프록시(443)를 통해서만 들어오게 만든다.
netsh advfirewall firewall add rule name="Block CouchDB External" dir=in action=block protocol=tcp localport=5984 remoteip=any
netsh advfirewall firewall add rule name="Allow CouchDB Local" dir=in action=allow protocol=tcp localport=5984 remoteip=127.0.0.1
마무리
여기까지 따라왔다면 매월 $5~$10 구독료 없이 본인 서버에서 옵시디언 노트를 실시간으로 동기화하는 환경이 완성된 것이다. 데이터는 본인 서버에만 저장되고, SSL로 암호화된 채널로 전송되며, E2E 암호화로 한 번 더 보호된다.
이 가이드의 핵심은 세 가지 오픈소스를 조립하는 것이다. CouchDB(저장), Caddy(SSL·프록시), Self-hosted LiveSync(클라이언트). 각각은 단순하지만 조합하면 상용 서비스급의 동기화 환경이 된다.
다음 글에서는 이 환경을 더 안정적으로 운영하기 위한 백업 자동화, 모바일 동기화 최적화, 다중 볼트 분리 운영 같은 고급 주제를 다룬다.
