# 배포 가이드 ## 접속 정보 | 항목 | 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 (레거시) | `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 (레거시) | 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/` | 레거시 prediction (포트 8001) | | `/home/apps/kcg-prediction-lab/` | 기존 lab prediction (포트 18091) |