Obsidian을 사용하다 보면 로컬 PC에서 작성한 문서를 서버에서도 활용하고 싶을 때가 있다.
특히 서버에서 Claude Code나 Hermes 같은 AI Agent를 사용한다면, 로컬에서 정리한 Markdown 문서를 서버에서도 바로 읽을 수 있으면 꽤 편하다.
내가 원했던 구조는 단순했다.
Obsidian
↓
Local Vault
↓
Private Git Repository
↓
Server
Obsidian 전용 Sync 기능을 사용하는 방법도 있지만, 이미 Markdown 파일로 관리되고 있기 때문에 Git을 이용해서 직접 동기화하기로 했다.
1. Obsidian Vault 준비
Obsidian의 실질적인 데이터는 그냥 폴더 안의 Markdown 파일이다.
내 경우에는 Vault를 별도의 경로에 두고 관리했다.
예를 들면 다음과 같다.
ObsidianVault
├── 00_Inbox
├── 01_Work
├── 02_Dev
├── 03_Knowledge
├── 90_Templates
├── 98_Attachments
└── 99_Archive
Obsidian 프로그램 자체가 어디에 설치되어 있는지는 크게 중요하지 않다.
중요한 것은 Vault 경로다.
Vault 전체를 하나의 Git Repository로 관리하면 된다.
2. Vault를 Git Repository로 만들기
Vault 폴더로 이동한다.
cd ~/Documents/ObsidianVault
Git Repository를 초기화한다.
git init
git branch -M main
Obsidian에서 생성하는 일부 설정이나 불필요한 파일은 .gitignore에 추가한다.
이후 최초 커밋을 생성한다.
git add .
git commit -m "Initial Obsidian vault"
Private GitHub 또는 GitLab Repository를 만들고 연결한다.
git remote add origin <PRIVATE_REPOSITORY_URL>
git push -u origin main
이제 Obsidian Vault가 하나의 Git Repository가 된다.
3. 서버에서 Vault Clone
서버에서는 Repository를 Clone한다.
서버에서 사용할 경로는 다음과 같이 정했다.
~/obsidian-vault
Clone한다.
cd ~
git clone <PRIVATE_REPOSITORY_URL> obsidian-vault
정상적으로 연결되었는지 확인한다.
cd ~/obsidian-vault
git status
git remote -v
이제 구조가 다음과 같이 된다.
Local PC
└── Obsidian Vault
│
│ push
▼
Private Git Repository
▲
│ pull
│
Server
└── ~/obsidian-vault
Obsidian에서 작성한 Markdown 문서를 서버에서도 그대로 읽을 수 있다.
4. 서버 인증은 SSH Key 사용
서버에서 매번 Git 인증을 하는 것은 귀찮기 때문에 SSH Key를 사용하는 방식으로 구성했다.
서버에서 Key를 만든다.
ssh-keygen -t ed25519
Public Key를 확인한다.
cat ~/.ssh/id_ed25519.pub
해당 Key를 GitHub 또는 GitLab에 등록하면 서버에서 별도의 비밀번호 입력 없이 Repository를 사용할 수 있다.
서버가 특정 Repository만 접근하면 된다면 개인 계정 전체 권한을 주기보다는 Repository 전용 Deploy Key나 최소 권한 Key를 사용하는 편이 안전하다.
5. 실제 동기화 방법
가장 중요한 부분이다.
서버에서 파일을 수정하기 전에 먼저 최신 내용을 가져온다.
git pull --rebase
이후 Markdown 문서를 읽거나 수정한다.
작업이 끝났다면 변경 사항을 확인한다.
git diff
변경된 내용을 추가한다.
git add .
커밋한다.
git commit -m "Hermes: update notes"
마지막으로 Push한다.
git push
결국 서버에서의 기본 작업 순서는 다음과 같다.
git pull --rebase
↓ 작업
git diff
git add .
git commit
git push
단순하지만 이 순서를 지키는 것이 중요하다.
6. 동기화 스크립트 만들기
매번 명령어를 입력하기 귀찮기 때문에 서버에는 간단한 동기화 스크립트도 만들었다.
~/bin/obsidian-sync.sh
사용 방법은 다음과 같이 만들었다.
~/bin/obsidian-sync.sh "Hermes: add inbox memo"
스크립트에서는 대략 다음 순서로 처리한다.
git pull --rebase
↓
변경 파일 확인
↓
git add .
↓
변경된 내용이 있을 경우 commit
↓
git push
변경 사항이 없는데 불필요한 Commit을 생성하지 않는 것도 중요하다.
이렇게 만들어두면 서버의 Agent가 Markdown 문서를 추가하거나 수정한 뒤 하나의 명령으로 Repository에 반영할 수 있다.
7. Git을 선택한 이유
처음에는 단순히 PC와 서버의 폴더만 동기화하면 되지 않을까 생각했다.
하지만 Obsidian은 결국 Markdown 문서 모음이기 때문에 Git과 궁합이 상당히 좋았다.
가장 큰 장점은 변경 이력이 남는다는 것이다.
Obsidian 수정
→ Commit
→ 서버에서 Pull
→ 서버에서 수정
→ Commit
→ Obsidian에서 Pull
누가 어떤 파일을 변경했는지 확인할 수 있고 문제가 생기면 이전 내용도 확인할 수 있다.
특히 AI Agent에게 Markdown 파일을 수정하게 할 생각이라면 변경 이력이 남는다는 점이 꽤 중요하다.
8. 충돌은 조심해야 한다
단점도 있다.
로컬 Obsidian과 서버에서 같은 Markdown 파일을 동시에 수정하면 Git Conflict가 발생할 수 있다.
그래서 기본적으로 다음 원칙으로 사용하기로 했다.
작업 전 : git pull --rebase
작업 후 : git push
그리고 Conflict가 발생했을 때 Agent가 임의로 다음과 같은 명령을 실행하도록 만들지는 않았다.
git reset --hard
git push --force
git checkout --theirs
git checkout --ours
Obsidian에는 직접 작성한 문서가 들어 있기 때문에 자동으로 Conflict를 해결하다가 문서가 날아가는 것보다는 사람이 확인하는 편이 낫다고 판단했다.
마무리
최종적으로 구성한 환경은 다음과 같다.
┌───────────────┐
│ Obsidian │
│ Local Vault │
└───────┬───────┘
│
Git Push
│
▼
┌───────────────┐
│ Private Git │
│ Repository │
└───────┬───────┘
│
Git Pull
│
▼
┌───────────────┐
│ Server │
│obsidian-vault │
└───────┬───────┘
│
▼
Claude / Hermes
처음에는 단순히 Obsidian 메모를 서버에서도 보고 싶어서 시작한 구성이었다.
그런데 이렇게 만들어놓고 보니 단순한 메모 동기화를 넘어 내가 작성한 문서를 AI Agent가 읽고 수정할 수 있는 개인 Knowledge Base에 가까워졌다.
Obsidian은 Markdown을 작성하는 인터페이스가 되고, Git은 변경 이력과 동기화를 담당하고, 서버의 Agent는 그 문서를 활용하는 구조다.
아직은 단순한 Git 기반 동기화지만 앞으로는 서버에서 생성한 결과를 00_Inbox 같은 폴더에 자동으로 넣거나, AI와 나눈 내용을 자동으로 정리해서 Obsidian에 쌓는 방식까지 확장해볼 수 있을 것 같다.