This post is written in Korean. Most browsers (Chrome, Edge) can translate it automatically — look for a translate icon in the address bar, or right-click the page and choose “Translate to English.”
셀프호스팅 구축기 13편. 블로그를 내 서버에 올렸으면, 메모도 내 서버에 둘 수 있다.
← 이전 편: 12편 — 새벽마다 NAS로 (tar+ssh 백업)
→ 다음 편: 14편 — 손 안 가는 서버 (cron 자동화)
요약
- Obsidian 공식 싱크는 월정액 — 노트를 내 서버 데이터베이스에 직접 동기화하면 비용 0원 + 데이터 주권
- 방법: Self-hosted LiveSync 플러그인 ↔ CouchDB(도커 컨테이너) 실시간 양방향
- CouchDB는 반드시
127.0.0.1에만 묶는다 — 도커가 자동으로0.0.0.0에 여는 함정을 조심 - 내 기기들만 닿게: 사설 네트워크(VPN 메시) 안에서만 접근, 인터넷에는 비공개
- 삽질 일지:
ERR_SSL_PROTOCOL_ERROR의 범인은 인증서가 아니라 “뒤에 서버가 안 떠 있던 것”
1. 왜 공식 싱크 대신 셀프호스트인가
Obsidian(옵시디언)은 노트 앱이고, 여러 기기에서 같은 노트를 보려면 동기화가 필요하다. 공식 Sync는 잘 되지만 월정액이다. 그리고 내 메모가 남의 서버를 거친다.
이미 블로그용 서버가 굴러가고 있으니, 노트 동기화도 거기 얹으면 된다.
| 항목 | 공식 Sync | Self-hosted LiveSync |
|---|---|---|
| 비용 | 월정액 | 0원 (내 서버) |
| 데이터 위치 | 회사 서버 | 내 서버 |
| 설정 난이도 | 켜면 끝 | 직접 구성 필요 |
| 동기화 | 빠름 | 실시간 양방향 |
대가는 “직접 구성”이다. 한 번 세우면 그 뒤로는 공식만큼 매끄럽다.
2. 구조 — 플러그인 ↔ CouchDB
CouchDB(카우치DB)는 변경분을 실시간으로 주고받는 데 강한 데이터베이스다. LiveSync 플러그인이 노트가 바뀔 때마다 CouchDB로 보내고, 다른 기기는 그걸 당겨 온다.
3. 절대 0.0.0.0에 열지 마라
여기가 가장 중요하다. CouchDB를 도커로 그냥 띄우면 포트가 0.0.0.0(모든 네트워크 인터페이스)에 열린다. 이러면 같은 와이파이의 다른 기기, 심지어 잘못 설정된 공유기 너머까지 내 데이터베이스가 노출된다.
ports:
- "5984:5984" # 위험: 0.0.0.0, 모든 인터페이스에 노출
- "127.0.0.1:5984:5984" # 안전: 내 컴퓨터 자신만 접근
127.0.0.1에만 묶으면 서버 바깥에서는 보이지 않는다. 그럼 폰은 어떻게 접속하냐고? 사설 네트워크(VPN 메시) 안에서만 닿게 한다. 내 기기들끼리만 연결된 가상 LAN을 만들고, CouchDB는 그 안에서만 https로 노출한다. 인터넷 전체에는 끝까지 비공개다.
4. 삽질 일지 — ERR_SSL_PROTOCOL_ERROR
설정을 마치고 https 주소로 접속했더니 브라우저가 ERR_SSL_PROTOCOL_ERROR를 뱉었다. 당연히 인증서 문제인 줄 알고 인증서만 한참 들여다봤다. 아니었다.
진짜 원인은 단순했다. CouchDB 컨테이너 자체가 안 떠 있었다. https 주소(앞단)는 만들어 놨는데 그 뒤에서 받아 줄 서버가 없으니, TLS 연결이 끝까지 맺어지지 못하고 브라우저가 “SSL 오류”로 보고한 것이다.
교훈: “SSL 에러”가 항상 인증서 문제는 아니다. 앞단(주소·인증서)과 뒷단(실제 서버)을 나눠서, 뒷단이 살아 있는지부터 확인하자. curl로 백엔드 포트를 직접 찔러 보면 5초 만에 갈린다.
한 줄 정리
노트 동기화도 내 서버로 가져올 수 있다 — LiveSync 플러그인 + CouchDB면 구독료 0원. 단, CouchDB는 127.0.0.1에만 묶고 사설 네트워크로만 접근. 그리고 ERR_SSL_PROTOCOL_ERROR를 만나면 인증서보다 뒷단 서버가 살아 있는지를 먼저 의심하자.

답글 남기기