78 lines
4.2 KiB
Markdown
78 lines
4.2 KiB
Markdown
# 구현 계획 - 모듈(라이선스) 관리
|
|
|
|
이 시스템의 목표는 관리자가 "라이선스 관리" 페이지를 통해 특정 모듈(자산, 생산, CCTV)을 활성화/비활성화할 수 있도록 하는 것이며, **활성화를 위해서는 유효한 라이선스 키가 필수**입니다.
|
|
|
|
## 라이선스 시스템 아키텍처
|
|
**서명된 토큰(Signed Token)** 방식(JWT 또는 AES 암호화와 유사)을 사용합니다.
|
|
- **발급 (개발자)**: 생성 도구(CLI 스크립트)를 사용하여 키를 생성합니다.
|
|
- 데이터: `{ module: 'cctv', type: 'demo', created: '2024-01-01', days: 30 }`
|
|
- 출력: `U2FsdGVkX1...` (암호화된 문자열)
|
|
- **활성화 (사용자)**: 사용자가 이 문자열을 입력합니다. 서버는 비밀 키(Secret Key)로 이를 복호화하고 날짜를 검증합니다.
|
|
|
|
## 사용자 검토 사항
|
|
> [!IMPORTANT]
|
|
> **라이선스 관리**: 보안을 위해 숨겨진 관리자 생성기(CLI 스크립트)를 사용하여 키를 발급합니다.
|
|
> **만료 처리**: 시스템은 데이터베이스에 저장된 `expiry_date`를 확인하여 만료 여부를 판별합니다.
|
|
|
|
## 변경 제안 사항
|
|
|
|
### 데이터베이스 및 서버
|
|
#### [신규] `system_modules` 테이블
|
|
- `code` (VARCHAR, PK): 'asset', 'production', 'monitoring'
|
|
- `is_active` (BOOLEAN)
|
|
- `license_key` (TEXT): 원본 키 문자열.
|
|
- `license_type` (VARCHAR): 'dev', 'sub', 'demo'
|
|
- `expiry_date` (DATETIME): 'dev'(영구)인 경우 NULL.
|
|
|
|
#### [신규] `server/utils/licenseManager.js`
|
|
- `generateLicense(module, type)`: 암호화된 문자열 반환.
|
|
- `verifyLicense(key)`: 복호화하여 유효성 및 만료일 반환.
|
|
|
|
#### [신규] `server/routes/system.js`
|
|
- `POST /activate`: 키 입력 -> 복호화 -> DB 업데이트.
|
|
- `GET /modules`: 모듈 상태 및 만료 정보 반환.
|
|
|
|
### 프론트엔드
|
|
#### [신규] `src/system/pages/LicensePage.tsx`
|
|
- **모듈 목록**: 활성/비활성 스위치, 만료일 표시.
|
|
- **활성화 모달**: 키 입력 필드 제공.
|
|
- **(숨김) 생성기 탭**: 보안상 이유로 삭제됨, CLI로 대체.
|
|
|
|
#### [수정] `src/widgets/layout/MainLayout.tsx`
|
|
- 모듈 활성화 상태에 따라 사이드바 메뉴 조건부 렌더링.
|
|
|
|
## 검증 계획
|
|
1. **키 발급**: 생성기(CLI)를 사용하여 'Demo' 키(30일)와 'Dev' 키를 생성합니다.
|
|
2. **활성화**: Demo 키를 적용합니다. 30일 후 만료되는지 확인합니다.
|
|
3. **UI 확인**: 'CCTV' 메뉴가 사이드바에 나타나는지 확인합니다.
|
|
|
|
#### [신규] `tools/license_manager.cjs`
|
|
- **통합 CLI**: 오프라인 키 관리 및 온라인 DB 상태 관리.
|
|
- **명령어**:
|
|
- `list`: DB의 모든 모듈 상태 조회.
|
|
- `generate <module> <type>`: 새로운 서명된 라이선스 키 생성.
|
|
- `decode <key>`: 라이선스 키 내용 확인 (복호화).
|
|
- `activate <key>`: 키를 사용하여 DB에 직접 활성화 적용.
|
|
- `delete <module>`: DB에서 모듈 비활성화/삭제.
|
|
- **삭제됨**: 기존 `issue_license.cjs` (이 도구로 통합됨).
|
|
|
|
## 고급 카메라 설정 구현
|
|
|
|
### 1. 데이터베이스 스키마 확장
|
|
`camera_settings` 테이블에 다음 컬럼을 추가하여 설정을 저장합니다.
|
|
- `transport_mode`: ENUM('tcp', 'udp', 'auto') - RTSP 전송 프로토콜 제어.
|
|
- `rtsp_encoding`: BOOLEAN - 비밀번호 특수문자 URL 인코딩 여부.
|
|
- `quality`: ENUM('low', 'medium', 'original') - 스트리밍 해상도 및 비트레이트 제어.
|
|
|
|
### 2. 백엔드 스트림 엔진 (`streamRelay.js`)
|
|
- **FFmpeg 튜닝**: JSMpeg(소프트웨어 디코더)의 안정성을 위해 비트레이트를 제한하고 키프레임 주기를 조정했습니다.
|
|
- `-maxrate`, `-bufsize`: 네트워크 버스트 방지.
|
|
- `-g 30`: 1초마다 키프레임 전송 (화면 깨짐 시 1초 내 자동 복구).
|
|
- **심리스 리로드 (Seamless Reload)**:
|
|
- 사용자 설정 변경(PUT) 시, 클라이언트(브라우저)와의 WebSocket 연결은 유지한 채 백그라운드의 FFmpeg 프로세스만 교체합니다.
|
|
- `stopStream` 대신 `reloadStream`을 사용하여 끊김 없는 화질 변경 경험을 제공합니다.
|
|
|
|
### 3. 프론트엔드 UI
|
|
- **CameraModal**: 고급 설정 섹션을 추가하여 사용자가 기술적인 설정(TCP/UDP, 해상도)을 직관적으로 제어할 수 있도록 폼을 개선했습니다.
|
|
|