AI용 분할본 · 지도 4단계(서버 배포) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 3 서버 만들기 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)
핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다
HRUM_API_KEY 에만 둔다. 미니앱 코드·.env·채팅·커밋·로그에 쓰지 않고, 키 값을 사용자에게 달라고 하지 않는다. 미니앱은 내 서버만 부른다.node scripts/get-book-code.mjs 가 책 그대로 만든다(처음에는 부록 A-2 의 curl 한 줄). 분할본의 코드 자리는 「경로」 한 줄이다 — 받은 파일을 cat 으로 읽는다.미니앱이 부를 서버를 https://<이름>.ridm.ai 로 공개합니다. 미니앱 화면은 여기에 올리지 않습니다 — 화면은 PART 6 에서 앱인토스 콘솔에 번들로 올립니다.
RIDM Apps 배포 가이드의 조건: 저장소 루트에 Dockerfile 이 있어야 하고, 앱은 포트 3000 에서 HTTP 로 응답하며(PORT=3000·HOSTNAME=0.0.0.0 이 강제로 설정됨), 컨테이너가 시작되고 10초 안에 / 요청에 응답해야 하고, 사용자 1000:1000 으로 실행됩니다. 이 책의 서버는 / 에서 바로 응답하고, 이미지에는 서버 파일 두 개만 담습니다.
Dockerfile — RIDM Apps 이미지 — 서버만코드 자리: cat Dockerfile · 없거나 get-book-code 가 "다름"이면 node scripts/get-book-code.mjs · 손으로 고치지 않는다 · 원문(사람용 — AI 는 열지 않는다)
.dockerignore — 이미지에서 뺄 것 — miniapp·테스트·.env코드 자리: cat .dockerignore · 없거나 get-book-code 가 "다름"이면 node scripts/get-book-code.mjs · 손으로 고치지 않는다 · 원문(사람용 — AI 는 열지 않는다)
.gitignore — 저장소에 올리지 않을 것 — node_modules·dist·.ait·.env코드 자리: cat .gitignore · 없거나 get-book-code 가 "다름"이면 node scripts/get-book-code.mjs · 손으로 고치지 않는다 · 원문(사람용 — AI 는 열지 않는다)
miniapp/)를 커밋해 올립니다. .env.local·node_modules·.ait 는 .gitignore 때문에 올라가지 않습니다. 올리기 전에 git status 로 키가 든 파일이 없는지 봅니다콘솔 → 내 앱에서 앱 추가를 누릅니다. 약관 → 플랜 → 이름(PART 0 결정서의 RIDM 앱 이름) → 깃허브 → 검토 순서입니다. 깃허브 단계에서 GitHub 앱 설치 화면이 새 창으로 열립니다(아무 창도 안 뜨면 팝업 차단을 풉니다). 설치가 끝나면 저장소 연결 창에서 저장소와 브랜치를 고르고 연결을 누릅니다. 빌드가 성공하면 자동 검사를 거쳐 <이름>.ridm.ai 가 공개됩니다.
콘솔 → 내 앱 → 앱 카드 → 환경변수에서 세 개를 넣습니다. 저장하면 앱이 새 값으로 다시 시작됩니다. 저장한 값은 다시 볼 수 없고 이름만 보입니다.
| 이름 | 값 |
|---|---|
HRUM_API_KEY | PART 2-2 에서 보관해 둔 HRUM API 키 — 여러분이 콘솔 칸에 직접 붙여넣습니다. AI 에게 키를 보내지 않습니다 |
TOSS_APP_NAME | 앱인토스 appName (예: my-today) |
TRUST_PROXY | 1 — RIDM Apps 게이트웨이가 X-Real-IP 를 덮어써 넘기므로 그 값으로 방문자를 구분(PART 3-2) |
EXTRA_ORIGINS·HRUM_BASE_URL 은 운영에서 넣지 않습니다. RIDM Apps 의 「AI 연결」(앱 전용 키를 플랫폼이 넣어 주는 기능)은 배포 가이드에 준비 중으로 적혀 있어, 이 책은 직접 넣는 방법을 씁니다. 「AI 연결」이 열린 뒤 켜려면 직접 넣은 HRUM_API_KEY 를 먼저 지워야 합니다.
① 앱 깨우기 — 무료 플랜 앱은 15분 동안 요청이 없으면 멈추고, 멈춘 뒤 첫 방문은 몇 초 늦습니다. curl·모니터링·HEAD 요청은 앱을 깨우지 않아 「대기 중」 안내를 볼 수 있습니다. 먼저 브라우저로 https://<이름>.ridm.ai/health 를 한 번 엽니다.
② 설정 확인 — 브라우저 화면이나 아래 명령의 결과가 {"ok":true,"keySet":true,"appNameSet":true} 이면 키와 appName 이 들어간 것입니다(키 값은 나오지 않습니다).
curl -s https://내앱.ridm.ai/health
③ 실제 호출 한 번 — 콘솔 QR 테스트 Origin 을 붙여 진짜 HRUM 까지 한 번 부릅니다. 이 요청은 HRUM 호출 1건으로 크레딧이 차감됩니다.
curl -s -X POST https://내앱.ridm.ai/api/today \
-H "Content-Type: application/json" \
-H "Origin: https://<appName>.private-apps.tossmini.com" \
-d '{"year":1990,"month":5,"day":15,"hour":12,"minute":0,"gender":"male"}'이 책을 쓸 때 같은 명령(예시 생년월일 1990-05-15 12:00, 남성)을 실제 HRUM 에 붙인 서버로 보내 받은 응답입니다(2026-10-28, 키는 서버 환경변수에만 있었고 응답에는 들어 있지 않습니다). 날짜가 바뀌면 값도 바뀝니다.
{
"date": "2026-10-28",
"dayGanji": "을해",
"dailyFlow": "오늘(을해일) 목 에너지가 흘러 성장·시작에 유리해.",
"relation": "만남의 날",
"color": {
"name": "아이보리",
"hex": "#FFF4D9"
},
"food": "흰살생선 구이",
"keyword": "투명",
"message": "만남이 선택과 정리로 이어지는 날이에요. 좋은 인연과 아닌 인연, 필요한 일과 덜어낼 일을 구분하기 좋아요.",
"luckyHour": "오후 5시 ~ 오후 7시",
"avoidHour": "오전 3시 ~ 오전 5시",
"activity": "결산·회계 정리"
}"relation"·"message" 가 든 JSON 이 오면 서버 준비는 끝입니다. 콘솔 → 사용량에 today 호출이 한 건 보입니다. 같은 명령을 한 번 더 보내면 "cached":true 가 붙고 사용량은 늘지 않습니다. 503 이 오면 부록 D 를 봅니다.
항상 켜 두려면: 무료 플랜은 잠들기 때문에 첫 사용자가 몇 초 기다릴 수 있습니다. 미니앱은 15초까지 기다리고 안내를 띄우게 만들어 두었습니다. 늘 깨어 있어야 하면 앱 카드에서 유료 플랜으로 바꿉니다 — 플랜별 금액은 요금표에서 봅니다.
앱인토스 내용은 2026-10-28 에 앱인토스 개발자센터 문서를 직접 읽고 요약했고, 2026-10-30 에 문서와 다시 대조했습니다. 정책·화면은 바뀔 수 있으니 시작 전에 원문을 다시 확인하세요.
AI용 분할본 · 지도 4단계(서버 배포) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 3 서버 만들기 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)