RIDM Apps 배포 가이드
RIDM Apps는 GitHub 저장소를 연결하면 빌드·배포하고 <이름>.ridm.ai 로 공개하는 호스팅입니다. 신청은 콘솔의 내 앱에서, 요금은 요금 페이지에서 확인하세요. 이용 조건은 이용약관 제3장이 정합니다. 무엇이 들어 있는지 한눈에 보려면 앱 호스팅 소개를 보세요.
배포 흐름
- 신청 — 내 앱에서 플랜과 주소(서브도메인)를 고릅니다. 주소는 나중에 바꿀 수 없습니다.
- GitHub 연결 — 앱 화면에서 GitHub App
ridm-apps-builder를 설치하고 저장소와 브랜치를 고릅니다. 권한은 저장소 읽기뿐입니다. - 푸시 — 연결한 브랜치에 푸시할 때마다 빌드가 시작됩니다. 빌드 기록과 실패 로그는 앱 화면에 표시됩니다.
- 첫 배포 — 빌드가 성공하면 자동 검사를 거쳐 바로 공개됩니다(아래). 그 뒤의 푸시도 자동으로 반영됩니다.
Dockerfile 요구사항
- 저장소 루트에
Dockerfile이 있어야 합니다. 없으면 빌드가 실패합니다. - 앱은 포트 3000에서 HTTP로 응답해야 합니다.
PORT=3000,HOSTNAME=0.0.0.0이 강제로 설정됩니다. 컨테이너가 시작되고 10초 안에/요청에 응답해야 합니다(상태 코드는 상관없음). 그 안에 응답하지 않으면 시작 실패로 처리되고, 새 버전이면 이전 버전이 계속 서비스됩니다. - 컨테이너는 사용자 1000:1000으로 실행됩니다. 앱 파일은 이 사용자가 읽을 수 있어야 합니다(
node:*-alpine이미지의node사용자가 1000입니다). - 파일 시스템은 읽기 전용입니다. 쓸 수 있는 곳은
/tmp와/app/.next/cache(둘 다 메모리 기반, 재시작 시 사라짐)뿐입니다. 영구 데이터는 DB에 저장하세요. - 빌드는 x86_64(amd64)로 합니다. 빌드 시간 한도는 20분입니다.
- 저장소에 비밀값이 보이면 빌드를 멈춥니다: AWS 액세스 키, GitHub 토큰, Stripe 라이브 키, 개인 키 블록, 비밀번호가 들어간 PostgreSQL URL. 비밀값은 환경변수로 넣으세요.
Next.js 스타터
next.config.js에 output: 'standalone'을 넣고 아래 Dockerfile을 저장소 루트에 두세요. public 폴더가 없으면 그 줄은 지웁니다.
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build --chown=1000:1000 /app/public ./public
COPY --from=build --chown=1000:1000 /app/.next/standalone ./
COPY --from=build --chown=1000:1000 /app/.next/static ./.next/static
USER 1000
EXPOSE 3000
CMD ["node", "server.js"]
Next.js가 아니어도 됩니다. 포트 3000에서 응답하는 컨테이너면 어떤 스택이든 동작합니다.
실행 환경
- 무료 플랜은 방문이 있을 때 켜지고 15분 동안 요청이 없으면 멈춥니다. 멈춘 뒤 첫 방문은 몇 초 늦을 수 있습니다. 검색 로봇·모니터링 요청·HEAD 요청은 앱을 깨우지 않습니다.
- 유료 플랜은 상시 실행됩니다. 앱이 죽으면 자동으로 다시 시작합니다.
- 메모리를 넘기면 앱이 강제 종료됩니다. Node.js 힙 한도는 플랜 메모리의 75%로 설정됩니다.
- WebSocket은 지원하지 않습니다(연결 업그레이드 요청은 501). 실시간 기능은 SSE나 폴링을 쓰세요.
- 외부로 나가는 HTTPS 요청은 가능합니다. 메일 발송 포트(SMTP)와 내부망은 막혀 있습니다. 메일이 필요하면 HTTPS API 방식의 메일 서비스를 쓰세요.
- 앱 로그(stdout·stderr)는 장애 대응 때 운영자가 조회할 수 있으며, 호스트를 떠나기 전에 환경변수 값·DB 비밀번호·토큰·이메일 등이 가려집니다(약관 제20조).
쿠키
여러 파트너 앱이 ridm.ai 아래에 있으므로, 게이트웨이가 쿠키를 앱 주소에만 묶습니다. 앱 코드는 평소처럼 쿠키를 쓰면 됩니다. 다만:
- 쿠키는 항상
Secure,Path=/이고Domain속성은 무시됩니다. - 쿠키 이름은 57자 이하여야 합니다. 더 긴 이름의 쿠키는 버려집니다.
- 브라우저 자바스크립트(
document.cookie)로 만든 쿠키는 서버로 전달되지 않습니다. 서버가 읽어야 하는 쿠키는 서버 응답의Set-Cookie로 만드세요.
데이터베이스
앱마다 전용 PostgreSQL DB가 만들어지고, 접속 정보가 환경변수로 들어옵니다: DATABASE_URL(SSL 필수)과 PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD, PGSSLMODE. 용량 한도는 플랜마다 다르며 앱 화면에 사용량이 표시됩니다.
DB 연결은 인증서까지 검증하는 TLS입니다. 인증서 발급 기관(Amazon RDS)은 컨테이너에 미리 설치되어 있어서(NODE_EXTRA_CA_CERTS·PGSSLROOTCERT) 코드에 SSL 옵션을 따로 넣지 않아도 됩니다 — new Pool({ connectionString: process.env.DATABASE_URL, max: 2 })면 됩니다. 연결은 앱당 3개까지라 풀 크기는 2 이하로 두세요.
- 연결은 앱당 동시 3개까지, 쿼리 하나는 10초, 트랜잭션 안에서 60초 넘게 쉬면 끊깁니다.
- 사용량이 80%를 넘거나 용량을 넘으면 이메일로 알려 드립니다.
- 용량을 넘은 상태가 24시간 이어지면(150%를 넘으면 즉시) DB가 읽기 전용이 됩니다. 데이터를 지우려면 연결에서
SET default_transaction_read_only = off를 먼저 실행하세요. - 읽기 전용 상태에서 110%를 넘으면 DB 연결을 끊습니다. 데이터는 지우지 않으며 백업은 계속 만들 수 있습니다.
- 용량의 90% 아래로 줄이거나 더 큰 플랜으로 바꾸면 5분 안에 풀립니다.
환경변수
- 앱 화면의 "환경변수"에서 추가·삭제합니다. 저장한 값은 암호화되어 보관되고 다시 볼 수 없습니다(이름만 표시). 바꾸려면 새 값으로 덮어쓰세요.
- 저장하면 앱이 새 값으로 다시 시작됩니다.
- 이름은 대문자·숫자·밑줄만(숫자로 시작 불가, 64자 이하), 값은 한 줄 2KB 이하, 앱당 50개까지.
- 플랫폼이 쓰는 이름은 설정할 수 없습니다:
PORT,HOSTNAME,NODE_OPTIONS,DATABASE_URL,RIDM_·PG로 시작하는 이름.
첫 배포와 자동 검사
첫 빌드가 성공하면 자동 검사를 거쳐 자동으로 승인되고, 바로 주소가 공개됩니다. 첫 배포가 공개되기 전에는 유료 요금이 차감되지 않습니다. 저장소에 비밀값(키·토큰·비밀번호)이 들어 있으면 빌드가 실패합니다. 새 외부 접속 대상·새 위험 패턴이 발견되거나 저장소 소유자가 바뀌어도 배포는 자동으로 반영되며, 그 내용은 기록됩니다. 모든 자동 승인과 검사 결과는 기록되고 운영자가 사후에 확인하며, 문제가 있으면 공개를 중지할 수 있습니다. 공개가 중지되면 사유를 이메일과 앱 화면으로 알려 드립니다. 금지 행위는 약관 제26조를 보세요.
요금·한도
플랜별 요금·메모리·DB·월 전송은 요금 페이지에 있습니다. 유료 플랜 요금은 충전한 크레딧에서 매월 차감됩니다. 결제일에 잔액이 부족하면 앱이 멈추고, 충전하면 자동으로 재개됩니다. 월 전송량은 방문자에게 보낸 응답과 앱이 밖으로 보낸 트래픽(외부 API 호출·업로드·DB 쓰기 포함)을 합한 양입니다. 한도에 이르면 공개와 앱 실행이 함께 멈추며(다음 달 1일에 재개), 유료 플랜은 앱 화면에서 전송 블록을 사면 몇 분 안에 다시 켜집니다. 80%와 한도 도달 때 이메일로 알려 드립니다.
백업·해지
- 앱 화면의 "데이터베이스 백업"으로 DB 덤프를 만들 수 있습니다. 1시간 동안 유효한 내려받기 주소가 나오며, 하루 3번까지 만들 수 있습니다.
- 해지하면 유료 플랜은 이미 결제한 기간이 끝나는 날 멈추고, 그 뒤 30일 동안 데이터를 내려받거나 되돌릴 수 있습니다. 30일이 지나면 앱과 DB가 삭제되어 복구할 수 없습니다. 차감된 요금은 환불되지 않습니다.