유료 텍스트→이미지(txt2img) 생성 서비스 — 구축 블루프린트

목적: 잔여 임차인 자산 perch7/img2_v2.0.31(FLUX.1 기반 상용 이미지 생성기)의 구조를 원형으로, 본인 서버/클러스터에서 유료 서비스로 직접 구축하기 위한 꼼꼼한 설계서. 작성 2026-06-24. 설계 문서(코드 아님). 인프라는 보유 클러스터 기준 매핑(배포 전 가용성 확인). 표기: [원형] perch7/img2에서 확인된 패턴 / [권고] 본 설계의 추천 / [주의] 함정.


0. 한 줄 정의

"프롬프트 → 이미지" 를 API + 웹UI로 제공하고, API 키·크레딧·요금제로 과금하며, 모델/소스 IP를 보호하고, GPU 처리량에 맞춰 스케일하는 상용 생성 서비스.


1. 참조 원형 요약 (perch7/img2에서 배운 것) [원형]

요소 perch7 구현 의미
엔진 FLUX.1-schnell + T5 텍스트인코더 + taef1(경량 VAE) distilled 고속 txt2img
차별화 커스텀 모델(_docker_model 7.2GB) + LoRA(v46-cfgbake) 자체 스타일/품질
가속 nunchaku(SVDQuant 4-bit) + SageAttention + NVFP4 변환 저VRAM·고속
서빙 Deno server.js + ui.html + 포트 3000, start.sh UI 달린 제품
IP보호 server.py.enc(암호화 소스) + key_hash.txt(키 게이팅) 코드/접근 보호
운영 HF 미러 스왑(게이트 회피), avifenc(AVIF 출력) 배포 견고화

→ 핵심 교훈: "공개 베이스 모델 + 비공개 차별화(LoRA/튜닝) + 양자화 가속 + 과금/보호 계층" 조합.


2. 전체 아키텍처

  사용자 ─▶ 웹UI / 외부서비스
            │  (HTTPS, API Key/JWT)
            ▼
  ┌───────────────────────────────────────────────────────────────┐
  │ API Gateway (Ingress + FastAPI)                                 │
  │  · 인증(API Key/OAuth)  · 레이트리밋  · 입력검증/세이프티 필터    │
  └───────┬───────────────────────────────────────────────┬────────┘
          │                                                 │
          ▼ (과금 게이트)                                    ▼
  ┌─────────────────────┐                        ┌──────────────────────┐
  │ Billing/Quota 서비스 │                        │ 콘텐츠 세이프티        │
  │  크레딧 차감/잔액확인  │                        │  NSFW/금지어 필터      │
  │  요금제·동시성 한도    │                        └──────────┬───────────┘
  └─────────┬───────────┘                                   │
            │ 허용                                            ▼
            ▼                                     ┌────────────────────────────┐
  ┌──────────────────────┐   무거운 잡/배치 ─▶    │ Queue(NATS/Redis) → GPU 워커 │
  │ Sync 추론(빠른 1장)   │◀──────────────────────│  (비동기, KEDA 스케일)        │
  │ FLUX schnell(저스텝)  │                        └──────────────┬───────────────┘
  └──────────┬───────────┘                                       │
             ▼                                                    ▼
  ┌─────────────────────────────────────────────────────────────────────┐
  │ Inference Core (model_server): T5인코딩→FLUX(nunchaku 4bit)→VAE 디코드 │
  └───────────────────────────────┬─────────────────────────────────────┘
                                  ▼
  ┌─────────────────────────────────────────────────────────────────────┐
  │ 결과 저장: MinIO(이미지, presigned URL) · 메타/사용량: PostgreSQL       │
  │ 모델: MLflow/MinIO  · 이미지레지스트리: Harbor · GPU: kube-rtx3        │
  └─────────────────────────────────────────────────────────────────────┘

3. 모델 스택 & 라이선스 [주의 — 유료 서비스의 1순위 체크]

구성 선택지 비고
디퓨전 본체 FLUX.1-schnell Apache-2.0 → 상업적 사용 가능. distilled 1~4스텝 고속. 유료 서비스에 적합
(대안) FLUX.1-dev Non-Commercial 라이선스 → 유료서비스 불가(BFL 상업 라이선스 별도 필요). SD3.5/SDXL 등은 각 라이선스 확인
텍스트 인코더 T5-XXL(+ CLIP) perch7은 _docker_t5 2.99GB = fp8/양자화 T5(원본 9~22GB)
VAE 정식 VAE + taef1(미리보기) taef1=초경량, 실시간 프리뷰/저비용 디코드
차별화 커스텀 LoRA / 파인튜닝 서비스 정체성. cfg-bake LoRA로 저CFG 고속화

[주의] 라이선스가 사업 가능 여부를 가른다. "schnell=상업OK / dev=상업불가"를 반드시 확정하고 시작. 베이스·LoRA·학습데이터 출처 라이선스를 MLflow에 기록.


4. 추론 가속 (원가/속도 직결) [원형→권고]


5. LoRA / 파인튜닝 파이프라인 [원형]


6. 서빙 계층 [원형→권고]


7. 상용/유료 계층 ★ (이 서비스의 사업 핵심)

7.1 인증·계정

7.2 크레딧 / 요금제 / 미터링

7.3 과금 흐름 (요청 수명주기)

요청 → 인증 → 잔액/한도 확인(부족시 402) → (선차감 or 예약) → 추론
     → 성공: 확정 차감 + 사용량 기록 + 결과URL / 실패: 차감 롤백

7.4 결제 연동

7.5 레이트리밋 & 어뷰즈 방지


8. 모델/소스 IP 보호 [원형 — perch7의 차별점]


9. 안전 / 컴플라이언스


10. 인프라 매핑 (보유 클러스터 → 본인 서버)

역할 클러스터 자원 비고
레지스트리 Harbor 서비스 이미지
GPU 추론 kube-rtx3(4×RTX3090) 등 INT4 SVDQuant(FP4 불가)
모델 레지스트리 MLflow 모델/LoRA 버전
결과·모델 아티팩트 MinIO(presigned URL) 대용량 이미지
메타/사용량/과금 PostgreSQL 트랜잭션 정확성
큐 NATS/Redis 비동기 + 레이트리밋
인입/도메인 Ingress(+cert) HTTPS
분산 서빙(옵션) Ray Serve 동기 고처리량
스케일 KEDA(큐깊이)/HPA GPU 수가 상한

11. API 계약 (스펙)

POST /v1/images/generate            # 동기(빠른 1장)
  headers: Authorization: Bearer <api_key>, Idempotency-Key
  body: { prompt, negative?, style_preset?, width, height, steps, seed?, n? }
  200 → { id, image_url(presigned), credits_charged, model_version, seed }
  402 → { error: "insufficient_credits", balance }
  429 → 레이트리밋

POST /v1/images/generate_async      # 비동기(고해상/배치)
  202 → { job_id, estimated_credits }
GET  /v1/jobs/{job_id} → { status, progress, image_urls?, credits_charged? }

GET  /v1/account/balance → { credits, plan, limits }
GET  /v1/usage?from&to   → 사용/과금 내역

12. 스케일 / 원가 산정 (마진 설계)


13. 로드맵


14. 리스크 / 주의 체크리스트


관련 문서