# yakcloud 스타터 (프레임워크 중립) 의존성 0의 최소 HTTP 서버. **배포 계약**만 지키면 어떤 스택으로 바꿔도 된다: - `PORT` 환경변수로 리슨(기본 8080) - `GET /healthz` → 200 (매니페스트 `health` 경로) - (선택) 바인딩된 소스는 `_URL` 등 env로 접속 ## 로컬 실행 (앱만) ```sh PORT=8080 python3 app.py curl localhost:8080/healthz # {"ok":true} curl localhost:8080/ # 앱 정보 + 연결된 소스 키 ``` ## 로컬 개발 (K8s 파리티) — `yakcloud dev` 운영과 **같은 K8s + 같은 바인딩 env**로, 선언한 데이터소스까지 로컬에 띄워 검증한다: ```sh yakcloud dev up # 최초 1회 — 로컬 kind + 인그레스 yakcloud dev deploy # requires 소스 + workloads 를 로컬 배포(관리형과 동일한 _URL 등 주입) curl -s http://.dev.localhost/ # bound_sources 에 연결 키 확인 yakcloud dev down # 정리 ``` 같은 매니페스트·같은 이미지로 준비되면 `yakcloud project promote --to val|prod` 로 직선 승격. ## 매니페스트 매핑 (`yakcloud.yaml`) ```yaml requires: - { name: appdb, type: postgresql } # 논리 이름(안정 키). 환경별 실제 소스명은 clusterName 으로 오버레이(→ reference 참고) workloads: - name: web build: ./ # 이 디렉터리(Dockerfile)를 CI 가 빌드 image: gitea.yakenator.io//-web:${TAG} port: 8080 health: /healthz binds: - { alias: db, source: appdb } # → 앱에서 os.environ["DB_URL"] 로 접속 ``` ## 다른 스택으로 교체 `app.py`(+`Dockerfile`)를 원하는 언어/프레임워크로 교체하되 위 3계약 유지. 소스 바인딩 상세는 `../reference/DATA-SOURCES.md` 참고 — 주입 env 전체 목록뿐 아니라 환경별 실제 소스명 매핑(`requires[].clusterName`, 논리 `name` ↔ 실제 소스명 분리), 환경 오버레이(base + `environments.`, 차이만) 병합, 운영 소스 3모드(shared/remote/local) 결정과 `yakcloud datasource ls`/`datasource options` 조회를 함께 다룬다.