1. 준비
Cloudflare 계정이 필요하다. 계정이 없다면 여기에서 생성할 수 있음.
2. GitHub에서 Quartz 저장소 생성
Quartz 템플릿으로 새로운 저장소 생성
Use this template → Create a new repository 클릭

3. Cloudflare와 GitHub 연동
Cloudflare 대시보드 접속 → Workers 및 Pages 클릭 → Pages 탭에서 GitHub 저장소 연결

- 프로젝트 이름 = 도메인 이름
- 프로덕션 브랜치 =
v4 - 프레임워크 미리 설정 = 없음
- 빌드 명령 =
npx quartz build - 출력 디렉토리 =
public

4. 옵시디언 노트 퍼블리싱
Flowershow 플러그인을 통해 .md 파일을 GitHub에 업로드 가능

📌 단, 이미지 파일은 업로드되지 않음 → 따로 처리 필요
📦 이미지 동기화 및 Flowershow 한계
Flowershow 플러그인을 통해 Markdown 파일은 GitHub에 업로드할 수 있지만, 다음과 같은 한계가 있음
| 문제 | 설명 |
|---|---|
| ❌ 이미지 자동 업로드 불가 | ![[Images/파일명.png]] 형식의 이미지가 GitHub에 푸시되지 않음 |
| ❌ 이미지 파일도 함께 삭제됨 | Obsidian에서 .md 파일 삭제 시 연동된 이미지도 함께 제거되는 문제 발생 |
| ❌ 업로드 경로 제어 불가 | 이미지 저장 위치 및 구조를 사용자 정의하기 어려움 |
🔁 선택한 대안: 파일 동기화 기반 Quartz 퍼블리싱
이러한 한계를 해결하기 위해 다음과 같은 전략을 사용했음
~/Coding/Obsidian/Blog폴더를 Obsidian 작성용 폴더로 지정~/Coding/Obsidian/SecondBrain/content를 Quartz 퍼블리싱용 content 폴더로 설정rsync명령어를 사용하여 Blog 폴더 전체를 content 폴더로 복사- 이미지 포함 모든 파일이 동기화되므로, 퍼블리싱 누락 없이 반영 가능
rsync -av --delete ~/Coding/Obsidian/Blog/ ~/Coding/Obsidian/SecondBrain/content/🚀 자동화 스크립트
sync-secondbrain.sh 파일을 만들어 아래처럼 자동화 가능:
#!/bin/bash
echo "🔄 동기화 시작..."
rsync -av --delete ~/Coding/Obsidian/Blog/ ~/Coding/Obsidian/SecondBrain/content/
echo "🔧 Quartz 빌드 중..."
cd ~/Coding/Obsidian/SecondBrain
npx quartz build
echo "📦 Git 푸시 중..."
git add .
git commit -m "📝 자동 동기화 및 빌드"
git push origin v4💡 결과
- ✅ 이미지 포함 완전 자동 퍼블리싱
- ✅ Cloudflare Pages 자동 배포
- ✅ Flowershow의 제약 극복
- ✅ 터미널에서
syncNote명령어 하나면 모든게 자동화
5. 퍼블리싱 세부 구성
5.1 Quartz 기본 구조
- Cloudflare는 GitHub push 감지 후
npx quartz build자동 실행 - 로컬에서 확인하려면 직접
npx quartz build실행 content/폴더에 Markdown 파일 정리content/index.md→ 홈 화면public/폴더는 자동 생성
5.2 이미지 처리 방식
- 이미지 파일은
content/Images/하위에 저장 npx quartz build시public/Images/로 자동 반영됨- Markdown에서는
![[Images/파일명.png]]형태로 삽입 - Flowershow는 이미지 push 불가 → 수동 복사 또는 자동화 필요 (추후 정리)
5.3 Cloudflare Pages 자동 배포
- GitHub push → Cloudflare에서 자동 빌드
- 퍼블리싱 주소: https://parkjaehan0623.pages.dev/
6. 💬 Giscus 댓글 시스템 적용
6.1 적용 절차
quartz/components/Giscus.tsx생성preact의FunctionalComponent로 작성quartz.config.ts에서afterBody에 Giscus 컴포넌트 추가
6.2 Giscus 컴포넌트 예시
// quartz/components/Giscus.tsx
import { FunctionalComponent, h } from "preact"
const Giscus: FunctionalComponent = () => (
<div style={{ marginTop: "3rem" }}>
<script
src="https://giscus.app/client.js"
data-repo="ParkJaeHan0623/SecondBrain"
...
async
></script>
</div>
)
export default Giscus6.3 quartz.config.ts 수정
import Giscus from "./quartz/components/Giscus"
Plugin.ContentPage({
afterBody: [Giscus], // ✅ 댓글 삽입 위치
}),7. 🛠 트러블슈팅
| 문제 | 해결 방법 |
|---|---|
react 타입 충돌 | react 제거 후 preact 사용 |
QuartzComponentConstructor 에러 | types.ts 삭제 후 FunctionalComponent로 대체 |
| 댓글 삽입 위치 조정 | afterBody에 연결 |
public/Images 삭제 | content/Images/에 유지하면 자동 생성됨 |
8. 🎉 퍼블리싱 결과 요약
- 도메인: https://parkjaehan0623.pages.dev/
- 댓글 시스템: 모든 페이지 하단에 Giscus 정상 작동
- 디자인: 깔끔한 SecondBrain 스타일 완성
9. 🛠 기타 트러블슈팅 & 배운 것
| 문제 | 해결 방법 |
|---|---|
react 관련 타입 충돌 | react 제거, preact의 FunctionalComponent로 대체 |
QuartzComponentConstructor 에러 | types.ts 삭제 후 Preact 방식 전환 |
| 댓글 위치 조정 | afterBody 위치로 컴포넌트 등록 |
| 빌드 시 public/Images 삭제됨 | content/Images/로 유지하면 문제 없음 |