옵시디언(Obsidian)을 사용하다 보면 필연적으로 ‘기기 간 동기화’ 문제에 봉착하게 된다. 유료 서비스인 ‘Obsidian Sync’는 훌륭하지만 비용이 발생하고, iCloud나 구글 드라이브 같은 클라우드 스토리지는 리눅스 환경에서의 호환성 문제나 가끔 발생하는 충돌 이슈가 있다.

집이나 연구실에 **개인 워크스테이션(Linux Server)**이 있다면, 이를 중앙 Git 서버로 활용하여 데이터 주권을 100% 내가 가지는 동기화 환경을 구축할 수 있다.

이번 포스팅에서는 Git Bare Repository를 활용한 동기화 설정 방법과, 실제 진행 과정에서 겪었던 에러(Troubleshooting) 해결법, 그리고 자동 백업 스크립트까지 정리해 본다.


1. 전체 구조 및 준비물

  • Server (중앙 저장소): Linux Workstation (Ubuntu)
    • 역할: 데이터가 모이는 허브 (Bare Repository)
    • 경로 예시: /mnt/ssd/git/obsidian-vault.git
  • Client (작업 기기): MacBook Air (macOS)
    • 역할: 실제 옵시디언 필기 및 데이터 전송 (Push/Pull)
  • 연결 방식: SSH 프로토콜

2. 서버 설정 (Linux Workstation)

워크스테이션은 우리가 흔히 작업하는 공간이 아니라, Git 데이터베이스 역할만 수행해야 하므로 --bare 옵션을 사용하여 저장소를 만든다.

# 1. 저장소 폴더 생성
mkdir -p ~/git/obsidian-vault.git

# 2. 폴더 이동 후 Bare 저장소 초기화
cd ~/git/obsidian-vault.git
git init --bare

Note: Bare Repository란? 작업 디렉토리(실제 파일) 없이 Git의 변경 이력(History)만 저장하는 저장소다. 서버용으로 가볍고 충돌 위험이 적다.


3. 클라이언트 설정 (MacBook)

이제 로컬의 옵시디언 볼트를 워크스테이션과 연결한다.

# 옵시디언 폴더로 이동
cd ~/Obsidian

# Git 초기화
git init

# 전체 파일 스테이징 및 첫 커밋 (중요!)
git add .
git commit -m "Initial commit"

# 브랜치명을 main으로 강제 설정 (master/main 혼동 방지)
git branch -M main

# 워크스테이션을 원격 저장소(origin)로 등록
# 형식: ssh://[계정]@[IP주소]:[경로]
git remote add origin ssh://userid@serverip/obsidian-vault.git

# 서버로 전송 (Push)
git push -u origin main

4. 트러블슈팅 (시행착오)

설정 과정에서 몇 가지 에러가 발생했는데, 해결 방법은 다음과 같다.

상황 1: src refspec main does not match any

  • 원인: git commit을 한 번도 하지 않은 상태에서 push를 시도했거나, 로컬 브랜치 이름이 master인데 main으로 보내려 했을 때 발생한다.
  • 해결: 반드시 git commit을 먼저 수행하고, git branch -M main으로 브랜치 이름을 통일해 준다.

상황 2: fatal: remote origin already exists

  • 원인: 이미 origin이라는 이름으로 주소가 등록되어 있는 경우다.
  • 해결: remote add 대신 remote set-url을 사용한다.
git remote set-url origin ssh://계정@IP주소/경로

상황 3: 서버에서 git log 확인 시 에러

  • 원인: 서버는 기본적으로 master 브랜치를 찾는데, 클라이언트에서 main으로 보냈기 때문에 HEAD가 갈 곳을 잃은 경우다.
  • 해결: 서버의 HEAD가 main을 가리키도록 수정한다. (워크스테이션 터미널에서 실행)
git symbolic-ref HEAD refs/heads/main

5. 데이터 검증 (서버 확인)

서버 저장소가 Bare 모드라서 ls를 입력해도 파일이 보이지 않는다. 데이터가 잘 들어왔는지 확인하려면 다음 명령어를 사용한다.

# 저장된 파일 리스트 확인
git ls-tree -r main --name-only

# 최근 변경 내역 통계 확인
git log -1 --stat

6. 자동화 스크립트 작성

매번 터미널을 열어 git add, commit, push를 입력하는 것은 비효율적이다. 쉘 스크립트로 자동화했다.

(1) 클라이언트용: 원클릭 업로드 (sync_obsidian.sh)

맥북에서 실행하면 변경 사항을 감지하여 자동으로 워크스테이션에 백업한다.

#!/bin/bash
# 파일 위치: ~/sync_obsidian.sh

# 본인 경로로 수정
VAULT_PATH="/Obsidian" 

cd "$VAULT_PATH" || exit 1

if [ -n "$(git status --porcelain)" ]; then
    echo "[Info] 변경 사항 감지. 동기화 시작..."
    git add .
    TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
    git commit -m "Laptop Sync: $TIMESTAMP"
    
    echo "[Push] 워크스테이션으로 전송 중..."
    git push origin main
    
    echo "[Success] 완료: $TIMESTAMP"
else
    echo "[Info] 변경 사항 없음."
fi

(2) 서버용: 백업 파일 추출 (deploy.sh)

워크스테이션에서 백업된 내용을 실제 파일 형태로 꺼내보고 싶을 때 사용한다. git archive를 사용하면 .git 폴더 없이 깔끔하게 파일만 추출된다.

#!/bin/bash
# 파일 위치: ~/deploy_obsidian.sh

GIT_REPO="~/git/obsidian-vault.git"
DEPLOY_DIR="~/obsidian_view"

mkdir -p "$DEPLOY_DIR"

# main 브랜치의 내용을 타겟 폴더에 압축 해제
git --git-dir="$GIT_REPO" archive main | tar -x -C "$DEPLOY_DIR"

echo "배포 완료: $DEPLOY_DIR"

7. 마무리

이제 터미널에서 obsync (alias 설정) 명령어 하나만 입력하면 내 모든 연구 노트와 아이디어가 안전한 개인 서버로 백업된다.

추가 팁:

  1. SSH Key 설정: 비밀번호 입력 없이 스크립트를 실행하려면 ssh-keygenssh-copy-id를 통해 키 기반 인증을 설정하는 것이 필수적이다.
  2. .gitignore 설정: .obsidian/workspace 같은 설정 파일은 기기마다 화면 배치가 다르므로 동기화에서 제외하는 것이 좋다.

이로써 데이터 프라이버시를 지키면서도 강력한 버전 관리 기능을 가진 나만의 옵시디언 클라우드가 완성되었다.