Stack & 구조

월 ≤ $25 운영비로 문의·제휴·견적을 검증하기 위한 구성 요소와 흐름입니다.

특정 SaaS에 묶이지 않도록 무료/저가 티어와 표준 API 위주로 구성하고, 동일한 추상화를 거쳐 저장소를 교체할 수 있게 만들었습니다.

솔루션

현재 사용 중인 8개 구성요소

Vercel Pro

유료 · $20

Next.js 호스팅 · Analytics · Speed Insights

production + preview 자동 배포, 무중단 롤백

도메인

유료 · ~$1

mvp.plomus.com

Cloudflare DNS → Vercel

Firebase Authentication

무료 티어 · $0

Google 로그인 (관리자 전용)

GoogleAuthProvider 단일 채택, 무료 티어

Firestore

무료 티어 · $0

adminUsers 권한 문서

1개 컬렉션, 업무 원장은 보관하지 않음

Google Sheets API

무료 티어 · $0

업무 원장 (문의 · 제휴 · 견적 · 운영로그)

기본 DB provider, CSV/XLSX 즉시 export 가능

Upstash Redis

무료 티어 · $0

공개 폼 ratelimit · Sheets write queue · Discord 헬스

free tier 내 키 3종 사용

Discord Webhook

무료 티어 · $0

신규 접수 알림 (best-effort)

fire-and-forget, 실패해도 폼 응답 영향 없음

PostgreSQL provider

선택 · $0

선택형 대체 원장

DB_PROVIDER=postgres 전환 가능, 동일 facade 사용

월 고정비 합계는 Vercel Pro + 도메인 기준 약 $21이며, 한도는 config/mvp-cost-guard.json 의 $25입니다. 신규 의존성을 추가하기 전에 npm run guard:cost 가 통과해야 합니다.

시스템 구조

요청이 거치는 레이어

  1. 1

    사용자 / 운영자 (브라우저)

    공개 폼 3종 + 관리자 콘솔. 모바일 퍼스트 (Pretendard, Tailwind).

  2. 2

    Next.js App Router (Vercel)

    공개 페이지(SSR) + Route Handler API. 모든 라우트 runtime=nodejs. 보안 헤더 + JSON-LD + sitemap.

  3. 3

    lib/security · lib/auth (서버)

    honeypot + Upstash ratelimit (10분/5건) → 통과 시에만 다음 단계. requireAdmin = ID Token + adminUsers 검증.

  4. 4

    lib/db facade (provider 추상화)

    createRecord/listRecords/patchRecord 단일 진입점. DB_PROVIDER env 1회 캐싱, google_sheets 또는 postgres 분기.

  5. 5

    Google Sheets API · PostgreSQL · Firestore

    업무 원장(Sheets/Postgres) + 권한(Firestore adminUsers). 운영자가 시트에서 직접 CSV export 가능.

  6. 6

    Upstash Redis · Discord Webhook

    Redis: ratelimit / Sheets write queue / Discord 헬스 카운터. Discord: 신규 접수 fire-and-forget 알림.

관리자 권한 외에는 클라이언트가 저장소에 직접 접근하지 않습니다. 모든 쓰기·조회는 Route Handler 를 거쳐 동일한 facade 로 모입니다.

워크플로우

네 가지 핵심 흐름

공개 폼 제출 (방문자)

  1. 방문자가 /contact · /partner · /estimate 폼 제출
  2. Route Handler: honeypot 검사 → Upstash ratelimit 검증 → Zod 스키마 파싱
  3. lib/db.createRecord 로 active provider 에 저장 (기본 Google Sheets)
  4. Discord webhook fire-and-forget (실패 시 discordHealth fail 카운터)
  5. ok 응답 + 안내 카피

관리자 검토

  1. 운영자가 /admin/login 진입 → Google 로그인 (ID Token 발급)
  2. /admin 진입 시 requireAdmin: adminUsers/{uid}.active=true && role∈{admin, super_admin} 검증
  3. 탭별 목록 조회 (inquiries / partners / estimates) + 필터/페이지네이션
  4. status · priority · adminMemo PATCH → activity log 자동 기록

비용 · 운영시간 · v1 KPI 모니터링

  1. /admin 진입 시 /api/admin/ops/metrics 1회 호출
  2. cost(월 고정비) + operation(오늘 PATCH 추정 분) + queue(Sheets KV) + kpi(H1·H2·H3·H4) + discord(7일 헬스) 한 응답으로 반환
  3. 운영자가 카드 한 줄로 가드레일 + KPI 부족분을 확인
  4. Lighthouse CI + Vercel Analytics 가 외부에서 성능·트래픽 추이를 별도 추적

No lock-in 점검 (분기 1회)

  1. npm run drill:portability → sheets:headers:check + guard:cost + build 묶음 실행
  2. Sheets 5개 탭 CSV export 가능 여부 (운영자 수동 점검)
  3. /api/admin/ops/metrics 응답 형태(cost/operation/queue/kpi/discord) 점검
  4. 이전 필요 시 docs/11-portability-plan.md §3 의 대체 경로로 이동

검증

실제 수요가 들어오는지부터 같은 구조로 확인합니다.

문의 접수하기