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