AI용 분할본 · 지도 7단계(운영·개정 — 필요할 때만) — 앱에 비밀키·외부 서비스 키·관리자 비밀번호 같은 환경변수를 넣거나 바꿀 때 연다 · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 8 배포 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)
핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다
node scripts/get-book-code.mjs 가 책 그대로 만든다(첫 실행은 부록 A-2 의 curl 한 줄). AI용 분할본의 코드 자리는 " 경로" 한 줄이다 — 그 파일을 cat 으로 읽는다. 고쳐도 되는 파일은 PART 0 [AI 시작 지침] 5-b 의 목록뿐이다.node scripts/verify-book-code.mjs 를 실행해 "불일치 0개" 출력을 그대로 보인다.결제사 비밀 키, 외부 서비스 토큰, 관리자 비밀번호, 데이터를 암호화하는 마스터 키 같은 값은 코드에 넣지 않고 RIDM Apps 의 환경변수로 넣습니다. 앱 서버 코드는 process.env.이름 으로 읽습니다. 이 부록은 사람이 콘솔에서 넣는 법(F-2), AI 코딩 도구가 넣는 법(F-3), 그 사이에 값이 새지 않게 하는 규칙(F-4), 오류 표(F-5)입니다. 이 책의 기본 뼈대는 넣을 환경변수가 없고(DATABASE_URL 은 플랫폼이 넣음), 관리자 페이지(B-7)의 ADMIN_PATH·ADMIN_PASSWORD 와 나중에 붙이는 외부 서비스 키가 대상입니다.
^[A-Z_][A-Z0-9_]{0,63}$)PORT·HOSTNAME·NODE_OPTIONS·DATABASE_URL, RIDM_·PG 로 시작하는 이름.HRUM_API_KEY•••••••• 로 보입니다.값을 옮기는 동안:
pbcopy < /dev/null, 또는 아무 글자나 한 번 복사)AI 도구가 사람 대신 넣으려면 AI 운영 토큰이 필요합니다. 콘솔 관리 토큰(hrum_cm_…)을 발급할 때 사람이 hosting_ops 권한을 체크한 토큰이고, 30일 동안 쓰며, 작업마다 동의를 다시 받지 않습니다. HRUM MCP 0.2.1 에는 환경변수 도구가 없어 아래 HTTP 경로를 씁니다.
AI 가 넣을 수 있는 이름: _KEY·_SECRET·_TOKEN·_PASSWORD·_PASSWD·_PASS·_SALT·_CLIENT_ID 로 끝나는 이름뿐입니다(예: STRIPE_SECRET_KEY, MASTER_KEY). 그중에도 실행 환경이나 접속 주소를 바꾸는 이름 — _URL·_URI·_ENDPOINT·_HOST·_PROXY 로 끝나거나 NODE_·LD_·DYLD_·PYTHON·JAVA_·GIT_·NPM_CONFIG_ 등으로 시작하는 이름, HTTP_PROXY·NODE_TLS_REJECT_UNAUTHORIZED·SSL_CERT_FILE·PATH 같은 이름 — 은 거절됩니다(전체 목록은 llms.txt 「앱 환경변수·비밀키 넣기」). 그 밖의 이름, 예를 들어 이 책의 ADMIN_PATH 는 사람이 F-2 로 넣습니다. 지우기는 AI 경로로도 됩니다(예약 이름 제외).
토큰 받기
POST https://api.hrum.ai/api/v1/partners/v1/console-ai/consents 에 {"action":"token_issue","payload":{"scopes":["hosting_ops"],"label":"내 앱 운영"}} 를 보냅니다. 응답 data 에 consentUrl·userCode(8자리)·code·pollSecret 이 옵니다.consentUrl 과 8자리 코드만 보여 줍니다. pollSecret 은 보여 주지 않습니다.hosting_ops 를 체크한 뒤 동의를 누릅니다. 체크 아래의 경고(이 키가 새면 환경변수 덮어쓰기·배포·재시작이 가능)를 읽고 누릅니다.GET …/console-ai/consents/{code} 를 헤더 X-Consent-Poll-Secret 과 함께 부르면, 승인 뒤 첫 응답의 data.token.value 로 토큰을 딱 한 번 받습니다. 화면에 찍지 않고 바로 키체인이나 권한 600 파일에 넣습니다.호출 — 기본 주소 https://api.hrum.ai, 헤더 Authorization: Bearer hrum_cm_…. 앱 id(UUID)는 GET /api/v1/partners/v1/console-ai/hosting 응답의 data.apps[].id 입니다.
| 할 일 | 요청 | 응답 |
|---|---|---|
| 이름 목록 | GET /api/v1/partners/v1/console-ai/hosting/apps/{appId}/env | data.env.names — 값 없음 |
| 넣기·바꾸기 | PUT …/hosting/apps/{appId}/env/{NAME} 본문 {"value":"…"} | 바뀐 이름 목록, 앱 재시작 |
| 지우기 | DELETE …/hosting/apps/{appId}/env/{NAME} | 바뀐 이름 목록, 앱 재시작 |
HRUM_CM_TOKEN=$(security find-generic-password -s hrum-console-ops -w)
VALUE=$(security find-generic-password -s myapp-MASTER_KEY -w)
printf '%s' "$VALUE" | jq -Rs '{value: .}' | curl -s -X PUT \
-H @<(printf 'Authorization: Bearer %s' "$HRUM_CM_TOKEN") \
-H 'Content-Type: application/json' --data-binary @- \
"https://api.hrum.ai/api/v1/partners/v1/console-ai/hosting/apps/$APP_ID/env/MASTER_KEY" \
| jq '.data.env.names // .'
unset VALUE
키체인 항목(-s 뒤의 이름)은 사용자가 미리 만들어 둡니다. 터미널에서 security add-generic-password -s myapp-MASTER_KEY -a "$USER" -w 처럼 -w 를 맨 끝에 두면 값을 화면에 보이지 않게 물어봅니다.
curl -d "값", echo 값, set -x 처럼 명령줄·로그에 값이 남는 방법은 쓰지 않는다.env 커밋·PROGRESS.md·로그·화면 출력에 적지 않는다. 보고는 "이름 + 저장 여부"만hrum_cm_…)도 값과 똑같이 다룬다. 일이 끝나면 콘솔에서 취소하라고 알린다실제 있었던 일: 판매 관리 앱을 만들던 AI 도구가 앱의 마스터 키를 환경변수로 넣으려 했는데, 그때는 AI 가 쓸 운영 경로가 없어 거기서 멈췄습니다. 지금은MASTER_KEY처럼_KEY로 끝나는 이름은 AI 운영 토큰으로(F-3), 그 밖의 이름은 사람이 콘솔로(F-2) 넣습니다. 어느 쪽이든 값이 채팅으로 오가지 않게 합니다.
오류 본문은 {"success":false, 입니다. 환경변수 오류에는 code 가 없습니다.
| 상태 | message | 원인 → 해결 |
|---|---|---|
| 400 | 이름은 대문자·숫자·밑줄만 쓸 수 있고, 숫자로 시작할 수 없습니다 (최대 64자) | 이름 규칙 위반 → 고쳐서 다시 |
| 400 | 플랫폼이 쓰는 이름이라 설정할 수 없습니다: 이름 | 예약 이름 → 다른 이름 |
| 400 | AI 연결이 자동으로 넣는 이름이라 직접 설정할 수 없습니다: HRUM_API_KEY | 이 앱은 「AI 연결」이 켜져 있어 플랫폼이 넣는다. 직접 넣으려면 「AI 연결」을 끈다 |
| 400 | 이 계정에서 발급한 API 키만 넣을 수 있어요. 콘솔 「API 키」에서 발급한 키를 넣어 주세요 | 내 콘솔 키를 넣는다 |
| 400 | AI 연결이 앱마다 만든 키는 넣을 수 없어요. 콘솔 「API 키」에서 발급한 키를 넣어 주세요 | 콘솔 「API 키」의 키를 넣는다 |
| 400 | 실행 환경을 바꾸는 이름이라 AI 경로(AI 운영 토큰·MCP)로는 설정할 수 없습니다. 콘솔에서 직접 설정해 주세요: 이름 | 사람이 F-2 로 |
| 400 | AI 경로(AI 운영 토큰·MCP)로는 _KEY·_SECRET·_TOKEN·_PASSWORD·_PASSWD·_PASS·_SALT·_CLIENT_ID로 끝나는 이름만 설정할 수 있습니다. … | 이름을 바꾸거나 사람이 F-2 로 |
| 400 | 값을 입력해 주세요 | 빈 값 |
| 400 | 값에 줄바꿈을 넣을 수 없습니다 | 여러 줄 값(PEM 개인 키 등) → base64 한 줄로 넣고 앱에서 풀어 쓴다 |
| 400 | 값은 2048바이트까지입니다 | 큰 값은 DB 나 외부 비밀 저장소에 |
| 400 | Validation failed (uuid is expected) | 앱 id 가 UUID 가 아님 → data.apps[].id |
| 401 | MGMT_TOKEN_INVALID | 토큰 없음·만료·취소 → 새로 발급 |
| 403 | MGMT_SCOPE_DENIED (scope: "hosting_ops") | 토큰에 hosting_ops 가 없음 → 체크해서 새로 발급 |
| 404 | 앱을 찾을 수 없습니다 | 다른 계정의 앱이거나 삭제된 앱 → 앱 id 확인 |
| 404 | 없는 환경변수입니다 | 지우려는 이름이 없음 → 목록 확인 |
| 409 | 해지된 앱은 환경변수를 바꿀 수 없습니다 | 해지 진행 중인 앱 |
| 409 | 환경변수는 앱당 50개까지입니다 | 안 쓰는 이름을 지우고 다시 |
| 429 | (요청 제한) | 넣기·지우기는 1분에 30번까지 → 잠시 뒤 다시 |
| 503 | 환경변수 저장소가 준비되지 않았습니다 | 서버 쪽 문제 → 잠시 뒤 다시, 계속되면 문의 |
AI용 분할본 · 지도 7단계(운영·개정 — 필요할 때만) — 앱에 비밀키·외부 서비스 키·관리자 비밀번호 같은 환경변수를 넣거나 바꿀 때 연다 · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 8 배포 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)