대상 이미지(삭제됨):
perch7/img2_v2.0.31/ssh:latestdigestsha256:15a196af9b19125f850a8f75f1147ae60ac549dea862be55683a9fe9941b4486, 15.8GB, 2026-06-18 빌드 근거: 이미지 빌드 히스토리(rtx3-docker-leftover-detail.txt297~376행)만으로 역분석. 소스 본문은 확보 못 함(이미지 삭제 + 핵심server.py가 암호화본server.py.enc로만 존재). 따라서 "구조·파일·모델·실행방식"은 확실, 알고리즘 세부·과금 로직은 추정으로 구분 표기. ※ 공개 DockerHub 이미지라 다이제스트로docker pull재취득 가능 → 삭제는 가역적(말 워커와 달리 복구 가능).
FLUX.1-schnell 디퓨전 모델을 4비트(NVFP4) 양자화로 굽고, 자체 웹 UI(ui.html) + Node/Deno 서버(server.js) + 암호화된 파이썬 추론 코어(server.py.enc) 로 감싼 상용 텍스트/이미지→이미지 생성 서비스. 모델·LoRA·텍스트인코더를 이미지에 전부 구워 넣고(7GB+), 라이선스 키 해시 검증 + 코드 암호화로 IP를 보호한 "판매용 추론 컨테이너". 포트 3000에서 서비스, Vast.ai /.launch 부팅 래퍼 + SSH 변형(/ssh 태그)으로 임대 GPU에 배포.
img2 와 LoRA 베이킹 정황(bake_loras.py, v46-cfgbake-lora)으로 보아 특정 스타일/도메인에 LoRA를 입힌 생성 서비스(추정).ui.html(90.1kB)로 브라우저 UI 제공, server.js(61.4kB)가 HTTP/API 서버. EXPOSE 3000.server.py(암호화본)가 실제 추론 코어. Deno 런타임(DENO_INSTALL=/root/.deno)도 설치되어 JS/TS 측 서빙 글루로 사용(추정).key_hash.txt(라이선스 키 해시) + server.py.enc(소스 암호화) 조합 → 코드와 모델 가중치를 보호하며 배포하는 판매형 서비스. 임차 GPU에 올려 과금 운영했을 것(추정).→ 전형적 용도(추정): FLUX 기반 유료 이미지 생성 SaaS의 단일 컨테이너 배포 단위. UI + API + 모델 + 라이선스 검증을 한 이미지에 패키징.
horse 워커가 가중치를 빼고 런타임에 받은 것과 정반대 전략: 모든 모델을 빌드 시 COPY로 구워 넣어 오프라인·고속 기동.
| 파일(이미지 내 경로) | 크기 | 정체 | 역할 |
|---|---|---|---|
models/_docker_model/ → /root/model/ |
7.21GB | 메인 디퓨전 모델(FLUX 트랜스포머 본체, 양자화 전/후 가중치) | 이미지 생성 핵심 |
models/_docker_t5.safetensors → /root/model/ |
2.99GB | T5 텍스트 인코더(FLUX의 프롬프트 인코더) | 프롬프트→임베딩 |
models/flux-schnell-runtime → /root/model/flux-schnell-runtime |
419MB | FLUX.1-schnell 런타임(스케줄러/설정/보조 가중치) | schnell(고속 distilled) 파이프라인 |
models/taef1 → /root/model/taef1 |
9.85MB | TAEF1(FLUX용 Tiny AutoEncoder, TAESD 계열 초경량 VAE 디코더) | 미리보기/고속 디코딩 |
models/v46-cfgbake-lora.safetensors → /root/model/loras/ |
120MB | LoRA("v46", CFG 베이크) | 스타일/도메인 어댑터 |
ENV: MODEL_DIR=/root/model, T5_PATH=/root/model/_docker_t5.safetensors, LORA_DIR=/root/model/loras.
주목 — 모델 출처 은닉(sed 치환):
find /root/inference/lakonlab -type f ... -exec sed -i \
's|black-forest-labs/FLUX.1-schnell|lzyvegetable/FLUX.1-schnell|g' {} +
# FLUX.1-dev 도 동일하게 lzyvegetable/* 미러로 치환
공식 black-forest-labs/FLUX.1-* HuggingFace repo 참조를 전부 lzyvegetable/FLUX.1-* 미러 계정으로 치환. → 공식 repo의 게이트/라이선스(특히 FLUX.1-dev 비상업 제약)를 우회하거나, 다운로드 차단을 피하려는 미러링(추정). schnell(Apache-2.0 상업가능)과 dev(비상업) 둘 다 다룬 정황.
추론 디렉터리 /root/inference/:
server.py.enc → /root/inference/server.py — 암호화된 추론 서버 본체(49.2kB). 평문 미확보. IP 보호의 핵심: 파일명은 .enc인데 server.py로 COPY되어, 기동 시 start.sh가 복호화/로딩하는 구조로 추정.server.js(61.4kB) — Node/Deno HTTP·API 서버(프런트 서빙 + 추론 코어 호출 글루).ui.html(90.1kB) — 단일 파일 웹 UI(생성 파라미터 입력/결과 표시).start.sh(16.4kB) — 컨테이너 엔트리(원래 CMD bash /root/inference/start.sh). 복호화·모델 준비·서버 기동 오케스트레이션.bake_loras.py — LoRA를 베이스 모델에 사전 병합(bake) 하는 스크립트.convert_lora_if_needed.py — LoRA 포맷 변환(diffusers 호환).ensure_nvfp4_model.sh — NVFP4(4비트) 양자화 모델 준비/검증 스크립트.key_hash.txt(4.1kB) — 라이선스 키 해시(클라이언트 키 검증용, 무단복제 방지).inference/lakonlab/(2.7MB) — 자체 프레임워크 "lakonlab"(생성 파이프라인 본체로 추정. 위 sed 치환 대상이 이 디렉터리).patches/patch_diffusers_lora_conversion.py — diffusers의 LoRA 변환 로직 패치(빌드 시 적용).setup.py, requirements.txt — 파이썬 패키징/의존성..venv(가상환경, 1.74GB) — python3 -m venv --system-site-packages 로 생성, requirements + 고정 핀 패키지(Markdown/jmespath/protobuf/pyarrow/pyparsing/regex 등 --no-deps) 설치.이 서비스의 기술적 정수는 소비자 GPU에서 FLUX를 빠르게 돌리기 위한 양자화·어텐션 최적화:
vendor/nunchaku(254MB) — NVFP4 4비트 양자화 추론 엔진(MIT/SVDQuant 계열). FLUX 같은 대형 디퓨전을 4비트로 돌려 VRAM·속도 확보. ensure_nvfp4_model.sh 가 이 엔진용 양자화 가중치를 준비.vendor/SageAttention(881kB) — 양자화 어텐션 커널(어텐션 연산 가속).CUDA_HOME=/opt/conda, nvcc 로 nunchaku 커널 컴파일(754MB 레이어).avifenc(libavif v1.3.0) → /usr/local/bin/avifenc — AVIF 출력 인코딩(생성 이미지를 고효율 AVIF로 저장/전송).curl deno.land/install.sh, 115MB) — JS/TS 런타임(server.js 측 실행).기술 스택: PyTorch 2.7.0 / CUDA 12.8 / conda(/opt/conda 7.74GB 베이스) / Ubuntu 22.04. 베이스 ENV PYTORCH_VERSION=2.7.0, IMG2_VERSION=v2.0.31. 시스템 패키지: git/wget/aria2/ffmpeg 계열(libgl1), imagemagick, ninja-build, libjpeg-turbo, ccache, openssl.
/opt/conda(7.74GB) 통째 COPY된 Vast.ai PyTorch conda 베이스. WORKDIR /root.["/bin/sh","-c","while [ ! -e /.launch ]; do sleep 1; done; bash /.launch"] — Vast.ai 표준 부팅 래퍼. /ssh 태그라 SSH 변형(openssh-server, tmux, StrictModes no, ClientAlive 설정 추가). 즉 임차인이 Vast 포털에서 SSH로 붙어 운영.bash /root/inference/start.sh (Vast 래퍼로 덮이기 전 빌드 단계의 CMD). 실제 서비스 기동은 start.sh.com.nvidia.volumes.needed=nvidia_driver, ubuntu 22.04.[컨테이너 기동] /.launch → start.sh
├─ server.py.enc 복호화 → server.py 로드
├─ ensure_nvfp4_model.sh → nunchaku용 NVFP4 4비트 가중치 준비/검증
├─ bake_loras.py / convert_lora_if_needed.py → v46 LoRA를 FLUX에 병합
└─ 서버 기동(server.js + server.py, port 3000)
[요청 처리]
클라이언트(ui.html / API)
└─ key_hash.txt 로 라이선스 키 검증(추정)
└─ 프롬프트 → T5 인코더 → 임베딩
└─ FLUX.1-schnell (nunchaku NVFP4 4bit + SageAttention) 디노이징
└─ (img2img 시) 입력 이미지 latent + LoRA 적용
└─ taef1(빠른 디코드) 미리보기 → VAE 최종 디코드
└─ avifenc 로 AVIF 인코딩 → 응답
.enc) + key_hash 라이선스 검증, 자체 프레임워크 lakonlab, FLUX repo→lzyvegetable 미러 sed 치환, PyTorch2.7/CUDA12.8, port 3000 웹UI(ui.html)+server.js, avifenc/deno, Vast /.launch+SSH 배포.perch7/img2_v2.0.31/ssh:latest) → 다이제스트로 재pull 가능(말 워커와 달리 복구 가능). 단 server.py.enc 는 복호화 키 없으면 평문 불가.server.py(암호화)·lakonlab 프레임워크·v46-cfgbake-lora·과금/키검증 로직 = perch7 고유. 평문/키 없으면 동작 그대로 복구 불가.이 이미지가 바로 같은 폴더 design-txt2img-paid-service.md 에서 "유료 텍스트→이미지 서비스의 실측 원형"으로 인용한 perch7/img2 FLUX 원본이다. 그 설계서의 모델 선택(FLUX schnell 상업가능/dev 비상업)·양자화(3090=INT4/NVFP4)·IP 보호(코드 암호화+키 해시)·AVIF 출력 등의 근거가 본 역분석에서 확인된 실제 구성이다. 유료 서비스 구축 시 이 문서(=원형 구조)와 설계서(=우리 설계)를 함께 볼 것.