구성 요소
API·MLflow·레지스트리를 포함한 앱 하나와 DB·저장소·모니터링·빌드 캐시
사용자 접속 대상은 앱 하나(포트 10000). 앱에 API·MLflow·컨테이너 레지스트리 모두 포함. 나머지는 데이터 저장소(Postgres·RustFS), 모니터링(Prometheus·Alertmanager), 빌드 속도를 높이는 캐시. 웹 화면은 정적 파일 묶음이므로 앱과 별도로 배포하고, 브라우저가 이 앱의 API 호출.
앱 (포트 10000)
docker-compose.yml 의 app 서비스. 호스트 네트워크(network_mode: host)로 실행되므로 별도 설정 없이 localhost 의 Postgres·RustFS·Prometheus 와 k3s API 에 접근.
| 경로 | 용도 |
|---|---|
/api/v1/…, /auth/… | 웹 화면과 CLI 가 사용하는 REST API. API 문서는 /docs. |
/mlflow | 내장 MLflow 트래킹 서버. MLflow 파이썬 클라이언트의 주소를 <주소>/mlflow 로 지정하면 그대로 동작. MLflow 서버를 따로 실행하지 않음. |
/v2 | 내장 OCI 컨테이너 레지스트리. docker push/pull 지원, 학습·빌드·서빙 이미지 저장. 별도 registry 컨테이너 불필요. |
앱 시작 시마다 다음 작업 실행.
- DB 스키마 마이그레이션(
alembic upgrade head):start-uvicorn.sh가 서버 기동 전에 실행 - 시드(초기 데이터 입력): 부트스트랩 관리자 계정과 공유 빌드 이미지 항목 생성(이미 있으면 변경하지 않음)
- 테넌트별 MLflow 워크스페이스 준비, 재시작으로 중단된 작업(이미지 반입·업로드 조립 등) 정리
- 백그라운드 작업 시작: 학습 큐, 빌드 감시, 서빙 하트비트, 엣지 플릿 점검
PostgreSQL (포트 5433)
앱과 MLflow 가 같은 데이터베이스, 같은 public 스키마 사용. 덤프 하나로 둘 다 백업.
RustFS (포트 9000, 콘솔 9001)
S3 호환 오브젝트 저장소. 버킷은 용도별로 구분.
| 버킷 | 저장 대상 |
|---|---|
mlflow | MLflow 아티팩트(모델 파일 등), 사전학습 가중치 미러 |
datasets | 데이터셋 파일 |
registry | 컨테이너 이미지 레이어·매니페스트(테넌트별로 나뉨) |
build-logs | 이미지 빌드 로그 |
edge-uploads | 엣지 장비가 오프라인 동안 수집했다가 업로드한 파일 |
mlflow·datasets·registry 는 Compose 의 createbucket 이 처음에 생성, build-logs·edge-uploads 는 앱이 처음 사용할 때 생성.
Prometheus (9090) · Alertmanager (9093)
Prometheus 가 앱의 /api/v1/metrics 에서 지표를 주기적으로 수집하고 경보 규칙 검사. 경보 발생 시 Alertmanager 가 앱의 웹훅으로 전달하고, 앱의 경보 화면에 표시. 두 도구의 웹 화면은 앱의 시스템 콘솔(Prometheus, Alertmanager)에서 대신 표시하므로 9090·9093 에 직접 접속할 필요 없음.
k3s 클러스터
학습, 이미지 빌드, 모델 서빙 모두 k3s 의 파드로 실행. 테넌트마다 tenant-{코드} 네임스페이스를 따로 생성.
- 학습: Kubernetes Job 하나. 스테이저(init 컨테이너)가 데이터셋을 배치하고, 학습 런타임 이미지가 학습 수행.
- 이미지 빌드: BuildKit rootless Job. 학습 런타임·스테이저·서빙 빌더·모델 서빙 이미지를 빌드해 앱 레지스트리에 푸시. 호스트의 Docker 데몬이나 root 권한은 사용하지 않음.
- 모델 서빙: 일반 Deployment + NodePort. 추론 요청은 항상 앱 경유.
빌드 패키지 캐시 (5000 · 3142)
proxpi(pip)와 apt-cacher-ng(apt). 빌드가 인터넷에서 내려받는 패키지를 저장하므로 두 번째 빌드부터 빨라짐. 앱은 별도 설정 없이 http://10.42.0.1:5000/index/, http://10.42.0.1:3142 로 연결. 이 둘을 실행하지 않는 환경에서는 캐시 사용 비활성화 필요. 방법은 폐쇄망 설치 참고.
이 밖에 빌드는 이미지 레이어를 앱 레지스트리의 {테넌트}/cache 저장소에 캐시(기본 활성화).