시작하기/전체 그림
전체 그림
YWS는 k3s(경량 쿠버네티스) 위에서 직접 만든 "나만의 AWS 흉내 내기" 플랫폼입니다. EC2/저장소/Lambda/네트워크/도메인 같은 AWS 콘솔의 개념을 본떠서, 실제로는 전부 k8s 오브젝트(Deployment, PVC, Service, NetworkPolicy, Ingress...)로 구현되어 있습니다. 사용자는 FastAPI + Jinja2로 만든 웹 포털(webapp/)만 보고, 뒤에서 무슨 일이 일어나는지는 몰라도 됩니다.
물리 서버는 집에 있는 두 대뿐입니다:
- jimmy-master — 컨트롤플레인 + 포털(웹 콘솔, Pages 서빙 포함) 같은 메모리 사용량이 안정적인 가벼운 인프라 파드만. 사용자 EC2/Lambda는 올리지 않음 (
--system-reserved예약이 없어서 부하가 출렁이는 워크로드를 올리면 컨트롤플레인까지 위험) - jimmy-worker-1 — 실제 EC2/저장소/Lambda가 도는 유일한 워커, GPU(GTX 1660 SUPER) 장착
노드가 2대뿐이라 전체 메모리는 약 24GB 수준이고, 이게 실제로 자주 병목이 됩니다 (알려진 제약사항 참고).
주소 구성
| 주소 | 용도 |
|---|---|
jimmy-home.com |
웹 콘솔 (로그인 → 콘솔 홈), /api/v1 JSON API (API) |
auth.jimmy-home.com |
OAuth 서버 ("YWS로 로그인", OAuth 로그인) |
alarm.jimmy-home.com |
알림 서버 — 앱이 사용자 폰으로 푸시 알림 (알림 서버) |
{이름}.jimmy-home.com |
사용자가 등록한 도메인 → EC2/로드밸런서 (도메인 / 인바운드) |
jimmy-home.page |
이 문서 사이트 (로그인 없이 누구나 열람) |
{이름}.jimmy-home.page |
사용자 정적 사이트 (Pages) |
사용자이름@jimmy-home.com |
메일 (메일) |
모든 웹 주소는 Cloudflare Tunnel 하나로 클러스터의 Traefik에 들어옵니다. 메일(SMTP 25번)만 예외로, Cloudflare를 거치지 않고 공유기 포트포워딩으로 jimmy-master에 직접 들어옵니다.
포털 코드 구조 (webapp/app/)
| 위치 | 역할 |
|---|---|
routers/ |
화면(HTML)과 /api/v1(JSON) 라우트. 요청을 받아 아래를 부르고 결과를 보여 주기만 함 |
services/ |
검증·권한·k8s 호출·정리 순서 — EC2, 저장소, Lambda(트리거 포함), DB, 네트워크 캔버스·로드밸런서, 인바운드·아웃바운드, SSH 키, 도메인, 삭제. 콘솔과 API가 같은 함수를 씀 |
provisioning/, k8s_client.py |
k8s 오브젝트를 실제로 만들고 지우는 코드. 영역별 모듈(ec2, storage, lambdas, network, ingress, system_services, bastion, nodes, 상수·공통 common) |
deps.py |
로그인 확인 (require_user → 미로그인은 /login, 미승인은 /pending, 앱 전용 계정은 홈으로 — 메일·알림만 portal=False, require_admin) |
templating.py |
모든 화면이 쓰는 Jinja2 템플릿 환경 하나 |
models.py, migrate.py |
DB 모델과 열 추가용 마이그레이션 |
의존 방향은 routers → services → provisioning/k8s. 서비스가 라우터를 import하지 않습니다.