앱을 인터넷에 내놓을 때 HTTPS 를 붙이려고 CDN 이나 리버스 프록시를 앞에 두는 경우가 많습니다. 이때 실제 한도는 서버가 아니라 프록시가 정합니다. 서버는 파일 하나에 2 GiB 까지 받도록 되어 있어도, 요청은 프록시를 먼저 지나야 하기 때문입니다.

프록시의 두 한도

아래 숫자는 흔히 쓰는 CDN 프록시의 기본 한도 예입니다. 실제 값은 쓰는 프록시와 요금제에 따라 다르니 확인하세요. 플랫폼이 요청을 잘라 보내는 크기와 시간은 이 한도 아래로 들어가도록 정해져 있습니다.

한도서버 설정프록시 기본 한도 예넘으면
요청 본문파일당 2 GiB (GEO_MLOPS_DATASET_MAX_UPLOAD_BYTES)100 MB413: 프록시가 낸 HTML 오류 페이지. 요청이 서버에 닿지도 않음
응답 대기없음100초524(프록시에 따라 504): 프록시가 응답 기다리기를 포기함. 서버는 끝까지 처리함

오류 본문이 JSON({"detail": …})이면 서버가 낸 것이고, HTML 오류 페이지면 프록시가 낸 것입니다. 이 구분이 진단의 출발점입니다.

524·504 는 "실패" 가 아니라 "클라이언트가 결과를 못 받았다" 는 뜻입니다. 서버 쪽에는 이미 반영되어 있을 수 있습니다. 액세스 로그에 없다고 요청이 안 온 것도 아닙니다.

플랫폼이 이미 한도 아래로 자르는 것

아래 경로는 요청 하나를 한도보다 작게 잘라 보내도록 만들어져 있어, 프록시 뒤에서도 그대로 동작합니다.

경로한 번에 보내는 크기
웹 화면·CLI 의 데이터셋 업로드(청크 세션)32 MiB 청크. 끝나면 서버가 뒤에서 합치고 풀므로 응답이 바로 돌아옴
화면의 이미지 반입(docker save tar)32 MiB 청크
엣지 장비의 오프라인 파일 업로드청크당 최대 50 MB
엣지 장비의 명령 대기(롱폴: 응답이 올 때까지 요청을 열어 두고 기다리는 방식)최대 30초(응답 한도보다 짧게)

대용량 데이터셋은 CLI 로

수천 개 파일을 올릴 때는 브라우저보다 클라이언트 CLI(geo-mlops-client, 서버 소스 디렉터리에서는 ./client)가 편합니다. datasets upload-archive 는 파일들을 16 MiB 짜리 무압축 ZIP 묶음으로 만들고, 묶음마다 재개 가능한 청크 세션으로 보냅니다. 끊긴 청크는 스스로 세 번까지 다시 보냅니다.

  1. 로그인합니다. 서버 주소와 테넌트를 한 번 넣으면 캐시됩니다.

    geo-mlops-client login admin@example.com --base-url https://api.mlops.example.com --tenant DEMO
  2. 데이터셋 ID 와 올릴 디렉터리(하위 폴더 포함)를 줍니다. --skip-existing 은 이미 올라간 파일 이름을 먼저 조회해 건너뜁니다.

    geo-mlops-client datasets upload-archive <DATASET_ID> ~/corpus --skip-existing \
        2>&1 | tee -a ~/upload.log
  3. 노트북 절전 등으로 명령이 멈췄다면 같은 명령을 다시 실행합니다. --skip-existing 덕분에 끊긴 곳부터 이어집니다.

  • 진행 로그는 표준 오류로, 끝난 뒤의 요약 JSON 은 표준 출력으로 나옵니다.
  • 서버는 파일을 파일 이름(basename) 기준으로 저장합니다. 다른 폴더에 같은 이름의 파일이 있으면 겹치므로, 명령이 보내기 전에 경고합니다.
  • 묶음 하나를 만들 임시 공간이 TMPDIR 에 필요합니다. 모자라면 TMPDIR=/여유/경로 를 앞에 붙입니다.
  • datasets upload(파일 하나 = 요청 하나)는 청크로 나누지 않습니다. 그래서 프록시 한도(예: 100 MB)를 넘는 파일은 프록시에서 막힙니다. 큰 파일도 upload-archive 로 보내세요.

그 밖에 프록시 뒤에서 챙길 것

  • HTTPS 와 쿠키: 프록시가 HTTPS 를 풀어 앱에 넘긴다면 GEO_MLOPS_AUTH_COOKIE_SECURE=true(기본값)를 유지합니다. 앱은 --forwarded-allow-ips '*' 로 떠서 프록시가 넘겨준 X-Forwarded-* 헤더를 믿습니다. 따라서 앱 포트(10000)는 프록시 외에는 밖에서 닿지 않게 방화벽으로 막으세요.
  • MLflow Host 검사: 도메인으로 /mlflow 를 쓰면 GEO_MLOPS_MLFLOW_ALLOWED_HOSTS 에 그 도메인을 넣습니다(Docker Compose 로 설치 참고).
  • Alertmanager 웹훅: 프록시 뒤라면 웹훅 주소도 인터넷에 노출됩니다. GEO_MLOPS_ALERTMANAGER_WEBHOOK_TOKEN 을 꼭 설정합니다. 비어 있으면 앱이 웹훅을 닫아(503) 위조된 경보 주입을 막습니다.
  • docker push: Docker 클라이언트는 이미지 레이어를 큰 요청으로 보냅니다. 그래서 프록시 한도(예: 100 MB)를 넘는 레이어는 프록시에서 막힐 수 있습니다. 큰 이미지는 사내망에서 레지스트리에 직접 push 하거나, docker save 로 tar 를 만들어 이미지 반입으로 올리세요.

다음: 폐쇄망 설치

2026-09-21 기준 플랫폼에 맞춰 작성했습니다.

© Geo-MLOps