배포 대상 검토 (WBS 5.1)
- 작성일: 2026-10-20
- 작성자: 메인 세션 (조사는 Claude 서브에이전트, 핵심 수치는 메인이 공식 문서로 다시 확인)
- 관련: WBS와 마일스톤 5.1, 5.4, 시스템 구조와 데이터 모델
- 상태: 결정 (2026-10-25, 사용자): Render Free + Neon Free. 진행은 배포 가이드
1. 조건
- 사용자 조건 (10/20): 가급적 무료. Vercel 선호.
- 앱 조건: Phoenix LiveView 는 브라우저와 WebSocket 을 계속 열어 둔다. Oban 은 같은 BEAM 안에서 1초마다 큐를 확인하는 상주 프로세스다. PubSub 와 Presence 는 같은 노드 (또는 연결된 노드) 에 있어야 한다. 그래서 요청마다 떴다 사라지는 서버리스 함수와 맞지 않는다.
- 사용 기간: 지원 마감 (10/25) 뒤 면접까지 1-3개월. 데이터는 합성 데이터라 잃어도 시드로 다시 만들 수 있지만, 면접 직전에 DB 가 지워지면 곤란하다.
2. 비교 (2026-10-20 공식 문서 기준)
| 대상 | 무료 | 잠듦 | WebSocket | DB | 데이터 만료 | 주 위험 |
|---|---|---|---|---|---|---|
| Vercel Hobby | 있음 (비상업) | 5분 뒤 축소 (Container Runtime, 베타) | 베타, 연결 최대 300초 | 외부 | - | LiveView 가 5분마다 재연결, 인스턴스 간 PubSub/Presence 분리, 축소되면 Oban 정지 |
| Render Free | 있음 | 15분 무접속 뒤, 깨우기 약 1분 | 지원 (길이 제한 없음) | 1 GB PG | 30일 뒤 만료, 14일 유예 뒤 삭제 | 첫 접속 지연 |
| Fly.io | 없음 (체험 2시간 또는 7일) | 선택 | 지원 | 유료 ($2-38/월) | - | 비용 |
| Neon Free | 있음 | 5분 무활동 뒤 (끌 수 없음) | - | 1 GB, 월 100 CU-hours | 한도 초과는 정지, 삭제 없음 | 계속 깨어 있으면 월 중순에 CU 소진 |
| Supabase Free | 있음 | 1주 활동 없으면 일시 정지 | - | 500 MB | 정지 (1년 내 복구) | 직결은 IPv6 전용 |
| Gigalixir Free | 있음 (카드 필요) | 30일 무배포 시 | 확인 필요 | 1만 행, 연결 2개 | - | 시드 GL 만 약 2.8만 행이라 불가 |
| Koyeb Free | 있음 | 1시간 무접속 뒤 | 확인 필요 | 월 5 compute-hours | - | DB 시간 부족 |
| Azure F1 | 있음 (카드 필요) | 20분 유휴 뒤 | Linux 동시 5개 | 12개월 무료 PG | 12개월 뒤 과금 | CPU 하루 60분, WebSocket 5개 |
메인이 다시 확인한 항목 (원문 인용 기준):
- Render: "spins down a Free web service that goes 15 minutes without receiving any inbound traffic", 깨우기 "about one minute", 월 750 시간, 무료 Postgres 1 GB 와 "expire 30 days after creation" 뒤 14일 유예 후 삭제. 기존 연결의 WebSocket 메시지도 트래픽으로 센다. 열려 있는 LiveView 탭이 30초마다 heartbeat 를 보내므로 시연 중에는 잠들지 않는다.
- Neon: 프로젝트당 1 GB, 월 100 CU-hours (0.25 CU 로 약 400시간), "Scale to zero is always enabled", 한도 초과는 compute 정지이고 "None of these limits delete your data".
출처: Vercel runtimes, Vercel Hobby, Vercel WebSocket KB, Render free, Render WebSocket, Render Phoenix, Fly.io free trial, Fly.io pricing, Neon plans, Neon pooling, Supabase pricing, Supabase pausing, Gigalixir pricing, Koyeb instances, Azure limits.
확인 필요: Render 무료 인스턴스의 Docker 지원 (문서에 제한 언급 없음, 네이티브 Elixir 런타임은 있음), Vercel 외부 rewrite 의 WebSocket 통과, Koyeb 와 Gigalixir 의 WebSocket.
3. 제안
앱은 Render Free 웹 서비스, DB 는 Neon Free. Vercel 은 쓰고 싶으면 앱으로 링크하는 정적 소개 페이지에만 쓴다.
- 이유: 둘 다 무료이고, WebSocket 길이 제한이 없고, Neon 데이터는 만료되지 않는다. Render 가 잠들면 Oban 폴링도 멈춰 Neon 도 잠들어 CU-hours 를 아낀다.
- Render 무료 Postgres 는 쓰지 않는다. 30일 뒤 만료되어 면접 기간에 사라질 수 있다.
- 깨어 있게 하는 외부 ping 은 두지 않는다. Oban 이 Neon 을 계속 깨워 월 중순에 CU-hours 가 바닥날 수 있다 (조사 에이전트 추정: 상시 가동 시 월 약 182 CU-hours). 대신 면접 2-3분 전에 URL 을 한 번 연다.
- 첫 접속 약 1분 지연이 싫고 월 몇 달러를 낼 수 있으면 Fly.io 머신 + Neon 으로 바꾼다. 앱 구성 (release, Dockerfile, runtime.exs) 은 같다.
- Vercel 을 앱 호스트로 쓰지 않는 이유: Container Runtime 과 WebSocket 이 베타이고, Hobby 의 연결 최대 300초 때문에 LiveView 가 5분마다 끊기고, 인스턴스가 나뉘면 PubSub 와 Presence 가 갈라지며, 축소되면 Oban 이 멈춘다.
4. 결정되면 할 일 (5.4)
mix phx.gen.release로 release 와 (필요하면) Dockerfile 을 만든다.config/runtime.exs의DATABASE_URL,SECRET_KEY_BASE,PHX_HOST는 플랫폼 환경 변수로만 넣는다. 저장소에 값을 두지 않는다.- Neon 은 TLS 가 필수라
ssl: true를 켠다. Oban 의 Postgres notifier 는 LISTEN/NOTIFY 를 쓰므로 Neon 의 pooled 연결이 아닌 직접 연결 문자열을 쓴다 (또는Oban.Notifiers.PG로 바꾼다). ANTHROPIC_API_KEY는 넣지 않아도 Fake 로 동작한다. 넣으면 사용 한도를 확인한다.- 배포 뒤 시드로 데모 데이터를 넣고 S1-S6 을 외부 접속으로 확인한다.
- 사용자가 할 일: Render 와 Neon 계정 만들기, Render 에 GitHub 저장소 연결, 환경 변수 입력 (메인이 목록을 준다).
Changelog
- 2026-10-20: 최초 작성. 무료 대상 8곳 비교, Render + Neon 제안, Vercel 은 정적 소개 페이지 용도
- 2026-10-25: 사용자가 Render Free + Neon Free 로 결정. 상태 갱신, 배포 가이드 연결