# 지원 데이터 소스 & 바인딩 env 주입 앱은 접속정보를 **하드코딩하지 말고**, 바인딩된 소스가 주입하는 아래 env로 읽는다. 매니페스트에서 `binds: [{ alias, source }]` 로 연결하면, `alias`(대문자화)가 env 프리픽스가 된다. 예: `alias: db` → `DB_URL`, `DB_HOST`, `DB_PORT`, `DB_USERNAME`, `DB_PASSWORD`, `DB_DB`. ## 지원 소스 (`requires[].type`) | type | 소스 | 비고 | |---|---|---| | `postgresql` | PostgreSQL | 관계형 | | `mysql` | MySQL | 관계형 | | `mariadb` | MariaDB | 관계형(MySQL 와이어 호환) | | `mongodb` | MongoDB | 도큐먼트 | | `redis` | Redis | 인메모리 KV/캐시 | | `minio` | MinIO | S3 호환 오브젝트 스토리지 | | `rabbitmq` | RabbitMQ | 메시지 브로커(AMQP) | | `solr` | Solr | 검색 엔진 | | `oracle` | Oracle | 관계형(외부 연결) | `plan` ∈ `{small, medium, large}`. ## 소스별 주입 env (예시 alias=`db`) 모든 타입 공통: **`_HOST`**, **`_PORT`**. | type | 추가 env 키 | `_URL` 형식 | |---|---|---| | `postgresql` | `_USERNAME` `_PASSWORD` `_DB` | `postgresql://user:pw@host:port/db` | | `mysql` | `_USERNAME` `_PASSWORD` `_DB` | `mysql://user:pw@host:port/db` | | `mariadb` | `_USERNAME` `_PASSWORD` `_DB` | `mysql://user:pw@host:port/db` | | `mongodb` | `_USERNAME` `_PASSWORD` `_DB` | `mongodb://user:pw@host:port/db?authSource=db` | | `redis` | `_USERNAME`(빈) `_PASSWORD` `_DB`(번호) | `redis://:pw@host:port/db` | | `minio` | `_ACCESS_KEY` `_SECRET_KEY` `_ENDPOINT` `_BUCKET` `_REGION` `_USE_SSL` | `_URL`=`_ENDPOINT` | | `rabbitmq` | `_USERNAME` `_PASSWORD` `_VHOST` `_MGMT_URL` | `amqp://user:pw@host:port/vhost` | | `solr` | `_CORE` `_ENDPOINT` | `http://host:port/solr/core` | | `oracle` | `_USERNAME` `_PASSWORD` `_SERVICE` `_JDBC_URL` `_DSN` | `oracle://user:pw@host:port/service` | > 비밀번호·키는 인클러스터 Secret으로 주입되고 콘솔/브라우저에 노출되지 않는다. URL의 user/pw는 URL-인코딩됨. ## 로컬 개발(`yakcloud dev`) — 배포와 동일한 env 계약 개발 중에는 `yakcloud dev up` 이 `requires[]` 를 **로컬 docker 컨테이너**로 띄우고, 위 표와 **똑같은 `_*`** (같은 키·URL 포맷, 값만 로컬 컨테이너를 가리킴)를 `.env.dev` 로 생성한다. 즉 로컬에서 짠 코드가 배포 후에도 무수정 동작. ```sh yakcloud dev up # requires[] 기동 + .env.dev 생성(무거운 oracle 은 명시 기동) yakcloud dev run -- python app.py # .env.dev 주입해 앱 실행(= 배포된 파드와 동일한 env) yakcloud dev status | logs | down [--volumes] | reset | doctor ``` - 자격은 프로젝트 시드에서 **결정적 파생**(재현 가능), `.yakcloud/dev/` 에만 저장(gitignore). 브라우저/원격 미노출. - `.env.dev`·`.yakcloud/`·`docker-compose.yakcloud-dev.yml` 은 커밋 금지(스캐폴드 `.gitignore` 에 포함). - env 계약은 프로덕션 백엔드 `_bind_env_for` 와 **바이트 동일**하게 유지(단일 진실원천). ## 스키마·데이터 마이그레이션(`yakcloud datasource migrate`) — 블랙리스트 스냅샷 개발 DB는 테스트로 엉망이 되기 쉬우니, **전부 캡처하되 블랙리스트로 뺀다**(denylist). 새 환경을 dev 상태로 채우는 **부트스트랩** 도구. ```sh yakcloud datasource migrate capture [source…] --dry-run # 무엇이 잡히는지 미리보기(읽기전용) yakcloud datasource migrate capture [source…] # db//snapshot/ 에 전체−블랙리스트 덤프 yakcloud datasource migrate apply [source…] # 빈 타깃만 복원(데이터 있으면 스킵, force 없음) yakcloud datasource migrate status ``` - **블랙리스트**: `db//.migrateignore` (글롭, git 추적). 예: `audit_log_*`, `tmp_*`, `cache/*`. 민감/개인정보·쓰레기는 반드시 여기에. - **capture=읽기전용**(안전), 전체 native 덤프(pg_dump/mysqldump/mongodump/mc mirror/redis DUMP/solr export/rabbitmq definitions). 지원: postgres·mysql·mariadb·mongodb·minio·redis·solr·rabbitmq(oracle=다음 단계). 블랙리스트 단위: SQL=테이블, mongo=컬렉션, minio=오브젝트, redis=키, solr=문서(쿼리절), rabbitmq=큐/익스체인지. rabbitmq는 정의만(메시지 제외). - **apply=빈 타깃만**. 데이터가 있으면 **절대 안 덮음**(스킵). 라이브 prod 지속 동기화가 아님. - **db/** 는 커밋·리뷰 대상(`.env.dev`·`.yakcloud/` 와 반대로 gitignore 아님). - prod 적용은 콘솔 종류별 소스관리자 **컨펌 + 항상 백업 후(롤백 보장)** — CLI 로 prod 직접 덮지 않음. ## 앱 코드 예시 ```python # Python — alias=db (postgres) import os, psycopg2 conn = psycopg2.connect(os.environ["DB_URL"]) ``` ```js // Node — alias=mongo const client = new MongoClient(process.env.MONGO_URL); ``` ```js // MinIO(S3) — alias=files const s3 = new S3Client({ endpoint: process.env.FILES_ENDPOINT, region: process.env.FILES_REGION, credentials: { accessKeyId: process.env.FILES_ACCESS_KEY, secretAccessKey: process.env.FILES_SECRET_KEY } }); ```