개요

Obsidian을 웹에 게시하는 방법은 다양하게 있는데, 가장 쉬운 방법은 Obsidian publish를 월 8$ 주고 사용하는 것이다. 이 방법은 원클릭으로 글을 게시할 수 있으며, 커스텀 도메인도 DNS 설정 하나만 해주면 모든게 자동으로 진행되어 매우 편하다는 장점이 있다. 하지만 커스터마이징이 제한되고, 월 8$라는 금액이 싸지는 않다. 나는 Obsidian sync(4$)를 사용중인데(커스텀 싱크는 불안정하다고 생각), 여기에 굳이 8$를 추가로 태우고싶지가 않았다.

이 글에서는 내가 사용한 방법을 공유하려한다. Obsidian Sync는 사용해도 되고 사용하지 않아도 되지만, 게시용 컴퓨터(홈서버면 더 좋음)가 하나 필요하다. 싸이트 자체는 GitHub Pages를 사용하여 게시할 것이므로 홈서버가 24시간 돌고있을 필요는 없지만, 글을 쓸 때마다 홈서버를 켜야하는 번거로움이 있을 것이다. 개인PC여도 스크립트 실행만 해주면 되니 상관은 없다.

이 블로그는 Obsidian + Sync, Quartz, 그리고 항상 켜져 있는 PC(놀고 있는 PC)를 조합하여 구축 및 배포가 자동화되어있다. 어디서든 Obsidian으로 글을 작성하고 동기화하면, 별도의 PC에서 자동으로 빌드 및 배포 과정이 진행되는 구조이다. 이를 통해 사용자는 글 작성에만 집중할 수 있다.

글 작성 및 동기화: Obsidian과 Obsidian Sync

모든 글은 Obsidian에서 작성되며, 자동으로 Markdown형식으로 저장된다. PC, 모바일 등 Obsidian 클라이언트가 지원하는 어떤 기기에서든 글을 작성하거나 수정할 수 있다.

Obsidian의 공식 유료 서비스인 Obsidian Sync를 사용하여 모든 기기의 노트가 실시간으로 동기화된다. 이 때, 글을 GitHub Pages에 올리는 용도인 홈서버에도 노트가 동기화된다. 이것이 이 시스템의 핵심인데, 로컬 파일이 아닌 Obsidian 서버를 단일 진실 공급원(Single Source of Truth)으로 사용한다. 만약 Obsidian을 PC에서만 사용한다면, PC의 Obsidian Valut가 SSOT가 된다.

Obsidian Sync를 사용하지 않아도 구축 자체는 가능하다. Git 등으로 자체 싱크를 하던, 개인PC에서만 쓰던, 게시할 폴더를 골라 GitHub에 올리는 부분만 자동화하면 되기 때문이다.

자동 빌드 환경: 놀고 있는 PC

집에 항상 켜져 있는 PC(홈 서버 또는 데스크톱)가 이 역할을 담당한다. 홈서버가 없다면 개인PC에도 구축이 가능하다. 이 PC에도 Obsidian 앱이 설치되어 있으며, 동일한 Obsidian 계정으로 로그인하여 노트를 동기화한다.

홈서버에는 리눅스를 설치했는데, 여기에서 inotify-tools를 사용하여 Obsidian 볼트 디렉토리의 파일 변경을 실시간으로 감지한다. 파일 변경이 감지되면, 자동으로 빌드 및 배포 과정을 시작한다. 자동 배포가 불필요하면 이 부분은 스킵해도 상관없으나, 직접 PC에서 아래의 배포를 실행해야한다.

빌드 및 배포 자동화: Quartz와 셸 스크립트

우선 배포를 위해서는 Obsidian 볼트가 아닌, 별도의 새 프로젝트 폴더를 만들어야한다. Obsidian 볼트는 건드리지 않고 모든 배포작업은 프로젝트폴더에서 진행된다.

Quartz는 정적 웹 싸이트 빌더 중 하나인데, Obsidian 을 게시하는 것에 최적화된 프로그램이다. 그래프도 그려주며, 로컬에서 빌드도 가능하다.

Obsidian 볼트 내 배포할 폴더의 파일 변경 감지시 아래 동작을 수행한다.

  • 콘텐츠 동기화: Obsidian 볼트의 최신 내용을 프로젝트의 content 디렉토리로 복사(rsync).
  • 사이트 빌드: Quartz CLI(npx quartz build)를 사용하여 마크다운 파일을 정적 웹사이트 파일로 변환하고 public 디렉토리에 빌드.
  • Git 푸시: 변경 사항이 있을 경우, Git을 사용하여 자동으로 커밋하고 원격 저장소(GitHub)로 푸시.

Obsidian 글을 직접 건드리지 않고, 배포용 폴더로 복사한 후 이 폴더 내 컨텐츠를 가공하여 배포하기 때문에, 기존 글들은 안전하다. 또한, Obsidian 볼트 전체를 배포하는게 아닌, 배포용 폴더를 선택할 수 있다. 해당 폴더만 배포용 폴더로 배포하기 때문이다.

여기서 폴더 내 컨텐츠 가공이라는 말은, 복사 후 컨텐츠에 자동화로 살을 붙이거나 번역 복사본을 추가로 생성한다는 뜻이다. 이 싸이트의 경우, 복사 후 자동으로 3개국어로 Gemini가 번역 복사본을 생성한다. 복사 후 생성이기 때문에 기존 Obsidian 볼트에는 불필요한 번역본이 보이지 않으며, 실제 파일을 “생성” 후 배포하기 때문에 해당 언어로도 외부에서 검색할 수 있다.

최종 배포: GitHub Pages 및 커스텀 도메인 연결

메인 브랜치에 새로운 커밋이 푸시되면, 미리 설정된 GitHub Actions 워크플로우가 트리거된다. 이 워크플로우는 public 디렉토리의 정적 파일들을 GitHub Pages로 배포한다.

필요시 빌드를 PC(서버)가 아닌 GitHub Pages에서 할 수도 있겠으나, 이 경우 빌드 시간도 걸릴 것이고 로컬에서 웹싸이트를 테스트 하기가 번거롭다. 그래서 나는 PC(서버)에서 미리 빌드를 하고 완성된 페이지만 업로드하는 것을 선택했다.

GitHub Pages 설정

실제 배포는 GitHub GitHub Pages를 통해 게시된다. 따라서 Pages 설정도 해줘야한다. GitHub 저장소 설정의 “Pages” 섹션에서 GitHub Pages를 설정할 수 있다. “Source”를 “Deploy from a branch”로 설정하고, “Branch”를 gh-pages (또는 main 브랜저의 docs 폴더)로 선택한 후 /(root) 폴더를 선택한다. 저장하면 GitHub Pages가 활성화된다.

만약 본인이 구입한 Custom domain이 있다면 같이 설정해준다.

결론

이 시스템을 통해 사용자는 글 작성에만 집중할 수 있게 된다. Obsidian에 글을 쓰고 저장하는 것만으로 복잡한 빌드 및 배포 과정이 자동으로 처리된다. Obsidian Sync를 중앙 허브로 사용하고, 놀고 있는 PC를 자동화 에이전트로 활용하는 것이 이 구조의 핵심 아이디어이다. 놀고있는 PC가 없다면 본인 PC에서 배포 스크립트를 한 번만 실행해주면 자동으로 “Obsidian Vault Copy to Content directory Process contents Upload(push) Publish”가 이루어진다.

추가

이 모든 과정을 직접 코딩하지는 않았고 Codex, Claude Code, Gemini의 도움을 받아서 개발했다. 개인적으로 Gemini는 아직 로컬에서 코딩 작업을 프로젝트단위로 시키기에 적합하지 않다는 생각이 들어서 번역 용도로만 쓰고 있다(3.0모델을 기대하는 중). Codex나 CC에게 현재 본인의 환경(홈서버 여부 등)과 함께 위 내용을 정리하여 싸이트를 구축해달라고 하면 잘 해줄 것이다. 따라서 본문에는 스크립트 코드 등은 포함하지 않았다. 아이디어를 공유드리니 본인의 환경에 맞추어 잘 튜닝하길 바란다.