diff --git a/.yakcloud/deploy.py b/.yakcloud/deploy.py index d6c7bd9..57233b6 100644 --- a/.yakcloud/deploy.py +++ b/.yakcloud/deploy.py @@ -95,11 +95,18 @@ def _ready_sources() -> str: def reconcile_source(req: dict) -> str | None: name, stype, plan = req["name"], req["type"].upper(), req.get("plan", "small") + # 기본 mode: 대부분 shared(공유 외부에 격리 DB 민팅). 단 Redis 는 공유 격리가 ACL 키/채널 '프리픽스'(비투명 — + # 앱이 맨 키/채널로 pub/sub 하면 NOPERM)라 **기본을 전용(local)**으로 → REDIS_URL 로 전권 사용(pub/sub 포함). + # 명시 mode 는 존중. shared redis 는 프리픽스-인지 앱 전용(mode: shared 로 명시). + mode = req.get("mode") or ("local" if stype == "REDIS" else "shared") match = next((s for s in cluster_services() if s.get("name") == name), None) if match and match.get("status") == "READY": + cur = str(match.get("mode") or "").lower() + if cur and cur != mode: + log(f"⚠ source '{name}' 은 이미 mode={cur} 로 존재 → 매니페스트 mode={mode} 는 무시(재프로비저닝 안 함). " + f"바꾸려면 삭제 후 재배포: 'yakcloud source rm {name}'.") log(f"source '{name}' ({stype}) 이미 READY → 스킵 (id={match['id']})") return match["id"] - mode = req.get("mode", "shared") # shared(기본)=공유 외부 서버에 격리 DB 민팅 · local=인클러스터 프로비저닝(옵션, size 사용) if DRY: if match: log(f"source '{name}' 상태={match.get('status')} — READY 대기 필요") diff --git a/bin/yakcloud b/bin/yakcloud index deb9e98..9b17868 100755 --- a/bin/yakcloud +++ b/bin/yakcloud @@ -16,7 +16,7 @@ set -uo pipefail # -e 미사용: 'test && action' 관용구가 값 없을 때 REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}" BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}" -VERSION="0.24.0" +VERSION="0.24.1" # 로컬 개발 클러스터(kind) — 개발 후 운영까지 '직선 배포'의 dev 구간. DEV_CTX="${YAK_DEV_CONTEXT:-kind-yak-dev}" DEV_CLUSTER="${YAK_DEV_CLUSTER:-yak-dev}" diff --git a/yakcloud.yaml b/yakcloud.yaml index e55a3a8..e70ac5a 100644 --- a/yakcloud.yaml +++ b/yakcloud.yaml @@ -31,9 +31,13 @@ environments: # type ∈ postgresql·mysql·mariadb·mongodb·redis·minio·rabbitmq·solr·oracle # - 기본(shared, mode 생략): 공유 외부 서버에 클러스터/프로젝트별 **격리 DB·계정** 민팅(인클러스터 리소스 생성 없음). # - 인클러스터(옵션): 정말 전용 인스턴스가 필요할 때만 `mode: local, plan: small|medium|large`. +# - ★ redis 는 예외 — 공유 격리가 ACL 키/채널 '프리픽스'(비투명, 맨 pub/sub 차단)라 **기본이 전용(local)**. +# REDIS_URL 로 전권(pub/sub 포함). 프리픽스-인지 앱이면 `mode: shared` 로 공유 사용 가능. # - 이름이 클러스터의 기존 READY 소스와 일치하면 스킵·바인딩. ('yakcloud project check' 로 미리 확인) +# (기존 소스의 mode 를 바꾸려면 삭제 후 재배포 — 리컨실은 재프로비저닝하지 않고 경고만 함) requires: - { name: appdb, type: postgresql } # 기본 shared. 전용 인스턴스는 { …, mode: local, plan: small } + # - { name: cache, type: redis } # redis = 기본 전용(pub/sub 전권). 공유는 { …, mode: shared } # 워크로드(앱 컨테이너). CI 는 각 workload.build 를 도커 빌드해 image 로 push 한다(${TAG}=릴리스 태그). workloads: