본문으로 건너뛰기

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) 환경에 따라 주요 설정값이 다르니 아래 표를 참고해 주세요.

CategoryNameDescriptionOn premiseCloud (AWS)
실행 환경에 따른 설정configMap.data.BACKEND_HOST백엔드 서버의 호스트를 지정합니다.127.0.0.1eva.try-mellerikat.com
실행 환경에 따른 설정BACKEND_SECUREhttps 사용 여부 (false 시 http 사용)falsetrue
실행 환경에 따른 설정database.mysql.createmysql 생성 여부truefalse (RDS 사용)
실행 환경에 따른 설정pv.createpv 생성 여부falsetrue
실행 환경에 따른 설정pvc.createpvc 생성 여부falsetrue
실행 환경에 따른 설정serviceAccount.createSA 생성 여부truefalse
실행 환경에 따른 설정volume.hostPath.enabled로컬 경로 Mount 여부truefalse
사용자 필수 작성Secret.data.AWS_ACCESS_KEY.AWS 접근에 필요한 ACCESS KEYak~ak~
사용자 필수 작성Secret.data.AWS_SECRET_KEY.AWS 접근에 필요한 SECRET KEYsk~sk~
사용자 필수 작성configMap.data.LLM_URLEVA 구동에 필요한 LLM 주소http://xx.xxx.xx.xhttp://xx.xxx.xx.x
사용자 필수 작성configMap.data.VLM_URLEVA 구동에 필요한 VLM 주소http://xx.xxx.xx.xhttp://xx.xxx.xx.x
EVA-APP 성능 관련PIPELINE_JOB_DETECTOR_NUM파이프라인에서 탐지 작업에 사용할 동시 스레드 수. 카메라가 많거나 추론 지연이 있다면 2 이상으로 늘리면 됩니다.22
EVA-APP 성능 관련SQLALCHEMY_POOL_MAX_OVERFLOW평소에 유지하던 DB 연결이 모두 사용 중일 때, 순간적으로 몇 개까지 더 연결을 허용할지 정하는 옵션입니다.3030
EVA-APP 성능 관련SQLALCHEMY_POOL_SIZE백엔드가 항상 유지해 둘 기본 DB 커넥션 수. API 요청이 많다면 더 크게 조정하세요.1515
EVA-APP 성능 관련ALERT_EXPIRE_DAYS저장된 알림·이미지를 며칠 뒤 지울지 결정합니다. 디스크를 절약하려면 값을 줄이고, 장기 보관하려면 늘리면 됩니다.3030
EVA-APP 성능 관련INTERPOLATION_ALLOWED_SECONDS인접 메타데이터 프레임 간 보간을 허용하는 최대 시간 간격(초)0.50.5
EVA-APP 성능 관련INTERPOLATION_SMOOTHING_FACTOR보간 시 이전 프레임을 얼마나 신뢰할지(0~1). 0에 가까울수록 급격한 변화가 둔화되고, 1에 가까울수록 최신 값에 더 민감합니다.0.70.7
EVA-APP 성능 관련INTERPOLATION_IOU_THRESHOLD보간할 때 같은 객체로 취급하려면 IoU가 어느 정도 이상이어야 하는지 정합니다. 값을 높이면 더 정확한 매칭만 인정합니다.0.20.2
EVA-APP 성능 관련EXTRAPOLATION_ALLOWED_SECONDS몇 초까지는 미래 프레임을 추정(외삽)할지 결정합니다. (단위: 초)0.30.3
EVA-APP 성능 관련INGESTER_STREAM_FPS스트리밍 화면에 보낼 기본 FPS. 네트워크 여건이나 장비 성능을 고려해 조정하세요.1515
EVA-APP 성능 관련INGESTER_STREAM_ML_RATIO스트림 프레임 중 몇 퍼센트를 ML로 넘길지 비율을 의미합니다. 0.3이면 대략 30% 프레임만 ML 파이프라인으로 보냅니다.0.30.3
EVA-APP 성능 관련INGESTER_ML_FPS모니터링 상태인 카메라가 ML 파이프라인에 보내는 FPS. 너무 높으면 추론 자원이 부족해질 수 있습니다.0.50.5
EVA-APP 성능 관련INGESTER_IDLE_FPS장치가 유휴 상태일 때도 최소 몇 FPS로 프레임을 받을지 결정합니다 (예: 상태 확인용).0.10.1
EVA-APP 성능 관련INGESTER_ASSIGNERIngester Assignerfalsefalse

📂 On-premise 환경 values.yaml 설정 예시 (클릭)
# eva-app의 기본 설정 파일입니다.
# 이 파일은 YAML 형식으로 구성되어 있습니다.
# 템플릿에 전달할 변수를 선언합니다.

## 디버그 설정
## 디버그 모드로 실행하려면 주석을 해제하고 pod가 무한 대기하도록 설정합니다.
# 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

## On-premise 설치를 위한 설정
## database.mysql.create, serviceAccount.create을 true로 설정합니다.
## volume.enabled를 true로 설정하여 데이터 볼륨을 마운트합니다.

configMap:
data:
# 애플리케이션 설정
BROWSER_TITLE_NAME: "EVA"
BACKEND_HOST: "10.158.2.75"
BACKEND_SECURE: false
ALOML_EXECUTE_MODE: "cluster"
DEPLOYED_CLUSTER: ""
EDGE_CONDUCTOR_URL: https://edgecond.mellerikat-dev.com
LLM_URL: http://10.178.97.139:8200
VLM_URL: http://10.178.97.139:8200
PIPELINE_JOB_DETECTOR_NUM: 1
SQLALCHEMY_POOL_MAX_OVERFLOW: 30
SQLALCHEMY_POOL_SIZE: 15
ALERT_EXPIRE_DAYS: 30
INTERPOLATION_ALLOWED_SECONDS: 0.5
INTERPOLATION_SMOOTHING_FACTOR: 0.7
INTERPOLATION_IOU_THRESHOLD: 0.2
EXTRAPOLATION_ALLOWED_SECONDS: 0.3
INGESTER_STREAM_FPS: 30
INGESTER_STREAM_ML_RATIO: 0.3
INGESTER_ML_FPS: 1
INGESTER_IDLE_FPS: 0.1
INGESTER_ASSIGNER: true
JWT_SECRET: secret

database:
name: "eva"
mysql:
create: true
service:
nodePort: 32066
password: passwd
user: root
rds:
host: "dbhost"
port: 3306
password: passwd
user: root

image:
repository: 339713051385.dkr.ecr.ap-northeast-2.amazonaws.com/mellerikat/release/eva-app
pullPolicy: IfNotPresent
# tag: "latest"

imagePullSecrets:
enabled: true
ExistingSecret: "" # eva-app-secret-regcred
create: true
nameOverride: ""
account: "339713051385"
region: "ap-northeast-2"
regcred: "regcred/regcred.yaml"
dockerconfigjson: "regcred/regcred.json"
password: "ECR 로그인 비밀번호"

nodeSelector:
{}
# nodegroup: "ng-an2-eva-app"

pv:
create: false
nameOverride: ""
csi:
volumeHandle: fs-00000000000000000
storageClassName: efs-sc-eva-app
storage: 30Gi

pvc:
create: false
nameOverride: ""
existingClaim: "" # 기존 PVC를 사용하려면 값을 설정합니다.

replicaCount: 1

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

serviceAccount:
create: true
name: "" # eva-app

secret:
nameOverride: ""
data:
AWS_ACCESS_KEY: ak
AWS_SECRET_KEY: sh

service:
nodePort: 32055
internal:
enabled: true

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

volume:
enabled: true # 데이터 볼륨 마운트를 비활성화하려면 false로 설정합니다.
hostPath:
enabled: true
path: "" # "/eva-app"

inference:
manifest: "inference/inference_manifest.yaml"
service:
nodePort: 32030
replicas: 1
nodeSelector:
{}
# nodegroup: "ng-an2-eva-app"
resources:
{}
# requests:
# nvidia.com/gpu: 1
tolerations:
[]
# - key: "key"
# operator: "Equal"
# value: "value"
# effect: "NoSchedule"
# tolerationSeconds: 0

☁️ Cloud(AWS EKS) 환경 values.yaml 설정 예시 (클릭)
NAME: eva-app
LAST DEPLOYED: Wed Nov 19 23:23:14 2025
NAMESPACE: eva-app
STATUS: deployed
REVISION: 4
CHART: eva-app
VERSION: 1.3.2
APP_VERSION: 2.2.6
DESCRIPTION: Upgrade complete
TEST SUITE: None

configMap:
data:
ALERT_EXPIRE_DAYS: 30
ALOML_EXECUTE_MODE: cluster
BACKEND_HOST: eva.try-mellerikat.com
BACKEND_SECURE: true
BROWSER_TITLE_NAME: EVA Mellerikat
DEPLOYED_CLUSTER: eks
EDGE_CONDUCTOR_URL: https://edgecond.try-mellerikat.com
EXTRAPOLATION_ALLOWED_SECONDS: 0.3
INGESTER_ASSIGNER: false
INGESTER_IDLE_FPS: 0.1
INGESTER_ML_FPS: 1
INGESTER_STREAM_FPS: 30
INGESTER_STREAM_ML_RATIO: 0.3
INTERPOLATION_ALLOWED_SECONDS: 0.5
INTERPOLATION_IOU_THRESHOLD: 0.2
INTERPOLATION_SMOOTHING_FACTOR: 0.7
JWT_SECRET: ...
LLM_URL: http://eva-agent.eva-agent.svc.cluster.local:8086
PIPELINE_JOB_DETECTOR_NUM: 1
SQLALCHEMY_POOL_MAX_OVERFLOW: 30
SQLALCHEMY_POOL_SIZE: 15
VLM_URL: http://eva-agent.eva-agent.svc.cluster.local:8086

database:
mysql:
create: false
password: passwd
service:
nodePort: 32060
user: root
name: eva_app_db
rds:
host: rds-an2-iac-prod-eva-mysql.chwicuigmx3u.ap-northeast-2.rds.amazonaws.com
password: ...
port: 3310
user: ..

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

imagePullSecrets:
ExistingSecret: ""
account: "339713051385"
create: false
dockerconfigjson: regcred/regcred.json
enabled: false
nameOverride: ""
password: ECR 로그인 비밀번호
regcred: regcred/regcred.yaml
region: ap-northeast-2

inference:
manifest: inference/inference_manifest.yaml
nodeSelector:
nodegroup: ng-an2-eva-app
replicas: 1
resources: {}
service:
nodePort: 32030
tolerations: []

nodeSelector:
nodegroup: ng-an2-eva-app

pv:
create: true
csi:
volumeHandle: fs-0fbdd5c197976d582
nameOverride: ""
storage: 30Gi
storageClassName: efs-sc-eva-app

pvc:
create: true
existingClaim: ""
nameOverride: ""

replicaCount: 1

resources: {}

secret:
data:
AWS_ACCESS_KEY: ak
AWS_SECRET_KEY: sk
nameOverride: ""

service:
internal:
enabled: true
nodePort: 32010

serviceAccount:
annotations: {}
create: false
name: eva-app

tolerations: []

volume:
enabled: true
hostPath:
enabled: false
path: ""

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

아래 명령어로 Pod가 정상적으로 실행 중인지 확인해 보세요.

kubectl get pods -n eva-app