Sveltia CMS 구현 계획서
Sveltia CMS 구현 계획서
개요
Jekyll 블로그에 서버 없이 웹 UI 글쓰기 기능을 추가합니다.
- 솔루션: Sveltia CMS
- 인증 방식: GitHub OAuth (Cloudflare Worker 사용)
- 서버 비용: $0 (완전 무료)
- 호스팅: GitHub Pages (기존 유지)
아키텍처
┌─────────────────────────────────────────────────────────────────┐
│ 사용자 브라우저 │
│ ┌─────────────┐ ┌─────────────────────────────────────┐ │
│ │ 블로그 메인 │ │ /admin/ (Sveltia CMS) │ │
│ │ (Jekyll) │ │ - 글 목록 보기 │ │
│ │ │ ──→ │ - 새 글 작성 (WYSIWYG) │ │
│ │ │ │ - 이미지 업로드 │ │
│ └─────────────┘ │ - 저장 → GitHub 자동 커밋 │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Cloudflare Worker (무료) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ sveltia-cms-auth │ │
│ │ - GitHub OAuth 핸드셰이크 처리 │ │
│ │ - Client Secret 안전하게 보관 │ │
│ │ - Access Token 발급 │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ GitHub │
│ ┌─────────────┐ ┌─────────────────────────────────────┐ │
│ │ OAuth App │ │ JunggiKim.github.io Repository │ │
│ │ │ │ - _posts/ (블로그 글) │ │
│ │ │ │ - assets/images/ (이미지) │ │
│ └─────────────┘ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
구현 단계
Phase 1: GitHub OAuth App 생성
위치: GitHub Settings → Developer settings → OAuth Apps
설정값:
Application name: JunggiKim Blog CMS
Homepage URL: https://junggikim.github.io
Authorization callback URL: https://[WORKER_NAME].workers.dev/callback
결과물:
- Client ID
- Client Secret
Phase 2: Cloudflare Worker 배포
방법: sveltia-cms-auth 원클릭 배포
URL: https://github.com/sveltia/sveltia-cms-auth
환경 변수 설정:
GITHUB_CLIENT_ID=<GitHub OAuth Client ID>
GITHUB_CLIENT_SECRET=<GitHub OAuth Client Secret>
결과물:
- Worker URL:
https://[WORKER_NAME].workers.dev
Phase 3: Jekyll 블로그에 Admin 페이지 추가
3.1 폴더 구조
JunggiKim.github.io/
├── admin/
│ ├── index.html # Sveltia CMS 로드
│ └── config.yml # CMS 설정
├── _posts/
├── assets/
│ └── images/
│ └── uploads/ # 업로드 이미지 저장
└── ...
3.2 admin/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="noindex" />
<title>Content Manager</title>
<link href="https://unpkg.com/@sveltia/cms/dist/sveltia-cms.css" rel="stylesheet" />
</head>
<body>
<script src="https://unpkg.com/@sveltia/cms/dist/sveltia-cms.js" type="module"></script>
</body>
</html>
3.3 admin/config.yml
backend:
name: github
repo: JunggiKim/JunggiKim.github.io
branch: main
base_url: https://[WORKER_NAME].workers.dev
# 로컬 개발 시
local_backend: true
# 미디어 파일 설정
media_folder: "assets/images/uploads"
public_folder: "/assets/images/uploads"
# 사이트 URL
site_url: https://junggikim.github.io
display_url: https://junggikim.github.io
# 로고 (선택)
logo_url: https://junggikim.github.io/assets/images/bio-photo.jpg
# 한국어 설정
locale: ko
# 컬렉션 정의
collections:
- name: "posts"
label: "블로그 글"
label_singular: "글"
folder: "_posts"
create: true
slug: "---"
preview_path: "///"
sortable_fields:
fields: ["date", "title"]
default:
field: date
direction: descending
fields:
- label: "제목"
name: "title"
widget: "string"
required: true
- label: "작성일"
name: "date"
widget: "datetime"
format: "YYYY-MM-DD HH:mm:ss Z"
date_format: "YYYY-MM-DD"
time_format: "HH:mm:ss"
- label: "카테고리"
name: "categories"
widget: "list"
allow_add: true
default: ["개발"]
- label: "태그"
name: "tags"
widget: "list"
allow_add: true
- label: "설명"
name: "excerpt"
widget: "text"
required: false
- label: "본문"
name: "body"
widget: "markdown"
Phase 4: 네비게이션에 글쓰기 버튼 추가
4.1 _data/navigation.yml 수정
main:
- title: "Home"
url: /
- title: "About"
url: /about/
- title: "Search"
url: /search/
- title: "글쓰기"
url: /admin/
4.2 (선택) 글쓰기 버튼 스타일링
// assets/css/main.scss에 추가
.greedy-nav a[href="/admin/"] {
background: var(--accent-primary);
color: white !important;
padding: 0.5em 1em;
border-radius: 20px;
&:hover {
background: var(--accent-secondary);
}
}
Phase 5: 보안 설정
5.1 GitHub OAuth 권한 범위
필요한 권한:
- repo (저장소 읽기/쓰기)
- user:email (사용자 이메일 확인)
불필요한 권한:
- admin:org (조직 관리)
- delete_repo (저장소 삭제)
5.2 접근 제한 (선택)
# admin/config.yml에 추가
backend:
# ...기존 설정...
# 특정 사용자만 허용
# (GitHub 계정명)
allowed_hosts:
- junggikim.github.io
사용 흐름
1. 사용자가 /admin/ 접속
↓
2. "GitHub로 로그인" 버튼 클릭
↓
3. Cloudflare Worker → GitHub OAuth 인증
↓
4. 인증 성공 → CMS 대시보드 표시
↓
5. 새 글 작성 또는 기존 글 편집
↓
6. 저장 버튼 클릭
↓
7. GitHub에 자동 커밋 & 푸시
↓
8. GitHub Actions → Jekyll 빌드
↓
9. 블로그에 새 글 반영 (1-2분 후)
예상 결과
Admin 페이지 UI
┌─────────────────────────────────────────────────────────────┐
│ 📝 JunggiKim Blog CMS [GitHub로 로그인] │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌─────────────────────────────────────┐ │
│ │ 📂 컬렉션 │ │ 블로그 글 │ │
│ │ │ │ │ │
│ │ ▸ 블로그 글 │ │ [+ 새 글 작성] │ │
│ │ │ │ │ │
│ │ │ │ ┌─────────────────────────────┐ │ │
│ │ │ │ │ 📄 임시 테스트 글 │ │ │
│ │ │ │ │ 2025-11-30 │ │ │
│ │ │ │ └─────────────────────────────┘ │ │
│ │ │ │ │ │
│ └──────────────┘ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
글 작성 화면
┌─────────────────────────────────────────────────────────────┐
│ ← 뒤로 새 글 작성 [저장] [발행] │
├─────────────────────────────────────────────────────────────┤
│ │
│ 제목: [ ] │
│ │
│ 작성일: [2025-12-03] [14:30:00] │
│ │
│ 카테고리: [개발] [+] │
│ │
│ 태그: [Jekyll] [CMS] [+] │
│ │
│ ───────────────────────────────────────────────────────── │
│ │
│ 본문 (Markdown): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ B I U ~ ≡ 📷 🔗 <> " • 1. │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 제목을 입력하세요 │ │
│ │ │ │
│ │ 본문 내용을 작성하세요... │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
체크리스트
- GitHub OAuth App 생성
- Cloudflare Worker 배포
- admin/index.html 생성
- admin/config.yml 생성
- 네비게이션에 글쓰기 버튼 추가
- 로컬 테스트
- GitHub Pages 배포 테스트
- 실제 글 작성 테스트
예상 소요 시간
| 단계 | 예상 시간 |
|---|---|
| GitHub OAuth App 생성 | 5분 |
| Cloudflare Worker 배포 | 10분 |
| Admin 페이지 생성 | 5분 |
| 네비게이션 수정 | 2분 |
| 테스트 | 10분 |
| 총 소요 시간 | 약 30분 |