목적: 잔여 임차인 자산
perch7/img2_v2.0.31(FLUX.1 기반 상용 이미지 생성기)의 구조를 원형으로, 본인 서버/클러스터에서 유료 서비스로 직접 구축하기 위한 꼼꼼한 설계서. 작성 2026-06-24. 설계 문서(코드 아님). 인프라는 보유 클러스터 기준 매핑(배포 전 가용성 확인). 표기: [원형] perch7/img2에서 확인된 패턴 / [권고] 본 설계의 추천 / [주의] 함정.
"프롬프트 → 이미지" 를 API + 웹UI로 제공하고, API 키·크레딧·요금제로 과금하며, 모델/소스 IP를 보호하고, GPU 처리량에 맞춰 스케일하는 상용 생성 서비스.
| 요소 | 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/튜닝) + 양자화 가속 + 과금/보호 계층" 조합.
사용자 ─▶ 웹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 │
└─────────────────────────────────────────────────────────────────────┘
| 구성 | 선택지 | 비고 |
|---|---|---|
| 디퓨전 본체 | 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에 기록.
bake_loras.py(LoRA 병합), convert_lora_if_needed.py(포맷 변환), cfg-bake(CFG를 LoRA에 흡수해 저CFG 고속).key_hash.txt와 동일 사상).스텝수 × 해상도(픽셀) × (배치/이미지수) × 모델가중.요청 → 인증 → 잔액/한도 확인(부족시 402) → (선차감 or 예약) → 추론
→ 성공: 확정 차감 + 사용량 기록 + 결과URL / 실패: 차감 롤백
server.py.enc) + 런타임 복호화 키 주입.key_hash.txt): 컨테이너가 유효 키 없으면 미동작 → 이미지 유출돼도 무단실행 차단.| 역할 | 클러스터 자원 | 비고 |
|---|---|---|
| 레지스트리 | 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 수가 상한 |
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 → 사용/과금 내역
application-architecture-reference.mddesign-motion-analysis-service.md