Skip to content

[ feat ] noVNC 지원 : 신청 시 VNC 활성화 옵션 및 config API 연동 #235

Description

@dongmin0204

배경

DECS/entrypoint.shstart_novnc()ENABLE_VNC=true env var이 주입됐을 때만 활성화된다. 현재 Pod 생성 흐름에서 이 env var을 주입하는 경로가 없어 noVNC를 사용할 수 없다.

noVNC가 사용하는 포트 구조:

  • VNC 자체 (5901): 컨테이너 내부 localhost only — 외부 노출 불필요
  • noVNC websockify (기본 6080): 외부에서 접근하는 포트 → NodePort 할당 필요

config-server는 Pod 생성 전 admin_be의 GET /api/requests/config/{username} (AcceptInfoResponseDTO)를 조회해 설정을 가져온다. noVNC 활성화 여부도 이 흐름에 추가해야 한다.


변경 범위

1. Request entity — enableVnc 필드 추가

// Request.java
@Column(name = "enable_vnc", nullable = false)
private Boolean enableVnc = false;

DB 마이그레이션: ALTER TABLE requests ADD COLUMN enable_vnc TINYINT(1) NOT NULL DEFAULT 0;

2. SaveRequestRequestDTO — 신청 시 VNC 옵션 수신

// SaveRequestRequestDTO.java
@Schema(description = "noVNC GUI 활성화 여부", example = "false")
Boolean enableVnc   // nullable, 미전송 시 false로 처리

RequestCommandService.saveRequest()에서 request.setEnableVnc(dto.enableVnc() != null && dto.enableVnc()) 처리.

3. AcceptInfoResponseDTO — config-server에 VNC 여부 전달

// AcceptInfoResponseDTO.java
@Schema(description = "noVNC 활성화 여부")
Boolean enable_vnc

fromEntity()enable_vnc(request.isEnableVnc()) 추가.

config-server는 enable_vnc=true일 때:

  • Pod spec env에 ENABLE_VNC=true 주입
  • 내부 포트 6080에 NodePort 추가 할당 (기존 additional_ports 메커니즘 활용)

4. (선택) ApproveRequestDTO — 관리자 승인 시 VNC 강제 활성화/비활성화

현재 승인 DTO에 VNC 관련 필드가 없다. 관리자가 승인 시 VNC를 켜거나 끌 수 있게 하려면 추가 필요. 우선 사용자 신청 값 그대로 사용하는 방향으로 구현하고, 필요 시 별도 이슈로 분리.


entrypoint.sh 기준 env var 정리

env var 기본값 비고
ENABLE_VNC false 이것만 true로 주입하면 나머지는 기본값으로 동작
NOVNC_PORT 6080 변경 필요 시 추가 주입
VNC_DISPLAY 1 내부 VNC 포트 = 5900 + display
VNC_RESOLUTION 1920x1080
VNC_PASSWORD 자동 생성 미주입 시 ~/vnc_password.txt에 저장

ENABLE_VNC=true만 주입하면 나머지는 기본값으로 동작하므로, 우선 ENABLE_VNC만 처리한다.


주의

  • vncserver, vncpasswd, websockify가 이미지에 없으면 entrypoint.sh가 조용히 스킵한다 (에러 없음). CUDA 이미지별 패키지 포함 여부를 별도 확인 필요.
  • noVNC NodePort는 config-server 쪽에서 6080을 additional_ports에 자동 추가하는 방식으로 처리하므로, admin_be는 enable_vnc 플래그 전달까지만 책임진다.

체크리스트

  • Request entity에 enable_vnc 컬럼 추가 + DB 마이그레이션
  • SaveRequestRequestDTOenableVnc 필드 추가
  • RequestCommandService.saveRequest()에서 enableVnc 저장 처리
  • AcceptInfoResponseDTOenable_vnc 필드 추가
  • AcceptInfoResponseDTO.fromEntity()에 매핑 추가
  • config-server 쪽에 enable_vnc 수신 및 env var/포트 처리 이슈 별도 등록

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions