# 🚀 Quant Engine 배포 (Step-by-Step)

**상태**: 배포 준비 완료  
**일시**: 2026-06-25 18:30 KST  
**패키지**: 24MB (173 파일)

---

## 🎯 배포 체크

### ✅ 현재 상태
```
[✓] Release 빌드: 완료 (24MB)
[✓] SSH 연결: 성공 (178.104.200.7)
[✓] 배포 스크립트: 준비됨
[⚠] sudo 권한: 터미널 상호작용 필요
```

---

## 📋 배포 옵션

### **권장: 원격 SSH 배포** (관리자 권한 필요)

#### 터미널에서 실행 (대화형 모드)
```bash
# 1단계: 배포 디렉토리 이동
cd /c/Temp/data_feed

# 2단계: SSH 접속 (대화형)
ssh kjh2064@178.104.200.7

# 원격 서버에서 실행:
# ─────────────────────────────────────

# 3단계: 백업 생성
sudo mkdir -p /var/www/quant_backup
sudo cp -r /var/www/quant/publish /var/www/quant_backup/backup_$(date +%Y%m%d_%H%M%S)
echo "✓ 백업 완료"

# 4단계: 배포 폴더 권한 설정
sudo chmod -R 777 /var/www/quant/publish
echo "✓ 권한 설정"

# 5단계: 로컬에서 파일 전송 준비
# (다음 터미널에서 실행)
```

#### 로컬 터미널 (새 창)
```bash
# 파일 전송
cd /c/Temp/data_feed
rsync -avz --delete --progress \
  src/dotnet/QuantEngine.Web/publish/ \
  kjh2064@178.104.200.7:/var/www/quant/publish/

# 출력:
# - 삭제된 파일: (없음)
# - 전송된 파일: 173개
# - 전송 크기: 24MB
# - 예상 시간: 1-3분
```

#### 원격 서버 계속 (첫 터미널)
```bash
# 6단계: 권한 최종 설정
sudo chown -R www-data:www-data /var/www/quant/publish
sudo chmod -R 755 /var/www/quant/publish
echo "✓ 권한 최종 설정"

# 7단계: nginx 재시작
sudo systemctl restart nginx
echo "✓ nginx 재시작 완료"

# 8단계: 상태 확인
sudo systemctl status nginx
curl -I http://localhost/quant/
echo "✓ 배포 완료"

# 9단계: SSH 종료
exit
```

---

### **빠른 배포** (SSH 키 기반, 비대화형)

#### 한 줄 명령
```bash
cd /c/Temp/data_feed && \
rsync -avz --delete src/dotnet/QuantEngine.Web/publish/ \
  kjh2064@178.104.200.7:/var/www/quant/publish/ && \
ssh kjh2064@178.104.200.7 \
  'sudo systemctl restart nginx && echo "✓ 배포 완료"'
```

---

### **로컬 테스트 배포** (네트워크 불필요)

#### Windows PowerShell
```powershell
# 1. IIS 사이트 폴더 생성
New-Item -ItemType Directory -Path "C:\var\www\quant\publish" -Force

# 2. 배포 파일 복사
Copy-Item -Path "src/dotnet/QuantEngine.Web/publish/*" `
          -Destination "C:\var\www\quant\publish" `
          -Recurse -Force

# 3. IIS에서 새 사이트 생성
# 이름: Quant Engine
# 경로: C:\var\www\quant\publish
# 포트: 8080

# 4. 앱 풀 설정
# .NET 런타임: 10.0
# 파이프라인 모드: Integrated

# 5. 접속
# http://localhost:8080
```

---

## 🔍 배포 후 검증

### 1️⃣ 웹 서비스 상태 확인
```bash
# HTTP 응답 확인
curl -I http://178.104.200.7/quant/

# 기대 결과:
# HTTP/1.1 200 OK
# Content-Type: text/html; charset=utf-8
# Server: nginx
```

### 2️⃣ 로그 확인
```bash
# nginx 에러 로그
ssh kjh2064@178.104.200.7 'sudo tail -20 /var/log/nginx/error.log'

# 기대: 에러 없음

# 접근 로그
ssh kjh2064@178.104.200.7 'sudo tail -10 /var/log/nginx/access.log'

# 기대: GET /quant/ 200 응답
```

### 3️⃣ 기능 테스트
```bash
# 페이지 로드 시간
time curl -s http://178.104.200.7/quant/ | wc -l
# 기대: < 2초, > 1000 라인

# MudBlazor 로드 확인
curl -s http://178.104.200.7/quant/ | grep "MudBlazor"
# 기대: MudBlazor.min.css, MudBlazor.min.js 포함
```

### 4️⃣ 브라우저 테스트
```
1. http://178.104.200.7/quant/ 접속
2. Dashboard 페이지 로드 확인
3. KPI 카드 렌더링 확인
4. 성과 메트릭 표시 확인
5. 알고리즘 테이블 표시 확인
6. 신호 피드 표시 확인
7. MudBlazor 스타일 적용 확인
8. 모바일 반응형 확인 (F12 → 모바일 모드)
```

---

## ✅ 배포 체크리스트

### 배포 전
```
[ ] Release 빌드 완료 확인
[ ] SSH 키 권한 확인 (chmod 600 ~/.ssh/id_ed25519)
[ ] 원격 서버 접속 가능 확인
[ ] 디스크 공간 확인 (df -h: > 500MB 필요)
[ ] nginx 실행 확인 (systemctl status nginx)
```

### 배포 중
```
[ ] 백업 생성 확인
[ ] 파일 전송 진행 상황 모니터링
[ ] 권한 설정 완료 확인
[ ] nginx 재시작 성공 확인
```

### 배포 후
```
[ ] HTTP 200 응답 확인
[ ] Dashboard 페이지 로드 확인
[ ] MudBlazor 스타일 렌더링 확인
[ ] 모든 카드 표시 확인
[ ] 테이블 데이터 표시 확인
[ ] 모바일 반응형 작동 확인
[ ] 로그 에러 없음 확인
```

---

## 🆘 긴급 복구

### 이전 버전으로 복원
```bash
ssh kjh2064@178.104.200.7 << 'EOF'
# 백업 목록 확인
ls -la /var/www/quant_backup/

# 최신 백업으로 복원
LATEST_BACKUP=$(ls -t /var/www/quant_backup/ | head -1)
sudo cp -r /var/www/quant_backup/$LATEST_BACKUP/* /var/www/quant/publish/

# 권한 재설정
sudo chown -R www-data:www-data /var/www/quant/publish
sudo chmod -R 755 /var/www/quant/publish

# nginx 재시작
sudo systemctl restart nginx

echo "✓ 복원 완료"
EOF
```

---

## 📊 배포 결과 요약

### 예상 결과
```
배포 패키지:      24MB (173 파일)
전송 시간:        1-3분
배포 후 상태:     HTTP 200 OK
MudBlazor 로드:   ✅ CSS + JS 포함
Dashboard 렌더링: ✅ KPI + 메트릭 + 알고리즘 + 신호
응답 시간:        < 1초
메모리 사용:      ~150MB (초기)
```

### 배포 완료 후
```
✅ 웹 서비스 운영 시작
✅ 실시간 신호 모니터링 가능
✅ 성과 메트릭 대시보드 접속 가능
✅ 알고리즘 진행 상황 추적 가능
✅ 모바일 접속 가능 (반응형)
```

---

## 📞 배포 문제 해결

| 문제 | 원인 | 해결 |
|------|------|------|
| SSH 연결 실패 | SSH 키 없음 | `ssh-keygen -t ed25519` |
| sudo 암호 요청 | 터미널 상호작용 | SSH 대화형 모드 사용 |
| 파일 전송 실패 | 네트워크 단절 | rsync 재실행 (재개 가능) |
| HTTP 403 | 파일 권한 | `sudo chmod -R 755 /var/www/quant` |
| 스타일 미적용 | CSS 로드 실패 | nginx 캐시 삭제, 브라우저 캐시 삭제 |
| 포트 충돌 | nginx 미실행 | `sudo systemctl start nginx` |

---

## 🎯 다음 단계

### 배포 완료 후
```
1. ✅ 웹 서비스 모니터링 설정
2. ✅ 로그 수집 설정 (ELK Stack 또는 CloudWatch)
3. ✅ 백업 자동화 (cron 또는 systemd timer)
4. ✅ 성능 모니터링 (Prometheus + Grafana)
5. ⏳ 추가 기능 구현 (Portfolio, Analytics, Reports)
```

### 운영
```
1. 일일 헬스 체크 (cron)
2. 주간 로그 분석
3. 월간 성능 리뷰
4. 실시간 신호 모니터링
5. 거래 결과 추적 (live_outcome_ledger)
```

---

## 📝 배포 명령어 복사

### 빠른 배포 (한 줄)
```bash
cd /c/Temp/data_feed && rsync -avz --delete src/dotnet/QuantEngine.Web/publish/ kjh2064@178.104.200.7:/var/www/quant/publish/ && ssh kjh2064@178.104.200.7 'sudo systemctl restart nginx'
```

### 안전한 배포 (단계별)
```bash
# Step 1: 백업
ssh kjh2064@178.104.200.7 'sudo cp -r /var/www/quant/publish /var/www/quant_backup/backup_$(date +%Y%m%d_%H%M%S)'

# Step 2: 전송
rsync -avz --delete src/dotnet/QuantEngine.Web/publish/ kjh2064@178.104.200.7:/var/www/quant/publish/

# Step 3: 권한
ssh kjh2064@178.104.200.7 'sudo chown -R www-data:www-data /var/www/quant/publish && sudo chmod -R 755 /var/www/quant/publish'

# Step 4: 재시작
ssh kjh2064@178.104.200.7 'sudo systemctl restart nginx'

# Step 5: 확인
curl -I http://178.104.200.7/quant/
```

---

**배포 준비 완료!** 🚀

위의 명령어를 복사하여 터미널에 붙여넣기하여 배포를 시작하세요.
