기획 2026-10-20 docs/planning/2026-10-20-8-배포-대상-검토.md GitHub에서 보기

배포 대상 검토 (WBS 5.1)

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 로 결정. 상태 갱신, 배포 가이드 연결