# 배포 가이드

## 접속 정보

| 항목 | URL / 경로 |
|---|---|
| **프론트엔드** | https://kcg-ai-monitoring.gc-si.dev |
| **백엔드 API** | https://kcg-ai-monitoring.gc-si.dev/api/* |
| **prediction API** | https://kcg-ai-monitoring.gc-si.dev/api/prediction/* |
| **데모 로그인** | admin / admin1234! (또는 DemoQuickLogin) |
| **DB** | `psql -h 211.208.115.83 -U kcg-app -d kcgaidb` (pw: Kcg2026ai) |

## 서버 구성

| 서버 | SSH | IP | 역할 | 포트 |
|---|---|---|---|---|
| rocky-211 | `ssh rocky-211` | 211.208.115.83 | 프론트 + 백엔드 + nginx | 443, 18080 |
| redis-211 | `ssh redis-211` | 192.168.1.18 | prediction + Redis + Ollama | 18092, 6379, 11434 |

## 서비스 목록

### rocky-211

| 서비스 | systemd | 포트 | 로그 |
|---|---|---|---|
| 백엔드 (Spring Boot) | `kcg-ai-backend.service` | 18080 | `journalctl -u kcg-ai-backend -f` |
| nginx | `nginx.service` | 80/443 | `/var/log/nginx/` |

### redis-211

| 서비스 | systemd | 포트 | 로그 |
|---|---|---|---|
| kcg-ai-prediction | `kcg-ai-prediction.service` | 18092 | `journalctl -u kcg-ai-prediction -f` |
| kcg-prediction (기존 iran) | `kcg-prediction.service` | 8001 | `journalctl -u kcg-prediction -f` |
| kcg-prediction-lab | `kcg-prediction-lab.service` | 18091 | `journalctl -u kcg-prediction-lab -f` |

## 디렉토리 구조

### rocky-211
```
/devdata/services/kcg-ai-monitoring/
├── dist/                           # 프론트엔드 빌드 산출물
│   ├── index.html
│   └── assets/
├── backend/
│   ├── kcg-ai-backend.jar          # Spring Boot 실행 JAR
│   └── application-prod.yml        # 운영 설정
```

### redis-211
```
/home/apps/kcg-ai-prediction/       # 신규 (kcgaidb 연결)
├── .env                            # 환경변수
├── venv/                           # Python 가상환경
├── main.py                         # FastAPI 진입점
├── algorithms/                     # 14개 분석 알고리즘
├── pipeline/                       # 7단계 분류 파이프라인
├── output/                         # 이벤트/통계/KPI 출력 모듈
├── cache/                          # vessel_store
├── db/                             # DB 어댑터
└── ...
```

## nginx 프록시 설정

파일: `/etc/nginx/conf.d/kcg-ai-monitoring.conf` (rocky-211)

```
kcg-ai-monitoring.gc-si.dev (443)
  ├── /              → /devdata/services/kcg-ai-monitoring/dist/ (SPA)
  ├── /api/          → http://127.0.0.1:18080 (Spring Boot)
  ├── /api/prediction/ → http://192.168.1.18:18092 (prediction)
  └── /api/prediction-chat → http://192.168.1.18:18092 (SSE)
```

## 배포 방법

### 프론트엔드 배포
```bash
# 로컬에서 빌드
cd frontend && npx vite build

# 서버에 전송
rsync -avz dist/ rocky-211:/devdata/services/kcg-ai-monitoring/dist/
```

### 백엔드 배포
```bash
# 로컬에서 JAR 빌드
cd backend && ./mvnw clean package -DskipTests

# 서버에 전송
scp target/kcg-ai-backend-0.0.1-SNAPSHOT.jar rocky-211:/devdata/services/kcg-ai-monitoring/backend/kcg-ai-backend.jar

# 서버에서 재시작
ssh rocky-211 "systemctl restart kcg-ai-backend"

# 로그 확인
ssh rocky-211 "journalctl -u kcg-ai-backend -f"
```

### prediction 배포
```bash
# 파일 동기화 (venv 제외)
rsync -avz --exclude='.venv' --exclude='__pycache__' --exclude='.env' --exclude='*.pyc' \
  prediction/ redis-211:/home/apps/kcg-ai-prediction/

# 서버에서 재시작
ssh redis-211 "systemctl restart kcg-ai-prediction"

# 로그 확인
ssh redis-211 "journalctl -u kcg-ai-prediction -f"
```

### 의존성 변경 시 (prediction)
```bash
ssh redis-211 "cd /home/apps/kcg-ai-prediction && source venv/bin/activate && pip install -r requirements.txt"
ssh redis-211 "systemctl restart kcg-ai-prediction"
```

## 로컬 개발 설정

### 기본 (서버 프록시)
```bash
cd frontend && npm run dev
# → /api 요청이 https://kcg-ai-monitoring.gc-si.dev로 프록시됨
```

### 로컬 백엔드 사용 시
```bash
VITE_API_PROXY=http://localhost:8080 npm run dev
# 또는 backend와 함께:
make dev  # frontend + backend 동시 실행
```

## 서비스 관리

```bash
# 상태 확인
ssh rocky-211 "systemctl status kcg-ai-backend"
ssh redis-211 "systemctl status kcg-ai-prediction"

# 재시작
ssh rocky-211 "systemctl restart kcg-ai-backend"
ssh redis-211 "systemctl restart kcg-ai-prediction"

# 로그 (실시간)
ssh rocky-211 "journalctl -u kcg-ai-backend -f"
ssh redis-211 "journalctl -u kcg-ai-prediction -f"

# health check
curl -s https://kcg-ai-monitoring.gc-si.dev/actuator/health
curl -s http://192.168.1.18:18092/health  # redis-211 내부
```

## DB 접속
```bash
PGPASSWORD='Kcg2026ai' psql -h 211.208.115.83 -U kcg-app -d kcgaidb
# 스키마: kcg, 테이블 37개
```

## 포트 정리

| 포트 | 서비스 | 서버 |
|---|---|---|
| 443 | nginx (HTTPS) | rocky-211 |
| 18080 | kcg-ai-backend (Spring Boot) | rocky-211 |
| 18092 | kcg-ai-prediction (FastAPI) | redis-211 |
| 8001 | kcg-prediction (기존 iran) | redis-211 |
| 18091 | kcg-prediction-lab | redis-211 |
| 5432 | PostgreSQL (kcgaidb, snpdb) | 211.208.115.83 |
| 6379 | Redis | redis-211 |
| 11434 | Ollama | redis-211 |

## CI/CD

### 프론트엔드 — Gitea Actions 자동배포
- 워크플로우: `.gitea/workflows/deploy.yml`
- 트리거: `main` 브랜치 push, `frontend/**` 변경 시
- 빌드: Node.js 24, `frontend/` 디렉토리에서 `npm ci && npm run build`
- 배포: `frontend/dist/` → `/deploy/kcg-ai-monitoring/` (Gitea runner mount)
- Gitea runner가 rocky-211에서 실행 중이므로 dist가 자동 배포됨

### 백엔드 — SSH 수동배포
```bash
# 1. 로컬 빌드
cd backend && ./mvnw clean package -DskipTests

# 2. 서버 전송
scp target/kcg-ai-backend-0.0.1-SNAPSHOT.jar \
  rocky-211:/devdata/services/kcg-ai-monitoring/backend/kcg-ai-backend.jar

# 3. 재시작
ssh rocky-211 "systemctl restart kcg-ai-backend"
```

### prediction — SSH 수동배포
```bash
# 1. 파일 동기화
rsync -avz --exclude='.venv' --exclude='__pycache__' --exclude='.env' --exclude='*.pyc' \
  prediction/ redis-211:/home/apps/kcg-ai-prediction/

# 2. 의존성 변경 시
ssh redis-211 "cd /home/apps/kcg-ai-prediction && source venv/bin/activate && pip install -r requirements.txt"

# 3. 재시작
ssh redis-211 "systemctl restart kcg-ai-prediction"
```

## 서버 실행 경로 정리

### rocky-211 (211.208.115.83)
| 경로 | 용도 |
|---|---|
| `/devdata/services/kcg-ai-monitoring/dist/` | 프론트 빌드 산출물 (nginx root) |
| `/devdata/services/kcg-ai-monitoring/backend/kcg-ai-backend.jar` | 백엔드 실행 JAR |
| `/devdata/services/kcg-ai-monitoring/backend/application-prod.yml` | 백엔드 운영 설정 |
| `/etc/nginx/conf.d/kcg-ai-monitoring.conf` | nginx 프록시 설정 |
| `/etc/systemd/system/kcg-ai-backend.service` | 백엔드 systemd 서비스 |
| `/usr/lib/jvm/java-21-openjdk/bin/java` | Java 21 실행 경로 |

### redis-211 (192.168.1.18)
| 경로 | 용도 |
|---|---|
| `/home/apps/kcg-ai-prediction/` | prediction 앱 디렉토리 |
| `/home/apps/kcg-ai-prediction/.env` | prediction 환경변수 |
| `/home/apps/kcg-ai-prediction/venv/` | Python 3.9 가상환경 |
| `/etc/systemd/system/kcg-ai-prediction.service` | prediction systemd 서비스 |
| `/home/apps/kcg-prediction/` | 기존 iran prediction (포트 8001) |
| `/home/apps/kcg-prediction-lab/` | 기존 lab prediction (포트 18091) |
