52 lines
4.3 KiB
YAML
52 lines
4.3 KiB
YAML
# YakCloud 선언적 배포 매니페스트 (범용 템플릿)
|
|
# 태그(v*) push → Gitea Actions → 이 매니페스트로 배포:
|
|
# 1) requires 리컨실 — 논리 이름의 소스가 READY 면 스킵, 없으면 type/plan 대로 프로비저닝 후 Ready 대기
|
|
# 2) workloads 빌드/배포 — build 컨텍스트를 image 로 빌드·push, 각 워크로드가 소스를 alias 로 바인딩
|
|
# 3) 앱 탭 등록 + 데이터소스 연결(<ALIAS>_URL 등 env 자동 주입)
|
|
apiVersion: yakcloud/v1
|
|
project: my-app # 프로젝트 이름(이미지 경로/표시에 사용) — 소문자·숫자·하이픈
|
|
|
|
# 환경 — 개발(로컬 kind) → 검증/운영(관리형). 검증계(val)가 필요 없으면 그 줄을 지워도 됩니다.
|
|
# dev = **로컬 kind**. yakcloud project deploy → 로컬 클러스터(없으면 자동 생성) + dev deploy(오프라인·무료, CI 불필요).
|
|
# 로컬에서 requires 소스+workloads 가 관리형과 '동일한 바인딩 env'로 뜬다(직선 파리티). cluster=로컬 이름, port=인그레스 포트.
|
|
# val/prod = **관리형**. yakcloud project promote --to val|prod → 이미지 build+push(이미 있으면 재빌드 없이) 후 리컨실 + 도메인.
|
|
# (기본 도메인 c-xxxx.yakenator.io 은 자동. 운영 커스텀 도메인은 prod.domains 에.)
|
|
#
|
|
# ★ 환경별 오버라이드(오버레이 병합): 아래 base 의 requires/workloads 를 environments.<env> 에서 '이름 매칭'으로
|
|
# 덮어쓰거나 추가할 수 있다 → dev↔prod 소스/리소스가 달라도 promote 때 매니페스트 수정 불필요(앱 binds 는 논리이름 고정).
|
|
# 예) prod 는 관리형 공유 mongo + 큰 리소스:
|
|
# prod:
|
|
# cluster: my-prod-cluster
|
|
# domains: [app.example.com]
|
|
# requires: # 이름(appdb) 매칭 → base 의 정체를 덮어씀
|
|
# - { name: appdb, type: mongodb, mode: shared, plan: medium }
|
|
# workloads: # 워크로드명(web) 키로 필드 패치(resources·replicas·env 는 병합, 그 외 교체)
|
|
# web: { replicas: 3, resources: { cpu: 500m, mem: 512Mi } }
|
|
environments:
|
|
dev: { cluster: dev, port: 80, workers: 1 } # 로컬 kind (project deploy). cluster=로컬 이름, port=인그레스 포트(이름!=dev면 비80), workers=워커 노드 수(0=CP만)
|
|
val: { cluster: my-val-cluster } # 관리형 (promote --to val)
|
|
prod: { cluster: my-prod-cluster, domains: [] } # 관리형 (promote --to prod, domains 예: [app.example.com]) — 필요 시 위 예처럼 requires/workloads 오버라이드
|
|
|
|
# 필요한 데이터 소스(논리 이름). 없으면 [] 로. 기본 = **공유(shared)** — 이미 있는 공유 소스에 연결 + 격리 DB 민팅.
|
|
# type ∈ postgresql·mysql·mariadb·mongodb·redis·minio·rabbitmq·solr·oracle
|
|
# - 기본(shared, mode 생략): 공유 외부 서버에 클러스터/프로젝트별 **격리 DB·계정** 민팅(인클러스터 리소스 생성 없음).
|
|
# - 인클러스터(옵션): 정말 전용 인스턴스가 필요할 때만 `mode: local, plan: small|medium|large`.
|
|
# - 이름이 클러스터의 기존 READY 소스와 일치하면 스킵·바인딩. ('yakcloud project check' 로 미리 확인)
|
|
requires:
|
|
- { name: appdb, type: postgresql } # 기본 shared. 전용 인스턴스는 { …, mode: local, plan: small }
|
|
|
|
# 워크로드(앱 컨테이너). CI 는 각 workload.build 를 도커 빌드해 image 로 push 한다(${TAG}=릴리스 태그).
|
|
workloads:
|
|
- name: my-app # 배포(워크로드)명 = 프로젝트명(권장). 'project init <name>' 이 프로젝트명으로 설정.
|
|
build: ./ # 도커 빌드 컨텍스트(Dockerfile 위치). 예: ./ 또는 ./api
|
|
image: gitea.yakenator.io/CHANGE_ME_GITEA_USER/my-app:${TAG}
|
|
port: 8080
|
|
replicas: 2 # ≥2 → 무중단 롤링(readiness 게이트)
|
|
health: /healthz
|
|
resources: { cpu: 25m, mem: 96Mi }
|
|
# host 지정 시 등록 도메인으로 노출(미지정=클러스터 기본 도메인). 여러 개는 hosts: [a, b]
|
|
expose: { path: /, rewrite: false }
|
|
binds:
|
|
# source=위 requires 이름, alias=env 프리픽스(대문자화). 예 alias=db → DB_URL/DB_HOST/DB_PORT/…
|
|
- { alias: db, source: appdb }
|