저는 개발자가 아닙니다.
그런데 요즘 이상하게 자꾸 서버를 만지고 있습니다. 워드프레스도 직접 서버에 올리고, 사진 백업용 Immich도 붙이고, 이제는 Obsidian 노트 동기화까지 직접 해보게 됐습니다.
이번 목표는 단순했습니다.
Obsidian Sync 구독료를 아껴보자.
Obsidian 자체는 정말 좋은데, 여러 기기에서 동기화하려면 Obsidian Sync 구독을 써야 합니다. 저는 이미 iPhone에서 Obsidian Sync를 쓰고 있었고, 결제도 되어 있었습니다. 그런데 이걸 집에 있는 리눅스 노트북 서버로 대체할 수 있다면?
해보자는 마음으로 시작했습니다. 결론부터 말하면 성공했습니다.
아래에서 설명하는 디테일들은 일일히 제가 설계한 것들이 아닙니다. 전 그냥 단지 구독료를 아끼기 위한 방법이 없을까? 를 착안해서 ai에게 요청했고 제가 가진 소스들을 알려줬습니다. 텔레그램으로 연동한 HERMES AGENTS 를 이용해서 말이죠 (헤르메스 에이전트는 집 구석에 쳐박혀 있던 구형 NAS와 구형 맥북을 이용해서 설치했습니다. 그리고 CODEX 를 달아줬죠. 이 부분은 나중에 포스팅할 계획입니다.)
현재 구조는 이렇게 됐습니다.
iPhone Obsidian
↕
Tailscale
↕
Linux 노트북 CouchDB 서버
↕
Linux Obsidian vault
즉, Obsidian Sync 대신 Self-hosted LiveSync + CouchDB + Tailscale 조합으로 동기화하는 방식입니다.
이번 작업의 목표
기존에는 이런 상태였습니다.
iPhone Obsidian
↕
Obsidian Sync 유료 서비스
↕
Linux Obsidian
이걸 아래처럼 바꾸는 게 목표였습니다.
iPhone Obsidian
↕
내가 운영하는 CouchDB 서버
↕
Linux Obsidian
왜 이렇게 하냐면, Obsidian Sync는 편하지만 유료입니다. 물론 편한 값은 충분히 합니다. 하지만 저는 이미 리눅스 노트북을 서버처럼 쓰고 있었고, Tailscale도 사용할 수 있는 상황이었습니다.
준비물
- 오래된 맥북프로에 Linux Mint 설치
- Obsidian Linux 버전 설치
- CouchDB Docker 컨테이너
- Obsidian Self-hosted LiveSync 플러그인
- iPhone Obsidian
- Tailscale
서버 역할을 하는 리눅스 노트북은 집에 있는 구형 맥북입니다. 성능이 좋은 서버는 아니지만, Obsidian 노트 동기화 정도는 충분했습니다.
Step 1. Obsidian 설치 확인
먼저 리눅스에 Obsidian이 제대로 설치되어 있는지 확인했습니다.
which obsidian
결과는 정상.
/usr/bin/obsidian
공식 .deb 패키지로 설치되어 있었고, Flatpak이나 Snap은 쓰지 않았습니다. 오래된 노트북이라 가급적 가볍게 가는 게 목표였습니다.
Step 2. CouchDB 서버 준비
Self-hosted LiveSync는 원격 저장소로 CouchDB를 사용합니다. 저는 Docker Compose로 CouchDB를 띄웠습니다. 대략 이런 구조입니다.
services:
couchdb-obsidian:
image: docker.io/oleduc/docker-obsidian-livesync-couchdb:master
container_name: couchdb-obsidian
restart: unless-stopped
environment:
SERVER_DOMAIN: 서버주소
COUCHDB_USER: 사용자명
COUCHDB_PASSWORD: 비밀번호
COUCHDB_DATABASE: obsidian
ports:
- "5984:5984"
volumes:
- ./data:/opt/couchdb/data
주의할 점은 비밀번호입니다. 이 값은 나중에 iPhone에서 LiveSync 설정할 때도 똑같이 넣어야 합니다. 그리고 블로그에는 절대 그대로 적으면 안 됩니다.
Step 3. 처음 만든 vault 위치가 틀렸다
처음에는 vault를 ~/minhanee로 만들려고 했습니다. 그런데 나중에 확인해보니 Obsidian Sync가 실제로 노트를 내려받은 위치는 ~/Documents/minhanee였습니다.
이게 첫 번째 삽질이었습니다. 처음 만든 ~/minhanee는 사실상 빈 vault였고, 진짜 노트 337개가 들어 있는 vault는 ~/Documents/minhanee였습니다.
Step 4. 기존 Obsidian Sync 내용을 먼저 Linux로 내려받기
Self-hosted LiveSync로 옮기기 전에, 기존 Obsidian Sync에 있던 노트를 Linux에 먼저 내려받아야 합니다.
- Linux Obsidian 실행
- Obsidian 계정 로그인
- 기존 Obsidian Sync remote vault 선택
- 로컬 vault로 다운로드
- 노트가 전부 내려왔는지 확인
이 단계가 끝나기 전에는 LiveSync를 켜면 안 됩니다. 빈 vault가 먼저 서버로 올라가면 기존 노트가 꼬일 수 있기 때문입니다.
Step 5. 백업부터 만들기
마이그레이션 전에 백업을 만들었습니다.
mkdir -p ~/obsidian-migration-backups
tar -czf ~/obsidian-migration-backups/minhanee-before-livesync.tar.gz -C ~/Documents minhanee
백업은 정말 중요합니다. 동기화 작업은 잘못 누르면 방향이 반대로 갈 수 있습니다.
Step 6. Obsidian Sync 끄기
이제 기존 Obsidian Sync와 Self-hosted LiveSync가 동시에 켜지지 않도록 했습니다.
Obsidian Sync + LiveSync 동시 사용 = 비추천
둘 중 하나만 써야 합니다. 이번 목표는 구독료를 줄이는 것이므로, Obsidian Sync는 끄고 Self-hosted LiveSync로 전환했습니다.
Step 7. Self-hosted LiveSync 플러그인 설치
LiveSync 플러그인은 GitHub 릴리즈에서 직접 파일을 받아 vault에 넣었습니다.
~/Documents/minhanee/.obsidian/plugins/obsidian-livesync
필요한 파일은 main.js, manifest.json, styles.css 세 개였습니다.
Step 8. Linux에서 CouchDB로 최초 업로드
여기서 제일 긴장되는 화면이 나왔습니다.
Overwrite Server Data with This Device’s Files
처음 보면 무섭습니다. 하지만 이 상황에서는 맞는 선택이었습니다. Linux vault에 기존 Obsidian Sync에서 내려받은 최신 노트 337개가 있었고, CouchDB 서버는 이제 새로 사용할 저장소였기 때문입니다.
Linux Obsidian vault → CouchDB 서버
진행 후 CouchDB 상태를 확인했습니다.
doc_count: 3144
LiveSync는 파일 하나당 문서 하나만 만드는 구조가 아니라 chunk와 metadata를 함께 저장합니다. 그래서 노트 337개보다 CouchDB 문서 수가 훨씬 많게 나옵니다. 이건 정상입니다.
Step 9. Tailscale로 iPhone 접속 준비
집 안에서만 쓸 거면 내부 IP로도 됩니다. 하지만 iPhone은 밖에서도 써야 합니다. 그래서 Tailscale을 사용했습니다.
Tailscale을 쓰면 공유기 포트포워딩이나 도메인, SSL 설정 없이도 내 기기끼리 안전하게 연결할 수 있습니다.
iPhone Safari에서 CouchDB 주소에 접속해봤습니다.
http://Tailscale-IP:5984
결과는 이랬습니다.
{
"error": "unauthorized",
"reason": "Authentication required."
}
이건 성공입니다. 서버에 도달했고, 인증이 필요하다는 뜻입니다.
Step 10. iPhone에서 새 vault 만들기
기존 iPhone Obsidian Sync vault를 바로 건드리지 않았습니다. 새 vault를 만들었습니다.
minhanee-livesync
기존 vault를 바로 바꾸면 문제가 생겼을 때 되돌리기 어렵습니다. 새 vault로 서버 데이터를 받아보고, 정상 동기화가 확인되면 그때부터 새 vault를 메인으로 쓰는 게 안전합니다.
Step 11. iPhone에 Self-hosted LiveSync 설치
iPhone Obsidian에서 Community Plugin을 켜고 Self-hosted LiveSync를 설치했습니다.
설정 마법사에서는 꼭 이걸 선택해야 합니다.
기존 동기화 구성에 장치를 추가합니다
누르면 안 되는 건 이겁니다.
처음으로 설정합니다
iPhone은 빈 vault이기 때문에, 처음으로 설정한다고 하면 빈 vault 기준으로 서버를 덮어쓸 위험이 있습니다.
Step 12. iPhone LiveSync 설정값 입력
iPhone에서는 CouchDB 정보를 수동으로 입력했습니다.
URL: http://Tailscale-IP:5984 Database: obsidian Username: CouchDB 사용자명 Password: CouchDB 비밀번호
그리고 E2E 암호화도 Linux와 동일하게 맞췄습니다.
End-to-End Encryption: 켜기 Passphrase: Linux와 동일한 값 Obfuscate Properties: 끄기
여기서 passphrase가 한 글자라도 다르면 안 됩니다. 서버에는 데이터가 있어도 iPhone에서 제대로 해석하지 못할 수 있습니다.
Step 13. 서버에서 iPhone으로 내려받기
iPhone은 빈 vault입니다. 그래서 방향은 반드시 이렇게 가야 합니다.
CouchDB 서버 → iPhone
주의할 문구는 이런 것들입니다.
Overwrite Server Rebuild server Send this device's files Upload local to server
이런 문구가 나오면 멈춰야 합니다. iPhone의 빈 vault로 서버를 덮어쓸 수 있기 때문입니다.
Step 14. 드디어 iPhone 동기화 성공
iPhone에서 새 테스트 노트를 만들었습니다.
테스트용.md
내용은 간단했습니다.
동기화 테스트용 입니다
처음에는 Linux에 바로 안 보여서 살짝 불안했습니다. 조금 더 기다리고 iPhone에서 동기화가 진행된 뒤 다시 확인했습니다.
doc_count: 3144 → 3148
그리고 Linux vault에도 파일이 생겼습니다.
~/Documents/minhanee/테스트용.md
이 순간 성공이었습니다.
iPhone → Tailscale → CouchDB → Linux
최종 구조
iPhone Obsidian
↕
Tailscale
↕
Linux 노트북 CouchDB
↕
Linux Obsidian vault
Linux vault 위치는 다음입니다.
~/Documents/minhanee
앞으로 사용하는 방법
평소에는 어렵지 않습니다. Linux에서 Obsidian을 쓰면 자동으로 동기화됩니다. iPhone에서 쓸 때는 Tailscale이 켜져 있어야 합니다.
- iPhone에서 Tailscale 켜기
- Obsidian 열기
- 노트 작성
- LiveSync가 자동 동기화
주의할 점
첫 번째, Obsidian Sync와 LiveSync를 동시에 쓰지 않습니다.
같은 vault에서 Obsidian Sync + LiveSync 동시 사용 금지
두 번째, Linux 노트북이 꺼져 있으면 iPhone 동기화도 안 됩니다. CouchDB 서버가 Linux 노트북에 있기 때문입니다.
Linux 노트북 꺼짐 → CouchDB 꺼짐 → iPhone 동기화 안 됨
다만 iPhone에서 노트 작성 자체는 가능합니다. 나중에 Linux 노트북이 켜지고 Tailscale이 연결되면 동기화됩니다.
비용
이번 작업의 추가 비용은 거의 없었습니다.
- Obsidian: 무료
- Self-hosted LiveSync: 무료
- CouchDB: 무료
- Tailscale 개인 사용: 무료 범위
- Linux 노트북: 기존 장비 사용
즉, 새로 매달 내는 돈은 없습니다. 다만 전기세와 관리 비용은 있습니다. 서버를 내가 운영하는 대신, 내가 책임져야 합니다.
이번 작업에서 배운 점
가장 중요한 건 동기화 방향이었습니다.
어느 쪽이 진짜 원본인가?
이번에는 Linux vault가 원본이었습니다. 그래서 최초 업로드 방향은 이랬습니다.
Linux → CouchDB
iPhone은 새 장치였기 때문에 방향이 이랬습니다.
CouchDB → iPhone
이 방향만 잘 지키면 됩니다. 반대로 누르면 사고가 납니다.
결론
Obsidian Sync는 편합니다. 솔직히 편한 값은 합니다. 하지만 이미 집에 켜둘 수 있는 리눅스 장비가 있고, Tailscale을 쓸 수 있다면 Self-hosted LiveSync도 충분히 쓸 만합니다.
이번 작업으로 저는 Obsidian Sync 없이도 iPhone과 Linux 사이에 노트 동기화를 성공시켰습니다.
물론 기존 Obsidian Sync 결제가 9월 9일까지 남아 있어서 바로 돈이 아껴지는 건 아닙니다. 애석합니다.
그래도 이제 자동 갱신만 꺼두면 됩니다. 그때부터는 제 서버가 Obsidian Sync 역할을 대신하게 됩니다.
비개발자가 여기까지 왔습니다.
늘 그렇듯 이번에도 혼자 한 건 아니고, AI한테 계속 물어보면서 했습니다. 버튼 하나 누를 때도 “이거 눌러도 됨?” 하고 물어봤습니다.
근데 됐습니다.
이게 요즘 제가 말하는 바이브코딩입니다.