프로젝트 만들기

운영·배포 문서

서비스가 어떻게 돌아가는지 한 장으로 정리한 개요입니다. 자격 증명, 토큰이 든 주소, 계정 정보는 이 문서에 넣지 않습니다.

구성

부분무엇하는 일
웹·APICloud Run 서비스 n8-api (서울, 최소 인스턴스 0)모든 화면과 API. 참여·관리·결과 페이지를 서버에서 그립니다.
정규화Cloud Run Job n8-normalize클립 하나를 1080×1920 공통 규격으로 다듬고 자막을 넣습니다.
렌더Cloud Run Job n8-render풀버전·전체 상영본(재인코딩 없이 이어 붙이기)과 릴스(새로 인코딩)를 만듭니다.
스케줄러Cloud Scheduler n8-deadline1분마다 내부 tick을 부릅니다. 스케줄러 인증 토큰이 없는 호출은 거절합니다.
DBPostgres (Neon 무료 플랜)프로젝트·챕터·참여자·클립·렌더 행과 작업 큐. 고정비 없음.
파일Cloudflare R2 (위치 힌트 APAC)원본, 정규화본, 결과 영상. 브라우저가 사전서명 URL로 직접 올리고 받습니다.

서비스와 Job 두 개는 같은 컨테이너 이미지를 씁니다. 작업 큐는 DB 테이블이고, 디스패처가 DB 락으로 슬롯을 잡아 Job 실행을 띄웁니다.

처리 흐름

  1. 생성 — POST /projects. 관리 토큰과 참여 슬러그를 만들고 바로 collecting이 됩니다.
  2. 업로드 — 참여 화면이 업로드 URL을 받아 R2에 직접 PUT합니다. 이름·필수 동의·브라우저 토큰이 없으면 URL을 주지 않습니다.
  3. 완료 콜백 — 브라우저가 완료를 알리면 R2 객체를 확인하고 클립을 processing으로 바꾼 뒤 정규화 작업을 큐에 넣습니다. 이 응답 뒤에 참여 화면이 “받았어요”를 띄웁니다.
  4. 정규화 — Job이 원본을 받아 ffmpeg로 다듬고 정규화본을 R2에 올린 뒤 ready로 바꿉니다. 참여 화면은 상태를 보다가 “올라갔어요”로 바꿉니다.
  5. 마감·렌더 요청 — 마감 tick 또는 영상 만들기가 올리기를 닫고 렌더 행을 queued로 넣습니다. 렌더 세대는 프로젝트마다 하나뿐입니다.
  6. 렌더 — 챕터별 풀버전 → 전체 상영본 → 챕터별 릴스 순서로 만들고 done이 되면 프로젝트가 ready가 됩니다.
  7. 공개 — ready이고 전체 상영본이 있을 때만 됩니다. 결과 슬러그를 만들고 보관 기한(14일·30일)을 기록합니다.
  8. 보관 정리 — 기한이 지나면 tick이 R2와 DB를 정리합니다. 보관 기간 참고.

매분 작업 (tick)

스케줄러가 1분마다 POST /internal/tick을 부릅니다. 한 번에 하는 일:

상태

프로젝트

collecting → closed → (렌더) → ready → revealed → expired

클립

uploading → processing → ready | rejected | failed → deleted

거절·실패 사유: too_short(5초 미만), unsupported(영상 없음), decode_error, timed_out, upload_expired.

렌더

queued → running → done | failed, 그리고 stale → deleted

재오픈이나 자동 볼륨 변경이 있으면 그 클립이 든 done 렌더는 stale이 되어 화면과 다운로드에서 빠집니다. 같은 종류의 새 렌더가 done이 되면 이전 done·stale은 deleted가 되고 파일도 지웁니다.

주소 규칙

주소화면접근
/프로젝트 만들기누구나
/admin/{관리 토큰}관리 화면관리 토큰. 없거나 참여 슬러그면 403
/j/{참여 슬러그}참여 화면링크를 아는 사람, noindex
/r/{결과 슬러그}결과 화면공개 뒤 링크를 아는 사람, noindex. 공개 전 404, 보관 끝 410

관리 API는 Authorization: Bearer 관리 토큰을 받습니다. 결과 슬러그는 참여 슬러그와 따로인 22자 무작위 값이고 공개할 때 만들어집니다. 결과 영상 다운로드는 R2 사전서명 URL로 302 리다이렉트하며, 주소가 렌더 id가 아니라 종류·챕터 기준이라 다시 만든 영상도 같은 링크로 나갑니다.

영상 규격

용량·시간

항목값
프로젝트 상한주인공 10, 참여자 20(살아 있는 클립이 있는 사람만), 살아 있는 클립 200
클립5~15초, 100MB 이하(브라우저에서 먼저 거름)
업로드 URL 발급 제한IP당 10분 60회, 프로젝트당 1시간 300회. 넘으면 429
동시 실행정규화 최대 7, 렌더 최대 1(별도 슬롯). 서울 리전 할당량 20 vCPU / 40 GiB 안에 API까지 맞춘 값
목표 시간완료 콜백 → ready 2분 이내(20명 동시). 전체 렌더: 클립 60개 10분, 200개 20분
실측(2026-11-02, 실기기 클립 섞음)업로드 시작 → ready: 클립 60개 약 4.5분(그중 렌더 Job 약 1.9분), 200개 약 14분(렌더 Job 약 6.4분)

배포·롤백

자격 증명

비용

알려진 한계