앱 연동/Pages (정적 사이트)
Pages (정적 사이트)
HTML/CSS/JS/이미지/Markdown 파일을 올리면 {이름}.jimmy-home.page 주소로 공개되는 정적 사이트 호스팅입니다 (GitHub Pages와 비슷). 지금 보고 있는 이 문서 사이트도 Pages 사이트 중 하나입니다 — 도메인 루트(jimmy-home.page)에 걸린 플랫폼 전용 사이트.
사용 방법
- 상단 Pages 탭 → "+ 사이트 생성" → 주소 이름, 제목, 공개 범위 선택
- 사이트 관리 화면에서 파일 올리기 (여러 개 선택 가능, zip은 자동으로 압축 해제)
- 또는 "+ 새 문서 작성"으로 웹 에디터에서 Markdown을 직접 쓰거나 원문을 붙여넣기 (오른쪽에 실시간 미리보기)
| 요청 경로 | 응답 |
|---|---|
/ |
index.html, 없으면 index.md |
/guide/start |
guide/start 파일 → guide/start.html → guide/start.md 순서로 찾음 |
/style.css, /img/a.png 등 |
파일 그대로 |
| 없는 경로 | 사이트에 404.html/404.md가 있으면 그것, 없으면 기본 404 |
Markdown 문서 틀
.md 파일은 서버에서 HTML로 바꿔서 플랫폼의 문서 틀에 넣어 보여줍니다 — 왼쪽에 사이트 안의 모든 페이지 목록, 가운데 본문, 오른쪽에 "이 페이지에서" 목차(스크롤 위치 표시), 다크모드 토글.
파일 맨 위에 front matter를 쓰면 왼쪽 메뉴를 정리할 수 있습니다:
---
title: 시작하기
group: 가이드
order: 10
---
# 시작하기
title: 메뉴에 보일 제목 (없으면 첫#제목)group: 메뉴에서 묶일 이름 (같은 group끼리 모임)order: 작을수록 위 (같으면 파일 경로 순)- 본문의
##/###제목이 오른쪽 목차가 됩니다. 표, 코드 블록(언어 지정 시 하이라이트), 취소선 지원
Markdown 안의 HTML 태그는 글자 그대로 표시됩니다 (
<script>가 실행되지 않음). Markdown은 "안전한 텍스트"로 취급하고, 스크립트가 필요한 페이지는.html파일로 올리면 됩니다.
공개 범위 (YWS 로그인)
사이트마다 "YWS 로그인한 사용자만 볼 수 있게"를 켤 수 있습니다 (생성 시 선택, 나중에 설정에서 변경).
- 켜면 방문자는 YWS 로그인(우리가 만든 OAuth)을 거쳐야 볼 수 있고, 승인된 YWS 사용자 누구나 볼 수 있습니다
- 콘솔에 이미 로그인한 상태면 추가 로그인 없이 바로 열립니다
- 로그인 흐름: 사이트 →
jimmy-home.page/_yws/start→jimmy-home.com/oauth/authorize(플랫폼 내장 클라이언트yws-pages) →jimmy-home.page/_yws/callback→ 사이트/_yws/finish - 로그인 쿠키는 그 사이트 호스트 전용(HttpOnly, Secure, 12시간)이라 다른 사용자 사이트로 넘어가지 않고, 다른 사이트에 가져가서 써도 거부됩니다
- 로그아웃(사이트 오른쪽 위)은 YWS 콘솔 로그인까지 함께 끝냅니다 — 사이트 쿠키만 지우면 다음 페이지에서 콘솔 로그인이 살아 있어 곧바로 다시 로그인되기 때문. 흐름: 사이트
/_yws/logout→jimmy-home.com/logout?next=…(콘솔 세션 종료,next는 Pages 호스트의/_yws/logged-out만 허용) → 사이트/_yws/logged-out("다시 로그인" 링크)
왜 별도 도메인 + 서브도메인인가
- 포털과 다른 등록 도메인(
jimmy-home.pagevsjimmy-home.com): 사용자가 올린 JS가 포털과 same-site가 아니라서, 방문자의 브라우저를 이용해 포털에 요청을 보내거나(CSRF) 쿠키를 심을 수 없음 - 사이트마다 서브도메인: 사이트끼리 오리진이 달라서 서로의 localStorage/쿠키에 접근 불가. 경로 방식(
/{이름})이었다면 모든 사이트가 한 오리진을 공유해서 이 격리가 없음 .page는 HTTPS가 강제되는(HSTS preload) 도메인이고, Cloudflare 무료 인증서가*.jimmy-home.page한 단계 와일드카드를 커버
인프라
- Cloudflare:
jimmy-home.page/*.jimmy-home.page→ 기존 Cloudflare Tunnel → Traefik → 포털 파드. 포털 앱이 Host 헤더로 Pages 요청을 먼저 가로채서 처리 (app/pages_server.py) - 포털과 같은 프로세스에서 돌아가므로 jimmy-master에서 실행됨 — 정적 파일 서빙과 캐시된 Markdown 렌더링이라 부하는 작음
- 파일은 포털 DB 볼륨과 분리된 전용 볼륨(
yws-pages, 5Gi)에/pages/{사이트 id}/로 저장 — 사이트 파일이 용량을 채워도 포털 DB는 영향 없음 - 한도: 사용자당 200MiB, 파일 하나 20MiB, zip 안의 파일 2000개.
.으로 시작하는 파일/폴더(.git등)는 올라가지 않고 서빙되지도 않음
관련 코드
app/pages.py— 파일 저장/경로 검사/zip 해제/Markdown 렌더링/메뉴 구성app/pages_server.py—*.jimmy-home.page서빙과 로그인 흐름app/routers/pages.py— 콘솔의 Pages 관리 화면app/pages_seed/yws/— 이 문서 사이트의 원본 (사이트가 처음 만들어질 때만 복사, 이후 수정은 Pages 탭에서)