본문으로 건너뛰기

EVA App Installation

이 가이드는 Kubernetes 환경에서 EVA App을 빠르고 안정적으로 설치할 수 있도록 안내합니다.


🛠️ 사전 준비 사항

설치를 시작하기 전에 아래의 도구들이 준비되어 있는지 확인해 주세요.

  • Kubernetes 클러스터: EVA가 구동될 클러스터가 필요합니다.
  • kubectl 설치: 설치 가이드 바로가기
  • Helm 설치: 설치 가이드 바로가기
  • AWS CLI 설정: ECR 이미지 접근 권한을 위해 AWS 자격 증명이 필요합니다. 터미널에서 아래 명령어를 입력하여 설정해 주세요.
aws configure
# 안내에 따라 AWS Access Key ID, Secret Access Key 등을 입력합니다.



🚀 EVA App 설치하기

1단계: Helm 저장소 등록

먼저 EVA App 배포를 위한 Helm 레포지토리를 추가합니다.

helm repo add eva-app https://mellerikat.github.io/eva-app
helm repo update

2단계: 설정 파일(values.yaml) 준비

설치 시 필요한 기본 설정 템플릿을 현재 폴더에 다운로드합니다.

helm show values eva-app/eva-app > values.yaml

3단계: 사용자 환경에 맞춰 설정 업데이트

다운로드한 values.yaml 파일을 열어 환경에 맞는 설정을 수정해야 합니다. On-premise(자체 서버)Cloud(AWS) 환경에 따라 주요 설정값이 다르니 아래 표 및 하단 예제를 참고해 주세요.

EVA-APP Application Values

CategoryKeyDefaultDescription
visionapp.vision.ml-VM 서비스 엔드포인트 URL
agentapp.agnet.llm-LLM 서비스 엔드포인트 URL
agentapp.agent.vlm-VLM 서비스 엔드포인트 URL
agentapp.agent.requestTimeoutSeconds30에이전트 요청 타임아웃 (초)
appapp.backendHost-백엔드 서버 호스트
appapp.backendPort-백엔드 서버 포트
appapp.backendSecure-HTTPS 사용 여부
appapp.browserTitleNameEVA브라우저 탭 제목
appapp.infraProvideronprem인프라 제공자 타입 (onprem / ncp / aws)
appapp.jwtSecretSecretJWT 서명에 사용되는 비밀 키
lifeCycleapp.lifeCycle.analysisRetentionDaysNone알림 및 분석 데이터 보관 기간 (일)
licenseapp.license.activation_modeonline라이선스 활성화 방식 (online 또는 offline)
licenseapp.license.product_codeeva라이선스 제품 코드
licenseapp.license.api_key...라이선스 API 키
licenseapp.license.shared_key...라이선스 공유 키
pipelineapp.pipeline.detector.workerNum16Detector 파이프라인 동시 처리 워커 수
pipelineapp.pipeline.streamer.annotationColorModeGRAY어노테이션 색상 모드
pipelineapp.pipeline.streamer.dispatcherFaceAnonymizerEnabledTrue디스패처에서 얼굴 비식별화 사용 여부
pipelineapp.pipeline.ingester.ingesterStreamFPSForGrab30.0스트림 프레임 캡처 기준 FPS
pipelineapp.pipeline.perceptor.queueSize100Perceptor 작업 큐 크기
pipelineapp.pipeline.perceptor.workerNum2Perceptor 워커 개수
sessionapp.accessTokenExpireMinutes1440액세스 토큰 만료 시간 (분)
sessionapp.uiSessionTimeoutMinutes60UI 세션 만료 시간 (분, 0이면 제한 없음)

EVA-APP Resource Values

CategoryKeyDefaultDescription
databasedatabase.nameeva애플리케이션에서 사용하는 데이터베이스 이름
databasedatabase.typeinternal데이터베이스 유형 (internal: 클러스터 내 MySQL, external: 외부 DB)
databasedatabase.service.nodePort32060내부 MySQL 서비스용 NodePort
databasedatabase.internal.user...내부 데이터베이스 사용자 계정
databasedatabase.internal.password...내부 데이터베이스 사용자 비밀번호
databasedatabase.external.hostdbhost외부 데이터베이스 호스트 주소
databasedatabase.external.port3306외부 데이터베이스 포트
databasedatabase.external.user...외부 데이터베이스 사용자 계정
databasedatabase.external.password...외부 데이터베이스 사용자 비밀번호
imageimage.repository(env-specific)eva-app 컨테이너 이미지 저장소
imageimage.pullPolicyIfNotPresent이미지 pull 정책
imageimage.tagappVersion이미지 태그 (기본값: chart appVersion)
imagePullSecretsimagePullSecrets.enabledtrue이미지 pull secret 사용 여부
imagePullSecretsimagePullSecrets.existingSecret""기존 image pull secret 이름
imagePullSecretsimagePullSecrets.createtrueHelm에서 image pull secret 생성 여부
imagePullSecretsimagePullSecrets.nameOverride""image pull secret 이름 오버라이드
imagePullSecretsimagePullSecrets.account339713051385AWS ECR 계정 ID
imagePullSecretsimagePullSecrets.regionap-northeast-2AWS ECR 리전
imagePullSecretsimagePullSecrets.passwordECR Login PasswordECR 로그인 비밀번호
nodeSelectornodeSelector""파드 스케줄링을 위한 노드 선택 조건
pvpv.createfalseHelm을 통해 PersistentVolume 생성 여부
pvpv.nameOverride""PersistentVolume 이름 오버라이드
pvpv.annotations""PersistentVolume에 추가할 어노테이션
pvpv.csi.driverefs.csi.aws.comCSI 드라이버 이름
pvpv.csi.volumeHandlefs-00000000000000000CSI 볼륨 핸들
pvpv.storageClassNameefs-sc-eva-appPersistentVolume용 StorageClass 이름
pvpv.storage30GiPersistentVolume 스토리지 크기
persistencepersistence.typehostPath스토리지 유형 (pvc 또는 hostPath)
persistencepersistence.hostPath.path""hostPath 볼륨 마운트 경로
persistencepersistence.pvc.nameOverride""PersistentVolumeClaim 이름 오버라이드
persistencepersistence.pvc.annotations""PersistentVolumeClaim 어노테이션
persistencepersistence.pvc.existingClaim""사용할 기존 PVC 이름
persistencepersistence.pvc.storageClassNameefs-sc-eva-appPVC용 StorageClass 이름
persistencepersistence.pvc.storage30GiPersistentVolumeClaim 스토리지 크기
replicaCountreplicaCount1eva-app 파드 replica 개수
resourcesresourcesdict컨테이너 리소스 요청 및 제한 설정
serviceAccountserviceAccount.createtrueServiceAccount 자동 생성 여부
serviceAccountserviceAccount.name""ServiceAccount 이름
serviceAccountserviceAccount.existingServiceAccount""기존 ServiceAccount 사용 여부
secretsecret.nameOverride""Kubernetes Secret 이름 오버라이드
secretsecret.data""Kubernetes Secret 데이터
serviceservice.nodePort32010eva-app 서비스 NodePort
serviceservice.internal.enabledtrue내부 서비스 사용 여부
tolerationstolerations[]파드 toleration 설정
volumesvolumes.dshm.size8Gi/dev/shm 공유 메모리 크기

📂 On-premise 환경 values.yaml 설정 예시 (클릭)
# ============================================================
# On-Premise 환경용 values 오버라이드 파일
#
# 사용법:
# helm install eva-app -n eva-app . -f values.yaml -f platform/onpremise/values.yaml
# helm upgrade eva-app -n eva-app . -f values.yaml -f platform/onpremise/values.yaml
# ============================================================

app:
backendHost: "10.158.2.0" # On-Premise 서버 IP
backendSecure: false

# On-Premise 환경
infraProvider: onprem

jwtSecret: secret

vision:
ml: "http://eva-vision.eva-vision:8000"

agent:
llm: "http://eva-agent.eva-agent"
vlm: "http://eva-agent.eva-agent"

license:
activation_mode: "online"
product_code: "eva"

api_key: ""
shared_key: ""


## On-Premise는 내부 MySQL Pod 사용
database:
name: "eva"
type: "internal"
internal:
service:
nodePort: 32060
password: passwd
user: root


imagePullSecrets:
enabled: true
create: true
password: "ECR Login Password" # aws ecr get-login-password --region ap-northeast-2


## On-Premise는 hostPath로 로컬 스토리지 마운트
persistence:
type: hostPath
hostPath:
path: "" # On-Premise 서버의 실제 경로, default는 /{RELEASE_NAME}


## On-Premise는 PV 별도 생성 불필요 (hostPath 사용)
pv:
create: false


## On-Premise는 ServiceAccount 생성 필요
serviceAccount:
create: true

☁️ Cloud(AWS EKS) 환경 values.yaml 설정 예시 (클릭)
# ============================================================
# Cloud (AWS) 환경용 values 오버라이드 파일
#
# 사용법:
# helm install eva-app -n eva-app . -f values.yaml -f platform/cloud/values.yaml
# helm upgrade eva-app -n eva-app . -f values.yaml -f platform/cloud/values.yaml
# ============================================================

app:
backendHost: "your-alb-or-domain.example.com"
backendSecure: true # HTTPS 사용 시 true

# Cloud 환경 (ncp 또는 aws)
infraProvider: aws

jwtSecret: secret

agent:
llm: "http://eva-agent.eva-agent"
vlm: "http://eva-agent.eva-agent"

vision:
ml: "http://eva-vision.eva-vision:8000"

license:
activation_mode: "online"
product_code: "eva"

api_key: ""
shared_key: ""


## Cloud는 외부 RDS 등 managed DB 사용 권장
database:
name: "eva"
type: "external"
external:
host: "your-rds-endpoint.rds.amazonaws.com" # RDS 엔드포인트로 수정
port: 3306
password: passwd
user: root


## ECR 인증 설정
## eks(aws) 내에서는 serviceAccount와 IRSA로 ECR 인증 처리 가능하므로, imagePullSecrets는 disabled 처리 가능
## nks(ncp) 내에서는 imagePullSecrets 사용해야함.
imagePullSecrets:
enabled: true
create: true
password: "ECR Login Password" # aws ecr get-login-password --region ap-northeast-2


## Cloud는 특정 노드 그룹에 배치
nodeSelector: {}
# nodegroup: "ng-an2-eva-app"


## Cloud는 PV를 별도 생성하여 EFS에 연결
pv:
create: true
csi:
driver: efs.csi.aws.com
volumeHandle: fs-00000000000000000 # 실제 EFS FileSystem ID로 수정
storageClassName: efs-sc-eva-app
storage: 30Gi


## Cloud는 EFS 등 PVC 기반 스토리지 사용
persistence:
type: pvc
pvc:
storageClassName: efs-sc-eva-app
storage: 30Gi


## Cloud는 IRSA 등으로 ServiceAccount 관리 (필요에 따라 수정)
## eks(aws)는 권한을 부여받은 serviceAccount와 연결해야하므로, create: false로 설정하고 existingServiceAccount에 이름 입력
serviceAccount:
create: false
existingServiceAccount: ""


⚙️ Default values.yaml (클릭)

# eva-app의 기본 values 설정 파일입니다.
# YAML 형식의 파일입니다.
# 템플릿에 전달될 변수를 선언합니다.

## 온프레미스(On‑premise) 환경에서 설치하는 경우,
## database.type을 "internal"로,
## serviceAccount.create를 true로 설정하세요.
## persistence.type을 "hostPath"로 설정하여 데이터 볼륨을 마운트합니다.

##
## 애플리케이션 설정
## 애플리케이션 내부에서 사용되며 환경 변수로 접근 가능한 설정입니다.
#
app:
## 애플리케이션 기본 설정
browserTitleName: "EVA"

## 백엔드 호스트 및 보안 설정
backendHost: "127.0.0.1"
backendSecure: false

## 애플리케이션이 실행되는 인프라 환경 지정 : [ onprem | ncp | aws ]
infraProvider: onprem

## JWT_SECRET
jwtSecret: secret

## Vision 설정
vision:
ml: "http://eva-vision.eva-vision:8000"

## Agent 설정
agent:
llm: "http://eva-agent.eva-agent"
vlm: "http://eva-agent.eva-agent"

requestTimeoutSeconds: 30

## 분석 데이터 만료 일수
lifeCycle:
analysisRetentionDays: 30

## 라이선스 설정
license:
activation_mode: "online"
product_code: "eva"

api_key: ""
shared_key: ""

## 파이프라인에서 detector / perceptor 작업에 사용되는 동시 처리 스레드 수
pipeline:
detector:
workerNum: 16

ingester:
ingesterStreamFPSForGrab: 30

perceptor:
workerNum: 2
queueSize: 100

streamer:
dispatcherFaceAnonymizerEnabled: "true"
annotationColorMode: "GRAY" # ["GRAY" | "COLOR"]

## 세션 설정
session:
uiSessionTimeoutMinutes: 60
accessTokenExpireMinutes: 1440

## eva-app 환경을 위한 추가 설정
additional: {}
# foo: bar


##
## Kubernetes 매니페스트 설정
## Helm 템플릿 변수로 사용되며 Kubernetes 리소스에 반영됩니다.
#

## 데이터베이스 설정
## type을 "internal"로 설정하면 클러스터 내부에 MySQL 파드를 배포합니다.
## type을 "external"로 설정하면 외부 데이터베이스에 연결합니다.
##
database:
name: "eva"
type: "internal" # ["internal", "external"]

internal:
service:
nodePort: 32060
password: passwd
user: root

external:
host: "dbhost"
port: 3306
password: passwd
user: root


image:
repository: 339713051385.dkr.ecr.ap-northeast-2.amazonaws.com/mellerikat/release/eva-app

# 이미지 pull 정책 설정
pullPolicy: IfNotPresent

# chart의 appVersion을 기본값으로 사용하는 이미지 태그
# tag: "latest"


## 이미지 pull secret 설정
## ECR에서 eva-app 이미지를 가져올 때 사용됩니다.
imagePullSecrets:
# enabled가 true이면 기존 secret을 사용하거나 새로 생성할 수 있습니다.
enabled: true

ExistingSecret: "" # eva-app-secret-regcred
create: true

## image pull secret 이름
## 기본값: '{{ .Release.Name }}-secret-regcred'
nameOverride: ""

account: "339713051385"
region: "ap-northeast-2"

# regcred: "regcred/regcred.yaml"
# dockerconfigjson: "regcred/regcred.json"

## 아래 단계를 완료한 후 ECR 비밀번호를 입력하세요.
## 1단계. AWS 설정
## 2단계. ECR 로그인 비밀번호 획득
#### $ aws ecr get-login-password --region ap-northeast-2
password: "ECR Login Password"


nodeSelector: {}
# 파드를 스케줄링할 노드 그룹 지정
# nodegroup: "ng-an2-eva-app"


pv:
create: false
## 기본값: 'pv-{{ .Release.Name }}'
nameOverride: ""

annotations: {}
# helm.sh/resource-policy: keep

## EFS용 CSI 설정 예시
csi:
driver: efs.csi.aws.com
volumeHandle: fs-00000000000000000

storageClassName: efs-sc-eva-app
storage: 30Gi


persistence:
type: hostPath # ["pvc", "hostPath"]

## persistence.type이 "hostPath"인 경우,
## 로컬 스토리지를 마운트합니다.
##
hostPath:
path: "" # "/eva-app"

pvc:
## 기본값: 'pvc-{{ .Release.Name }}'
nameOverride: ""

annotations: {}
# helm.sh/resource-policy: keep

existingClaim: "" # 이미 생성된 PVC를 사용할 경우 이름 지정

storageClassName: efs-sc-eva-app
storage: 30Gi


replicaCount: 1


resources: {}
# requests:
# nvidia.com/gpu: 1


serviceAccount:
## 배포 시 사용할 ServiceAccount 이름
## 기본값은 Helm Release 이름입니다.
## 온프레미스 환경이고 serviceAccount.create가 true일 때 생성됩니다.
create: true
name: "" # eva-app

existingServiceAccount: ""


secret:
nameOverride: ""

## Secret에 저장될 데이터
data: {}


service:
nodePort: 32010
internal:
enabled: true


tolerations: []
# - key: "key"
# operator: "Equal"
# value: "value"
# effect: "NoSchedule"
# tolerationSeconds: 0


volumes:
## /dev/shm 용 공유 메모리 볼륨
dshm:
size: 8Gi


## 디버그용 설정
## 아래 라인을 활성화하면 파드가 무한 대기(sleep) 상태로 유지됩니다.
# command: ["sleep", "infinity"]
# appVolumeMount:
# path: /home/$(whoami)/path/to/eva-app/apps/backend/app/app
# webVolumeMount:
# path: /home/$(whoami)/path/to/eva-app/apps/frontend/dist


4단계: 명령어 실행하여 설치

이제 설정을 적용하여 EVA App을 배포합니다. ECR 로그인 비밀번호를 자동으로 가져와 설치를 진행하는 명령어입니다.

# 1. AWS ECR 로그인 암호 가져오기
ecr_password=$(aws ecr get-login-password --region "ap-northeast-2")

# 2. 전용 네임스페이스 생성
kubectl create namespace eva-app

# 3. Helm 설치 시작
helm install eva-app eva-app/eva-app \
-n eva-app \
-f values.yaml \
--set imagePullSecrets.password="${ecr_password}"

5단계: 설치 결과 확인

설치가 완료되면 터미널에 귀여운 기차 모양의 ASCII 아트와 함께 접속 URL이 출력됩니다.

level=WARN msg="unable to find exact version; falling back to closest available version" chart=eva-app requested="" selected=1.3.2
NAME: eva-app
LAST DEPLOYED: Mon Dec 1 14:12:25 2025
NAMESPACE: eva-app
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None
NOTES:
. ___ __ __ ___ ___ _ __ _ __
| __| \ \ / / / \ o O O / \ | '_ \ | '_ \
| _| \ V / | - | o | - | | .__/ | .__/
|___| _\_/_ |_|_| TS__[O] |_|_| |_|__ |_|__
_|"""""|_| """"|_|"""""| {======|_|"""""|_|"""""|_|"""""|
"`-0-0-'"`-0-0-'"`-0-0-'./o--000'"`-0-0-'"`-0-0-'"`-0-0-'

eva-app has been installed successfully!

Application Details:
App Version : 2.2.6
Chart Version : 1.3.2
Release Name : eva-app
Namespace : eva-app

You can access "EVA App" using the following URL:
EVA App : http://10.158.2.75:32055

You can check helm instance by running:
$ helm ls -n eva-app

You can check kubernetes objects by running:
$ kubectl get all -n eva-app

For further information, visit https://mellerikat.com

아래 절차를 통해 DB 마이그레이션이 정상적으로 수행되었는지, 그리고 최신 버전의 스키마가 올바르게 적용되었는지 확인할 수 있습니다.

1. eva-app pod 이름 조회

kubectl get pods -n eva-app

2. 현재 DB에 적용된 Alembic Revision 정보 확인

kubectl exec -it {eva-app-xxxx} -n eva-app -- alembic current

위에서 확인한 Alembic Revision 값이 Release Note 에 있는 각 SW 버전별 Alembic Revision 값과 동일한지 확인합니다.