AI용 분할본 · 지도 4단계(서버 배포) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 3 서버 만들기 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)

핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다

  1. 사용자가 결정 질문(PART 0 지침 1)에 답하고 승인하기 전에는 코드를 한 줄도 쓰지 않는다.
  2. HRUM API 키는 서버 환경변수 HRUM_API_KEY 에만 둔다. 미니앱 코드·.env·채팅·커밋·로그에 쓰지 않고, 키 값을 사용자에게 달라고 하지 않는다. 미니앱은 내 서버만 부른다.
  3. 책 코드 파일은 다시 쓰지 않는다 — node scripts/get-book-code.mjs 가 책 그대로 만든다(처음에는 부록 A-2 의 curl 한 줄). 분할본의 코드 자리는 「경로」 한 줄이다 — 받은 파일을 cat 으로 읽는다.
  4. 앱인토스 내용은 각 장 끝 출처의 공식 문서가 우선이다. 다르면 문서를 따르고 사용자에게 알린다.
  5. 확인은 명령 출력으로 증명한다. 콘솔 화면(앱인토스·HRUM)은 사용자가 누르고, AI 는 대신 가입·로그인하지 않는다. 진행은 PROGRESS.md 에 적는다.
  6. AI 는 지도(https://console.hrum.ai/tossEbook/ — 같은 지도가 tossEbook/ai.html 에도 있다)의 단계 순서대로 그 단계의 페이지만 읽는다. 전체본 tossEbook.html 은 사람용이다.

PART 5 — 서버를 RIDM Apps 에 올리기

미니앱이 부를 서버를 https://<이름>.ridm.ai 로 공개합니다. 미니앱 화면은 여기에 올리지 않습니다 — 화면은 PART 6 에서 앱인토스 콘솔에 번들로 올립니다.

5-1. 배포 파일

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 는 열지 않는다)

5-2. GitHub 에 올리기

  1. GitHub 에서 Private 저장소를 만듭니다
  2. 프로젝트 폴더(서버 파일 + miniapp/)를 커밋해 올립니다. .env.local·node_modules·.ait 는 .gitignore 때문에 올라가지 않습니다. 올리기 전에 git status 로 키가 든 파일이 없는지 봅니다
  3. RIDM Apps 는 저장소에 비밀값(키·토큰·비밀번호)이 들어 있으면 빌드를 실패시킵니다

5-3. 앱 추가 · 저장소 연결

콘솔 → 내 앱에서 앱 추가를 누릅니다. 약관 → 플랜 → 이름(PART 0 결정서의 RIDM 앱 이름) → 깃허브 → 검토 순서입니다. 깃허브 단계에서 GitHub 앱 설치 화면이 새 창으로 열립니다(아무 창도 안 뜨면 팝업 차단을 풉니다). 설치가 끝나면 저장소 연결 창에서 저장소와 브랜치를 고르고 연결을 누릅니다. 빌드가 성공하면 자동 검사를 거쳐 <이름>.ridm.ai 가 공개됩니다.

5-4. 환경변수 넣기 — 사람이 직접

콘솔 → 내 앱 → 앱 카드 → 환경변수에서 세 개를 넣습니다. 저장하면 앱이 새 값으로 다시 시작됩니다. 저장한 값은 다시 볼 수 없고 이름만 보입니다.

이름값
HRUM_API_KEYPART 2-2 에서 보관해 둔 HRUM API 키 — 여러분이 콘솔 칸에 직접 붙여넣습니다. AI 에게 키를 보내지 않습니다
TOSS_APP_NAME앱인토스 appName (예: my-today)
TRUST_PROXY1 — RIDM Apps 게이트웨이가 X-Real-IP 를 덮어써 넘기므로 그 값으로 방문자를 구분(PART 3-2)

EXTRA_ORIGINS·HRUM_BASE_URL 은 운영에서 넣지 않습니다. RIDM Apps 의 「AI 연결」(앱 전용 키를 플랫폼이 넣어 주는 기능)은 배포 가이드에 준비 중으로 적혀 있어, 이 책은 직접 넣는 방법을 씁니다. 「AI 연결」이 열린 뒤 켜려면 직접 넣은 HRUM_API_KEY 를 먼저 지워야 합니다.

5-5. 배포 확인

① 앱 깨우기 — 무료 플랜 앱은 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건으로 크레딧이 차감됩니다.

명령 (주소·appName 은 내 값)
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, 키는 서버 환경변수에만 있었고 응답에는 들어 있지 않습니다). 날짜가 바뀌면 값도 바뀝니다.

실제 응답 (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 한 줄부터)