# Synology NAS 배포 가이드 (라이선스 관리 시스템)

이 문서는 `smart_ims-license-manager`를 Synology NAS 환경에 배포하고 운영하기 위한 절차를 설명합니다.

## 사전 준비 사항

- **Synology NAS 설정**:
  - `SSH` 서비스 활성화 (제어판 > 터미널 및 SNMP)
  - `Node.js` 패키지 설치 (패키지 센터)
  - `MariaDB 10` 패키지 설치 및 사용자/DB 생성 (`smart_ims_license_db`)
  - `Git Server` 패키지 설치 (또는 SSH를 통한 `git` 명령 사용)

## 주요 변경 사항 (서버 최적화)

Synology NAS 환경에서 통합 운영을 위해 Express 서버가 빌드된 클라이언트(React)를 직접 서빙하도록 수정되어 있습니다.

- `express.static`을 사용하여 `../client/dist` 폴더의 정적 파일을 서빙합니다.
- SPA(Single Page Application)를 위해 모든 경로를 `index.html`로 폴백(fallback) 시킵니다.

## 초기 계정 정보
최초 로그인 시 아래 계정을 사용하세요.

- **ID**: `admin`
- **Password**: `^Ocean1472bk`

> [!NOTE]
> 만약 로그인이 되지 않는다면 서버 터미널에서 `node init_db.js`를 실행하여 계정을 생성해 주세요.

## 배포 단계 (설치 절차)

### 1. 소스 코드 배포
NAS에 SSH로 접속하여 프로젝트를 복제합니다.
```bash
git clone https://gitea.qideun.com/SOKUREE/smart_ims_license.git
cd smart_ims_license
```

### 2. 클라이언트 빌드
로컬 혹은 NAS에서 클라이언트를 빌드하여 `dist` 폴더를 생성합니다.
```bash
cd client
npm install
npm run build
```

### 3. 서버 환경 설정 (`.env` 파일 설정)
`server/.env` 파일을 생성하거나 수정하여 필요한 환경 변수를 설정합니다.

1. **비밀 키(`JWT_SECRET`) 생성**:
   보안을 위해 강력한 임의의 문자열을 생성합니다. 터미널(SSH)에서 아래 명령어를 실행하세요:
   ```bash
   node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
   ```
   *(출력된 긴 문자열을 복사해 두세요)*

2. **`.env` 파일 편집**:
   `server/` 디렉토리 내의 `.env` 파일을 편집합니다:
   ```bash
   cd ../server
   vi .env
   ```

3. **설정 내용 입력**:
   아래 형식을 참고하여 정보를 입력합니다:
   ```bash
   DB_HOST=localhost (또는 MariaDB 10 IP)
   DB_USER=DB사용자ID
   DB_PASSWORD=DB비밀번호
   DB_NAME=smart_ims_license_db
   DB_PORT=3307  (Synology MariaDB 10 기본 포트)
   
   # 위에서 생성한 보안 키를 여기에 붙여넣으세요
   JWT_SECRET=당신의_보안_키_문자열
   
   PORT=3006
   ```

### 4. 의존성 설치 및 실행
```bash
cd ../server
npm install
# 테스트 실행
node server.js
```

### 5. PM2를 이용한 무중단 운영
서버가 백그라운드에서 계속 실행되도록 `pm2`를 사용합니다. 반드시 **server 폴더**에서 실행하세요.

```bash
# 1. 서버 폴더로 이동
cd /volume1/[NAS사용자폴더]/smart_ims_license/server

# 2. PM2 설치 (이미 설치했다면 생략 가능)
sudo npm install -g pm2

# 3. 서비스 시작
pm2 start server.js --name "license-manager"

# 4. 현재 상태 저장 (재부팅 시 자동 복구를 위해 필수)
pm2 save
```

### 6. Synology 작업 스케줄러 등록 (자동 실행)
NAS가 재부팅될 때 PM2가 자동으로 실행되도록 Synology '작업 스케줄러'에 등록합니다.

1. **제어판 > 작업 스케줄러**로 이동합니다.
2. **생성 > 트리거된 작업 > 사용자 정의 스크립트**를 선택합니다.
3. **일반** 탭:
   - 작업: `Start PM2 License Manager`
   - 사용자: `root` (또는 해당 관리자 계정)
   - 이벤트: `부팅 시`
4. **작업 설정** 탭 (사용자 정의 스크립트 내용):
   ```bash
   # PM2 경로 확인 및 실행 (계정 경로에 따라 다를 수 있음)
   export PATH=$PATH:/usr/local/bin:/usr/bin
   pm2 resurrect
   ```
5. **확인**을 눌러 저장합니다.

## 확인 사항 및 외부 접속 설정

### 1. Synology 역방향 프록시(Reverse Proxy) 설정
외부 도메인(예: `license.yourdomain.com`)을 통해 HTTPS로 접속하려면 역방향 프록시를 설정해야 합니다.

1. **제어판 > 로그인 포털 > 고급 > 역방향 프록시**로 이동합니다.
2. **생성**을 클릭하고 다음과 같이 입력합니다:
   - **일반 탭**:
     - 역방향 프록시 이름: `License Manager`
     - **원본(소스)**:
       - 프로토콜: `HTTPS`
       - 호스트 이름: `도메인 주소` (예: `license.qideun.com`)
       - 포트: `443`
     - **대상(대상)**:
       - 프로토콜: `HTTP`
       - 호스트 이름: `localhost`
       - 포트: `3006` (또는 설정한 포트)
3. **사용자 지정 머리글 탭**:
     - **생성 > WebSocket** 클릭 (자동으로 `Upgrade`, `Connection` 헤더 추가됨)
4. **확인**을 눌러 저장합니다.
5. **보안 > 인증서**: 생성한 도메인에 유효한 인증서(Let's Encrypt 등)가 할당되어 있는지 확인합니다.

### 2. 방화벽 설정
- **제어판 > 보안 > 방화벽**에서 3006 포트(내부 전용) 또는 443 포트(외부 접속용)가 열려 있는지 확인합니다.
- 공유기를 사용 중이라면 443 포트에 대한 포트 포워딩 설정이 필요할 수 있습니다.

---

## 시스템 업데이트 방법 (Git)
코드 수정이나 기능 추가 시 서버에 최신 버전을 적용하는 방법입니다.

```bash
# 1. 서버 폴더로 이동 (예시 경로)
cd /volume1/web/smart_ims_license

# 2. 최신 코드 가져오기
git pull origin main

# 3. 의존성 및 빌드 업데이트 (필요한 경우)
cd server && npm install
cd ../client && npm install && npm run build

# 4. 서비스 재시작
pm2 restart license-manager
```
