# task-932.4: Whisper GPU 서비스 인프라 완성 + InsuWiki 최종 연동 (한정위임)

## 배경
- task-932.3에서 Whisper GPU HTTP 서비스 + InsuWiki whisperStt.ts 통합 코드 완성
- 미해결 이슈 2건:
  1. GCP Cloud Functions → localhost:8200 접근 불가 (네트워크)
  2. systemd 서비스 미등록 (자동 시작 불가)
- 목표: InsuWiki의 2개 채널(보험명의정닥터, ins-king) 크롤링에서 **바로 Whisper GPU 활용 가능하게** 최종 세팅

## 현재 상황
- Whisper GPU 서비스 코드: `/home/jay/workspace/services/whisper-gpu/server.py` (포트 8200)
- 시작 스크립트: `/home/jay/workspace/scripts/start-whisper-gpu.sh`
- InsuWiki whisperStt.ts: LOCAL_WHISPER_URL 환경변수로 URL 설정 가능 (기본값 localhost:8200)
- 서버 공개 IP: **211.49.68.111**
- ngrok 설치 경로: `/home/jay/.local/bin/ngrok`
- InsuWiki Cloud Functions: GCP asia-northeast3(서울) 리전, 6시간마다 자동 실행

## 작업 범위

### Step 1: Whisper GPU 서비스 시작 + 동작 확인
- `/home/jay/workspace/scripts/start-whisper-gpu.sh` 실행하여 서비스 기동
- health check: `curl http://localhost:8200/v1/health` 확인
- GPU 모델 로딩 정상 확인

### Step 2: 네트워크 접근 방안 구현
GCP Cloud Functions에서 Whisper 서비스에 접근할 수 있도록 설정. 아래 방안 중 가장 안정적인 것 선택:

**방안 A (권장): 서버 공개 IP + API 키 인증**
- 서버 방화벽에서 포트 8200 오픈: `sudo ufw allow 8200/tcp`
- server.py에 간단한 API 키 인증 미들웨어 추가 (X-API-Key 헤더)
  - API 키는 `/home/jay/workspace/.env.keys`에 저장 (WHISPER_API_KEY)
  - InsuWiki whisperStt.ts의 callLocalWhisper()에도 X-API-Key 헤더 추가
- LOCAL_WHISPER_URL = `http://211.49.68.111:8200`

**방안 B: ngrok 터널**
- `/home/jay/.local/bin/ngrok http 8200` → 고정 URL 생성
- 무료 tier: URL 변경됨 (재시작 시)
- 유료 tier 필요 시 방안 A로 전환

**방안 C: Cloudflare Tunnel**
- cloudflared 설치 + 터널 설정
- 고정 URL, 자동 재연결, 무료
- 설정 복잡도 높음

→ **방안 A를 1순위로 진행** (가장 간단하고 안정적). API 키로 보안 확보.

### Step 3: systemd 서비스 등록
- `/etc/systemd/system/whisper-gpu.service` 생성
```ini
[Unit]
Description=Whisper GPU STT Service
After=network.target

[Service]
Type=simple
User=jay
WorkingDirectory=/home/jay/workspace/services/whisper-gpu
Environment="PATH=/home/jay/.local/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/home/jay/workspace/scripts/start-whisper-gpu.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
```
- `sudo systemctl daemon-reload && sudo systemctl enable whisper-gpu && sudo systemctl start whisper-gpu`
- `sudo systemctl status whisper-gpu` 로 정상 확인

### Step 4: InsuWiki Firebase Functions 환경변수 설정
- Firebase Functions 환경변수에 LOCAL_WHISPER_URL 설정:
  ```bash
  cd /home/jay/projects/insuwiki
  firebase functions:config:set whisper.local_url="http://211.49.68.111:8200"
  ```
  또는 `.env` 파일에 추가 (Functions 2세대인 경우)
- whisperStt.ts에서 process.env.LOCAL_WHISPER_URL이 해당 값을 읽는지 확인
- 만약 Firebase Functions config 방식이면, whisperStt.ts에서 `functions.config().whisper.local_url`로 읽도록 수정 필요

### Step 5: E2E 테스트
1. 외부에서 접근 테스트: `curl http://211.49.68.111:8200/v1/health` (서버 외부에서)
2. InsuWiki Functions 로컬 에뮬레이터로 테스트: 자막 없는 유튜브 영상 ID로 whisperTranscribe() 호출
3. 실제 Cloud Functions에서 테스트 (deploy 후)
4. 2개 채널 크롤링이 로컬 Whisper를 사용하는지 로그 확인

## 참조 자료
- Whisper GPU 서비스: `/home/jay/workspace/services/whisper-gpu/server.py`
- 시작 스크립트: `/home/jay/workspace/scripts/start-whisper-gpu.sh`
- InsuWiki whisperStt.ts: `/home/jay/projects/insuwiki/functions/src/whisperStt.ts`
- InsuWiki 크롤러: `/home/jay/projects/insuwiki/functions/src/crawlYoutubeChannels.ts`
- task-932.3 보고서: `memory/reports/task-932.3.md`

## 주의사항
- server.py에 API 키 인증 추가 시, health 엔드포인트는 인증 없이 허용 (모니터링용)
- 기존 localhost 접근도 유지 (로컬 테스트용)
- API 키를 코드에 하드코딩하지 말 것 → .env.keys 또는 환경변수에서 로드
- InsuWiki 기존 로직(YouTube 자막, OpenAI fallback) 절대 건드리지 않을 것
- whisperStt.ts 수정 시 callLocalWhisper() 함수만 수정 (X-API-Key 헤더 추가)

## 산출물
- 방화벽 설정 완료 (또는 터널 설정)
- server.py API 키 인증 추가
- systemd 서비스 등록 + 자동 시작 확인
- InsuWiki LOCAL_WHISPER_URL 환경변수 설정
- whisperStt.ts X-API-Key 헤더 추가
- E2E 테스트 결과 보고서