Docker로 InsightFace Server 배포
CPU 또는 CUDA에서 InsightFace Server를 셀프 호스팅하고 라이선스 모델 설치·검증, 첫 정확한 1:N 검색, 인증, 영구 데이터 보호까지 진행합니다.

이 가이드에서 구축할 내용
저장소에 포함된 Compose 설정으로 CPU 또는 CUDA 12에 배포합니다. 이미지를 받고 모델을 설치한 다음 서비스를 시작하세요. 라이브니스 검사는 선택 기능이며 기본적으로 꺼져 있습니다.
시작하기 전에
- Docker Engine, Docker Compose, Git을 갖춘 Linux x86_64 환경. 저장소에 포함된 server/config/server.toml을 유지하세요.
- CUDA 12는 지원 NVIDIA GPU, NVIDIA Driver, NVIDIA Container Toolkit이 필요합니다. 호스트에 CUDA Toolkit, cuDNN, ONNX Runtime, Python, OpenCV를 설치할 필요는 없습니다.
- 컨테이너를 pull하고 모델을 설치할 때의 네트워크 연결. 설치 이후 일반 Server 시작은 offline으로 유지할 수 있습니다.
CPU 또는 CUDA 12로 시작
저장소 루트에서 한 가지 명령 블록을 실행하세요. 포함된 Compose 파일을 그대로 사용하며 내려받을 이미지는 해당 파일이 결정합니다. 최신 저장소가 있다면 git clone을 생략하세요.
시작 후 CPU는 http://SERVER:18097/, CUDA 12는 http://SERVER:18098/에 접속하세요. --accept-license는 모델 약관에 동의하는 옵션이므로 실행 전에 확인하세요.
git clone https://github.com/deepinsight/insightface.git
cd insightface
docker compose -f server/deploy/compose.cpu.yml pull server models
docker compose -f server/deploy/compose.cpu.yml run --rm models install buffalo_l --accept-license
docker compose -f server/deploy/compose.cpu.yml up -d --wait --wait-timeout 180git clone https://github.com/deepinsight/insightface.git
cd insightface
docker compose -f server/deploy/compose.cuda12.yml pull server models
docker compose -f server/deploy/compose.cuda12.yml run --rm models install buffalo_l --accept-license
docker compose -f server/deploy/compose.cuda12.yml up -d --wait --wait-timeout 180첫 Collection → Person → Search 완료

Collections에서 employees 같은 안정적인 ID를 만듭니다. System이 제공하는 search profile을 선택하고 memory budget에 맞게 capacity를 정한 뒤 기본 raw cosine threshold 0.4로 시작합니다. Collection은 모델 identity, digest, embedding dimension, preprocessing과 detection profile contract에 고정됩니다.
People에서 Collection을 선택하고 선명한 JPEG, PNG 또는 WebP, BMP 한 장 이상으로 Person을 등록합니다. standard review는 사용 가능한 얼굴 하나만 허용하고 크기, confidence, 선명도, 밝기와 pose를 검사하므로 좋은 출발점입니다. batch는 일부만 성공할 수 있으므로 각 거부 이유를 확인하세요.
Search에서 같은 Collection을 선택하고 그 Person의 다른 사진을 업로드합니다. 결과는 raw cosine similarity 내림차순이며 Person score는 FaceSample 중 최고값입니다. similarity는 확률이 아닙니다. 일치하지 않는 경우 빈 목록이 정상 결과입니다.
- 원본 업로드는 기본적으로 저장하지 않습니다. 선택적 저장은 112×112 bounding-box JPEG crop이며 원본이나 정렬된 인식 입력이 아닙니다.
- 승인 sample은 SQLite에 commit된 다음 성공 응답 전에 정확 검색 memory index에 추가됩니다. 재시작 시 SQLite에서 재구축합니다.
- Detect에서 얼굴 없음은 정상 빈 결과입니다. Compare는 한쪽에 사용 가능한 얼굴이 없으면 422 face_not_found를 반환합니다.
선택 사항: RGB 라이브니스 검사 활성화
새 배포에서는 위 모델 설치 명령 끝에 --enable-liveness를 추가하세요. 필요한 모델을 검증하고 첫 시작 전에 활성화 설정을 저장합니다.
실행 중인 서비스는 아래 해당 명령을 실행한 뒤 재시작하세요. 일반 설치와 models addons install liveness는 기능을 활성화하지 않습니다.
설치가 성공하면 실행 중인 서비스를 재시작하세요. up -d만으로 기존 컨테이너의 저장된 설정을 다시 읽지 않습니다. 기본값은 꺼짐이며 등록에는 별도 liveness_on_registration 설정이 있습니다.
docker compose -f server/deploy/compose.cpu.yml run --rm models install buffalo_l --accept-license --enable-liveness &&
docker compose -f server/deploy/compose.cpu.yml restart serverdocker compose -f server/deploy/compose.cuda12.yml run --rm models install buffalo_l --accept-license --enable-liveness &&
docker compose -f server/deploy/compose.cuda12.yml restart server모델 라이선스 범위 이해
Server source code와 Python SDK는 MIT license이지만 모델 파일과 weight는 그 MIT license의 적용 대상이 아닙니다. buffalo_l을 포함한 공개 InsightFace 모델 package는 별도 상용 허가가 없으면 일반적으로 비상업 학술 연구용으로 제한되며, 셀프 호스팅이 상용 모델 권한을 부여하지 않습니다.
설치하면 manifest.json과 서명된 MODEL.LICENSE가 server/.models에 기록됩니다. verify는 package identity, 서명, 유효기간과 현재 권한을 확인합니다. 이 license는 모델과 허용 용도를 나타내는 compliance credential이지 DRM이나 모델 파일 checksum이 아닙니다.
buffalo_l, buffalo_m, buffalo_s, buffalo_sc, antelopev2, raccoon_s, raccoon_l을 지원합니다. Server는 Raccoon의 검출과 인식만 사용하며 PrivateFrame verifier는 로드하지 않습니다. 모델 변경에는 호환되는 Collection과 재등록 또는 데이터 마이그레이션이 필요합니다.
- --accept-license가 없으면 조건을 표시하고 다운로드하지 않은 채 종료합니다.
- 모델, manifest, 서명된 라이선스를 영구 모델 디렉터리에 함께 보관하세요.
- 상용 이용 또는 공개 조건의 적용 범위가 불명확하면 사용 전에 InsightFace에 문의하세요.
네트워크 공개 전에 보안 적용
제공 Compose는 격리 평가를 위해 인증이 꺼져 있습니다. 다른 사용자나 네트워크가 접근하기 전에 인증을 켜고 길고 무작위인 API Key를 배포 secret 환경에 설정한 다음 선택한 stack을 다시 시작합니다. Web UI는 현재 tab의 memory에만 Key를 보관할 수 있습니다.
신뢰하는 reverse proxy에서 HTTPS를 종료하고 광범위한 CORS 대신 필요한 origin만 허용하며 edge에 rate/body/time limit를 적용합니다. Docker, /data, /models와 backup 접근을 제한하고 이미지, embedding, RTSP credential 또는 API Key를 log에 남기지 마세요.
- 1단계에는 역할 구분 없는 API Key 하나만 있습니다. multi-tenant 권한 시스템이 아니며 내장 계정이나 RBAC도 없습니다.
- 같은 data volume을 나중에 다른 INSIGHTFACE_API_KEY로 시작하면 active Key가 의도적으로 교체됩니다.
- 내장 TLS나 법적 compliance layer가 없으며 합법적 처리와 운영 통제는 운영자 책임입니다.
export INSIGHTFACE_AUTH_ENABLED=true
export INSIGHTFACE_API_KEY='replace-with-a-long-random-secret'
docker compose -f server/deploy/compose.cpu.yml up -d --wait --wait-timeout 180export INSIGHTFACE_AUTH_ENABLED=true
export INSIGHTFACE_API_KEY='replace-with-a-long-random-secret'
docker compose -f server/deploy/compose.cuda12.yml up -d --wait --wait-timeout 180데이터 영속화, backup과 안전한 종료
/data, 모델, server/config를 영구 보관하세요. 쓰기 중지 상태에서 SQLite와 얼굴 크롭을 함께 백업하거나 SQLite에 안전한 스냅샷을 사용하세요. 생체정보로 보호하고 네트워크 공개 전에 API 키 인증과 HTTPS를 활성화하세요.
시작한 stack에 맞는 전체 down 명령을 사용합니다. 일반 down은 container와 network를 제거해도 named data volume은 보존합니다. 절대로 -v를 붙이지 마세요. docker compose down -v는 해당 data volume을 영구 삭제합니다.
두 컨테이너는 root(0:0)로 실행되며 쓰기 가능한 단일 /models 마운트와 설정 디렉터리를 사용합니다. 모델 디렉터리와 addons/는 필요할 때 자동 생성됩니다. 호스트 UID/GID나 수동 권한 설정이 필요하지 않습니다. 컨테이너 루트 파일시스템은 계속 읽기 전용입니다.
- upgrade 전에 안전한 snapshot을 만들고 /models와 license를 보존하며 data copy로 새 image를 먼저 시험합니다.
- 이후 migration, /v1/health, 모델 contract와 알려진 검색을 확인합니다.
- FaceSample 삭제는 embedding과 선택적 crop을 제거하며 비어 있지 않은 Collection 삭제에는 명시적 force 확인이 필요합니다.
docker compose -f server/deploy/compose.cpu.yml downdocker compose -f server/deploy/compose.cuda12.yml down배포 업데이트
쓰기를 중지하고 데이터베이스와 얼굴 크롭을 백업하세요. 배포 파일을 업데이트하고 사용자 설정을 병합하되 server/config/server.toml, 모델, 기존 프로젝트명과 볼륨명, 포트, API 키를 유지하세요. 해당 Compose 파일을 사용하고 사용자 지정 시 기존 오버라이드 파일과 프로젝트명을 함께 지정하세요.
두 이미지를 내려받아 Server를 다시 만드세요. restart는 새 이미지나 마운트를 적용하지 않습니다. 상태, 실행 공급자, 기존 데이터, 알려진 검색을 확인하세요. 같은 인식 모델과 embedding 계약이면 샘플이 유지되며 모델 변경은 별도 마이그레이션이 필요합니다. SDK도 같은 최신 저장소에서 업데이트하세요.
docker compose -f server/deploy/compose.cpu.yml pull server models
docker compose -f server/deploy/compose.cpu.yml up -d --no-build --force-recreate --wait --wait-timeout 180 server
curl -fsS http://127.0.0.1:18097/v1/healthdocker compose -f server/deploy/compose.cuda12.yml pull server models
docker compose -f server/deploy/compose.cuda12.yml up -d --no-build --force-recreate --wait --wait-timeout 180 server
curl -fsS http://127.0.0.1:18098/v1/health시작 및 request 실패 진단
health부터 확인하고 System, 선택한 Compose의 container 상태와 log를 봅니다. CUDA는 Driver, GPU, 모델 Session, CUDAExecutionProvider, Provider audit 또는 warm-up이 실패하면 의도적으로 시작을 중단하며 CPU로 silent fallback하지 않습니다.
모든 응답에는 x-request-id가 있고 error body에는 request_id가 있습니다. 문제를 보고할 때 관련 log와 함께 보관하세요. 401 unauthorized는 대개 Key 누락 또는 교체, 409 collection_model_mismatch는 다른 모델 contract, 422 face_not_found는 사용 가능한 얼굴을 선택하지 못했음을 뜻합니다.
CUDA 배포는 CUDAExecutionProvider를 표시해야 합니다. 시작할 때 GPU, Driver, CUDA/cuDNN/ONNX Runtime, 실제 detector와 recognizer Session, Provider placement, warm-up을 검증하며 실패하면 CPU로 조용히 전환하지 않고 종료합니다.
- System의 CPUExecutionProvider 또는 CUDAExecutionProvider가 선택한 Compose와 일치하는지 확인합니다.
- server/.models의 검증된 패키지와 라이선스, server/config/server.toml의 존재를 확인하세요. 다운로드와 설정 저장에는 쓰기 가능한 디렉터리 마운트가 필요합니다.
- CUDA에서는 CPU fallback을 기대하지 말고 host Driver, GPU visibility, NVIDIA Container Toolkit을 수정합니다.
curl -fsS http://127.0.0.1:18097/v1/health
docker compose -f server/deploy/compose.cpu.yml ps
docker compose -f server/deploy/compose.cpu.yml logs --tail=200 servercurl -fsS http://127.0.0.1:18098/v1/health
docker compose -f server/deploy/compose.cuda12.yml ps
docker compose -f server/deploy/compose.cuda12.yml logs --tail=200 server