
# keenauth config promote로 설정 승격하기

`keenauth config promote`은 한 환경의 설정을 다른 환경으로 복사합니다(예: `staging`에서 `production`으로). 이 명령은 `config export`, `config plan`, `config apply`으로 직접 수행할 단계와 같은 단계를 실행하되, 문서를 파일에 쓰지는 않습니다:

1. `--from` 환경의 설정 문서를 내보냅니다.
2. `--to` 환경에 대해 이 문서의 계획을 만듭니다.
3. 차이를 출력합니다: `+` 생성, `~` 업데이트, `-` 삭제; 변경되지 않은 리소스는 개수만 집계합니다.
4. 확인 후 계획을 적용합니다.

두 환경은 서로 다른 리전에 있을 수 있습니다. 리전끼리는 서로 호출하지 않으며, 문서는 사용자의 컴퓨터를 거쳐 메모리에만 머무릅니다.

## 시작하기 전에

이 명령은 두 환경 모두에 접근해야 하므로 대시보드 로그인을 사용합니다. `keenauth login`로 로그인하십시오([keenauth login으로 로그인하기](/docs/cli/login) 참조). 두 환경 모두에서 원본의 설정을 읽고 대상의 설정을 쓸 수 있는 대시보드 역할이 필요합니다. API 키는 하나의 환경에 속하므로, `KEENAUTH_API_KEY`가 설정되어 있으면 명령은 실행을 거부하고 종료 코드 2로 끝납니다.

## 사용법

```sh
keenauth config promote --from env_01j9z3k4m5n6p7q8r9s0t1stg0 --to env_01j9z3k4m5n6p7q8r9s0t1prd0
```

| 플래그 | 설명 |
|---|---|
| `--from` | 원본 환경의 ID(`env_…`)로, 설정을 내보냅니다(필수). |
| `--to` | 대상 환경의 ID(`env_…`)로, 계획이 생성되고 적용됩니다(필수). |
| `--kinds` | 승격할 종류. 쉼표로 구분하거나 반복하여 지정합니다. `config export`와 같습니다. 기본값: 모든 종류. |
| `--prune` | 승격 대상 종류 중 대상 환경에만 있는 리소스도 삭제합니다. 이 플래그가 없으면 유지됩니다. |
| `--secrets-from-env` | 계획에 필요한 클라이언트 시크릿을 로컬 환경 변수에서 읽습니다(아래 참조). |
| `--confirm-deletion` | 보호된 삭제를 `<kind>/<key>`로 확인합니다. `config apply`와 같습니다. |
| `--sp-host` | 대상 환경의 서비스 제공자 호스트(예: `login.example.com`). 계획이 대상에 엔터프라이즈 연결의 OIDC 자료를 생성할 때만 필요하며, 그 외에는 생략하십시오. |
| `--yes`, `-y` | 묻지 않고 적용합니다. 표준 입력이 터미널이 아닐 때 필요합니다. |
| `--output`, `-o` | `table`, `json` 또는 `yaml` 형식으로 출력합니다. 플래그가 없으면 CLI는 터미널에서 표를, 그 외에는 JSON을 출력합니다. |

터미널에서(`table`) 차이는 표준 출력에, 질문은 표준 에러에 출력되며, 적용 후에는 계획 ID, 상태, 변경 수가 담긴 한 줄이 출력됩니다. `json` 또는 `yaml`을 사용하면 차이는 표준 에러로 출력되고 표준 출력에는 적용된 계획만 담기므로 스크립트에서 읽을 수 있습니다. 대상이 이미 원본과 같으면 명령은 `nothing to promote`를 출력하고 아무것도 적용하지 않습니다.

표준 입력이 터미널이 아니고 `--yes`가 없으면, 명령은 어떤 요청도 보내기 전에 종료 코드 2로 끝납니다.

## 시크릿은 승격되지 않습니다

내보낸 문서에는 시크릿 값이 전혀 들어 있지 않습니다. 연결의 클라이언트 시크릿은 `secret_ref` 자리표시자(예: `KEENAUTH_CONNECTION_GOOGLE_CLIENT_SECRET`)로 나타납니다. 시크릿이 필요한 대상의 변경은 `[needs a client secret]`와 함께 표시됩니다.

이러한 계획은 직접 시크릿을 제공하지 않으면 적용되지 않습니다. 오류에 표시된 환경 변수를 설정하고 `--secrets-from-env`와 함께 명령을 다시 실행하십시오. 값은 로컬 환경에서 읽히며 적용 요청의 본문으로만 전송됩니다. 출력되거나 파일에 기록되거나 원본 환경에서 읽히는 일은 없습니다.

```sh
export KEENAUTH_CONNECTION_GOOGLE_CLIENT_SECRET=...   # the production client secret
keenauth config promote --from env_01j9z3k4m5n6p7q8r9s0t1stg0 --to env_01j9z3k4m5n6p7q8r9s0t1prd0 --secrets-from-env
```

## 엔터프라이즈 OIDC 및 소셜 연결

엔터프라이즈 연결의 OIDC 설정(`spec.oidc`: 발급자, 클라이언트 ID, 클라이언트 인증 방식, 공급자 프로필)은 연결과 함께 승격됩니다. 대상에 아직 이 설정이 없으면 적용 시 설정이 생성되고 콜백 URL이 대상의 호스트로 고정됩니다. 따라서 대상 환경에서 사용자가 로그인하는 호스트를 `--sp-host`와 함께 전달하십시오. 호스트는 환경마다 다르므로 문서에 포함되지 않습니다.

소셜 연결의 클라이언트 시크릿은 아직 계획에서 적용할 수 없습니다. 계획에 이것이 필요하면 `--secrets-from-env`를 사용하더라도 적용은 `501 not_implemented`와 함께 거부되며 아무것도 변경되지 않습니다. 다른 종류는 `--kinds`로 승격하거나, 지원되기 전까지 소셜 연결을 원본에서 제외하십시오.

## 오류

계획은 한 시간 동안 유효합니다. 계획과 적용 사이에 대상의 리소스가 변경되면 적용은 `409 config_conflict`와 함께 거부되며 아무것도 변경되지 않습니다. 명령을 다시 실행하십시오. 그 밖의 적용 오류는 `config apply`와 같습니다.

## 종료 코드

| 코드 | 의미 |
|---|---|
| `0` | 계획이 적용되었거나, 승격할 것이 없었습니다. |
| `1` | 서버 오류이거나, 확인을 거절했습니다(`aborted`). |
| `2` | 사용 오류: 잘못되었거나 동일한 환경 ID, 대화형이 아닌 터미널에서 `--yes` 누락, `KEENAUTH_API_KEY` 설정됨, 또는 계획에 필요한 시크릿 누락. 아무것도 적용되지 않았습니다. |
| `3` | 로그인되어 있지 않거나, 서버가 `401` 또는 `403`로 응답했습니다. |
| `4` | 계획에 해당 기능이 포함되어 있지 않습니다(`403`와 `plan_feature_unavailable`). |
