O2O CastAD Backend
인프라 아키텍처 및 비용 산출 문서
1DB 및 서버 부하 분산 방법
Nginx 로드밸런싱, 커넥션 풀 관리, 단계별 수평 확장 전략
현재 구현 현황 (단일 인스턴스)
- API 커넥션 풀: pool_size=20, max_overflow=20 → 최대
40 - 백그라운드 풀: pool_size=10, max_overflow=10 → 최대
20 - 인스턴스당 총 DB 연결:
40 + 20 = 60 - 풀 리사이클: 280초 (MySQL wait_timeout 300초 이전), pre-ping 활성화
단계별 확장 전략
| 단계 | 동시접속 | App Server | LB | DB ( MySQL Flexible) |
|---|---|---|---|---|
| S1 | ~50명 | x1 | Nginx x1 | Burstable B1ms |
| S2 | 50~200명 | x2~4 | Nginx | GP D2ds_v4 + Replica x1 |
| S3 | 200~1,000명 | API ServerxN + Scheduler |
Nginx | BC D4ds_v4 + Replica x2 + Redis P1 |
커넥션 풀 수치 계산
| 항목 | Stage 1 (1대) | Stage 2 (4대) | Stage 3 (8대) |
|---|---|---|---|
| Main Pool / 인스턴스 | 20+20 = 40 | 10+10 = 20 | 5+5 = 10 |
| BG Pool / 인스턴스 | 10+10 = 20 | 5+5 = 10 | 3+3 = 6 |
| 인스턴스당 소계 | 60 |
30 |
16 |
| Primary 총 연결 | 60 | 4 x 30 = 120 |
8 x 16 = 128 |
| max_connections 권장 | 100 | 200 | 300 |
핵심:
JWT Stateless 설계로 Nginx 세션 어피니티 불필요 (round-robin / least_conn).
Stage 2부터 Read Replica로 읽기 분산, Redis는 Stage 3에서 캐싱/Rate Limiting 도입.
graph TB
subgraph S1["Stage 1: ~50명"]
direction LR
S1N["Nginx
(Reverse Proxy)"] --> S1A["App Server x1"]
S1A --> S1D[" MySQL
Burstable B1ms"]
end
subgraph S2["Stage 2: 50~200명"]
direction LR
S2N["Nginx
(Reverse Proxy)"] --> S2API["APP Server
x 1 ~ 2"]
S2N --> S2WK["Scheduler
Server"]
S2API --> S2P["MySQL BC
Primary
(D4ds_v4)"]
S2API --> S2R1["Read Replica
x1"]
S2WK --> S2P
S2WK --> S2R1
end
subgraph S3["Stage 3: 200~1,000명"]
direction LR
S3N["Nginx
(Reverse Proxy)"] --> S3API["APP Server
x N"]
S3N --> S3WK["Scheduler
Server"]
S3API --> S3P["MySQL BC
Primary
(D4ds_v4)"]
S3API --> S3R1["Read Replica
xN"]
S3API --> S3RD["Redis
Premium P1"]
S3WK --> S3P
S3WK --> S3R1
end
S1 ~~~ S2 ~~~ S3
style S1 fill:#0d3320,stroke:#34d399,stroke-width:2px,color:#e1e4ed
style S2 fill:#3b2506,stroke:#fb923c,stroke-width:2px,color:#e1e4ed
style S3 fill:#3b1010,stroke:#f87171,stroke-width:2px,color:#e1e4ed
2전체 아키텍처 다이어그램
Nginx + FastAPI App Server 구성과 외부 서비스 연동 구조
- 로드밸런서: Nginx (Reverse Proxy, L7 LB, SSL 종단)
- App Server: FastAPI (Python 3.13) — Auth, Home, Lyric, Song, Video, Social, SNS, Archive, Admin, Background Worker
- DB: Database for MySQL Flexible Server — Stage 2+ Read Replica
- 캐시: Cache for Redis (Stage 3 도입)
- 콘텐츠 생성: 가사(ChatGPT) → 음악(Suno AI) → 영상(Creatomate) → SNS 업로드
- 외부 연동: Kakao OAuth, Naver Map/Search API, Blob Storage
graph TB
Client["클라이언트
(Web / App)"]
LB["Nginx
(Reverse Proxy + SSL 종단)"]
subgraph APP["App Server (FastAPI)"]
direction LR
Auth["Auth"] --- Home["Home"] --- Lyric["Lyric"] --- Song["Song"] --- Video["Video"]
Social["Social"] --- SNS["SNS"] --- Archive["Archive"] --- Admin["Admin"] --- BG["BG Worker"]
end
subgraph DB[" MySQL Flexible Server"]
direction LR
Primary["Primary (R/W)"]
Replica["Read Replica"]
end
subgraph AI["AI 콘텐츠 생성 파이프라인"]
direction LR
ChatGPT["ChatGPT
(가사 생성)"]
Suno["Suno AI
(음악 생성)"]
Creatomate["Creatomate
(영상 생성)"]
ChatGPT --> Suno --> Creatomate
end
subgraph EXT["외부 서비스"]
direction LR
Blob[" Blob
Storage"]
Kakao["Kakao
OAuth"]
YT["YouTube /
Instagram"]
Naver["Naver Map /
Search API"]
end
Redis[" Cache for Redis
(Stage 3 도입)"]
Client -->|HTTPS| LB
LB --> APP
APP --> Primary
APP -->|"읽기 전용"| Replica
APP -.->|"Stage 3"| Redis
APP --> AI
APP --> Blob
APP --> Kakao
APP --> YT
APP --> Naver
style Client fill:#1a3a1a,stroke:#34d399,stroke-width:2px,color:#e1e4ed
style LB fill:#1a3a1a,stroke:#34d399,stroke-width:2px,color:#e1e4ed
style APP fill:#1a2744,stroke:#6c8cff,stroke-width:2px,color:#e1e4ed
style DB fill:#2a1f00,stroke:#fb923c,stroke-width:2px,color:#e1e4ed
style AI fill:#2a0f2a,stroke:#a78bfa,stroke-width:2px,color:#e1e4ed
style EXT fill:#0d2a2a,stroke:#34d399,stroke-width:2px,color:#e1e4ed
style Redis fill:#3b1010,stroke:#f87171,stroke-width:1px,color:#e1e4ed
전체 시스템 아키텍처 구성도
콘텐츠 생성 흐름: 사용자 요청 → Naver 크롤링 → ChatGPT 가사 생성 → Suno AI 음악 생성 → Creatomate 영상 생성 → Blob 저장 → YouTube/Instagram 업로드
3예상 리소스 및 비용
기반 단계별 월 예상 비용 (인프라 + 외부 API)
Stage 1 · 동시 ~50명
$170~390
약 22~51만원/월
Stage 2 · 동시 50~200명
$960~2,160
약 125~280만원/월
Stage 3 · 동시 200~1,000명
$3,850~8,500
약 500~1,100만원/월
항목별 비용 상세
| 항목 | Stage 1 | Stage 2 | Stage 3 |
|---|---|---|---|
| App Server | $50~70 | $200~400 | $600~1,000 |
| Nginx | - | 포함 / VM $15~30 | VM $30~60 |
| MySQL Primary | B1ms $15~25 | GP $130~160 | BC $350~450 |
| MySQL Replica | - | GP x1 $130~160 | BC x2 $260~360 |
| Redis | - | - | P1 $225 |
| 스토리지/네트워크 | $10~20 | $55~100 | $160~270 |
| AI API (합계) | $90~280 | $400~1,250 | $2,100~5,800 |
DB 용량 예측 (1년 후)
| Stage 1 (500명) | Stage 2 (5,000명) | Stage 3 (50,000명) | |
|---|---|---|---|
| DB 용량 | ~1.2GB | ~12GB | ~120GB |
| Blob 스토리지 | ~1.1TB | ~11TB | ~110TB |
| MySQL 추천 | 32GB SSD | 128GB SSD | 512GB SSD |
비용 최적화 팁:
3rd party 의존도 낮춰야함
Blob Lifecycle Policy (30일 미접근 → Cool 티어),
Blob Lifecycle Policy (30일 미접근 → Cool 티어),
pie title Stage 3 월 비용 구성 비중
"App Server (APP+Scheduler)" : 800
"Nginx" : 45
"MySQL Primary" : 400
"MySQL Replica x2" : 310
"Redis Premium" : 225
"스토리지/네트워크" : 215
"OpenAI API" : 550
"Suno AI" : 1400
"Creatomate" : 2000
Stage 3 월간 비용 구성 비율 — AI API 비중이 전체의 약 66%