Cloudflare Pages + Supabase + Upstash 무료 티어로 SaaS 포털 운영하기
graxel.ai 포털을 월 0원으로 운영하는 실제 스택 구성 — wrangler, GitHub Actions, 한계와 우회법까지 상세 공유.
저는 GRAXEL 포털(graxel.ai)을 월 0원 인프라로 운영하고 있습니다. 프로덕션 트래픽을 실제로 받는 서비스인데도 청구서가 오지 않는 구조가 어떻게 가능한지, 제가 겪은 시행착오와 함께 정리해봤습니다.
전체 스택 한눈에
포털의 핵심 의존성은 크게 세 가지입니다. 프론트엔드는 Cloudflare Pages, 데이터/인증은 Supabase Free, 캐시와 Rate Limit은 Upstash Redis Free입니다. 여기에 GitHub Actions로 CI/CD를 붙였고, DNS는 Cloudflare 무료 플랜을 씁니다.
1. Cloudflare Pages + OpenNext
Next.js 15 App Router를 Cloudflare Pages에서 서빙하기 위해 @opennextjs/cloudflare를 사용합니다. pnpm build:cloudflare 스크립트가 OpenNext 빌드를 돌리고, 이후 scripts/fix-cloudflare-pages.js로 산출물을 패치합니다.
pnpm build:cloudflare
wrangler pages deploy .open-next/assets
실제 배포는 수동 명령이 아니라 .github/workflows/deploy-cloudflare-portal.yml이 담당합니다. main 브랜치에 푸시하면 GitHub Actions가 wrangler를 호출해서 자동 배포합니다.
2. Supabase Free Tier
인증(NextAuth v5 OAuth), entitlements, subscriptions, audit_log 같은 핵심 테이블을 모두 Supabase에 두고 있습니다. 500MB 스토리지와 50,000 MAU가 무료라서 초기 트래픽에는 충분합니다. 공식 문서는 supabase.com/docs에서 확인할 수 있습니다.
3. Upstash Redis
로그인 시도 Rate Limiting, 세션 캐시, OAuth state 보관에 Upstash를 씁니다. HTTP 기반 REST API라서 Cloudflare Workers 런타임과도 호환됩니다. 일 10,000건 무료 한도 내에서 운영 가능합니다.
0원 유지의 실제 한계
솔직히 말해 무료 티어가 공짜 점심은 아닙니다. 제가 실제로 부딪힌 제약을 공유합니다.
- ISR 불가 —
open-next.config.ts에서incrementalCache: 'dummy'로 설정합니다. Cloudflare Free에서는 ISR을 지원하지 않아 모든 라우트를 SSR 또는 정적으로 취급해야 합니다. - Supabase 비활성 일시중지 — 7일간 쿼리가 없으면 프로젝트가 pause됩니다. 저는 Oracle 서버에서 주기적인 헬스체크를 돌려 해결했습니다.
- 콜드 스타트 — Workers 런타임은 빠르지만, 서버 컴포넌트에서 외부 API 여러 개를 직렬로 호출하면 TTFB가 눈에 띄게 늘어납니다. 저는 가능한 한 Promise.all로 병렬화합니다.
- 빌드 캐시 파편화 — OpenNext 빌드는
.open-next/에 산출물을 내는데, 캐시가 꼬이면 이상한 런타임 에러가 납니다.pnpm build:cloudflare스크립트는 매번 캐시를 clear하도록 작성했습니다.
환경 변수 분리
공개 변수는 wrangler.toml의 [vars]에 두고, 민감한 값은 Cloudflare Dashboard Secrets에 둡니다. NEXTAUTH_URL과 AUTH_* 값은 반드시 Secrets로 관리해야 합니다. Next.js 공식 배포 문서도 참고하세요 — nextjs.org/docs.
모니터링은 어떻게?
Sentry Free(월 5,000 이벤트)로 에러를, Cloudflare Analytics 기본 제공으로 트래픽을 봅니다. 더 상세한 셋업은 클라우드 무료 인프라 가이드에 정리했습니다.
언제 유료로 전환할까
제 기준은 명확합니다. ① Supabase DB가 400MB를 넘거나, ② Upstash 호출이 일 8,000건을 넘거나, ③ Pages 빌드 분이 월 450분을 넘으면 유료 전환을 검토합니다. 그 전까지는 무료 플랜을 공격적으로 사용합니다.
마무리
프로젝트 구조나 운영 배경이 궁금하시면 소개 페이지를 참고해 주세요. 구체적인 협업 문의는 연락처로 남겨주시면 답변드립니다. 구성의 전체 맥락은 Oracle ARM 프로덕션 운영기와 함께 읽으면 훨씬 명확할 겁니다. Cloudflare 공식 Pages 문서도 한 번쯤 훑어보시길 추천합니다 — developers.cloudflare.com/pages.
공유하기
이어 읽으면 좋은 글
같은 주제와 태그를 기준으로 GRAXEL 운영 맥락을 더 깊게 볼 수 있는 글입니다.
Thunderbolt 5 브릿지로 Mac 2대를 내부 네트워크로 연결한 후기
120Gbps TB5 케이블 한 개로 New Mac과 Old Mac을 직결해서 10.200.0.x 사설망을 구성하고, rsync로 개발/스테이징을 분리한 실제 구성.
Oracle Cloud Always Free ARM 24GB로 프로덕션 API 서빙하기
4 OCPU, 24GB RAM, 200GB 디스크를 영구 무료로 받아 pgvector PostgreSQL 17 + Rust Axum API + Ollama를 Cloudflare Tunnel로 서빙한 기록.
Cloudflare Pages 무료 티어로 SaaS 시작하기 — 진짜 1년 비용 후기
1인 개발자가 Cloudflare Pages 무료 티어로 1년간 portal, myhyetaek 등 5개 서비스를 운영하며 지출한 실제 비용과 뼈아픈 실패담을 공개합니다.