# MOTU HTS

정적 프론트엔드, 사용자 PC 로컬 데이터 에이전트, Supabase Room/로그인/채팅, Cloudflare Pages 배포를 쓰는 모의투자 HTS입니다.

## 포함 기능

- Google 로그인(Supabase Auth)
- 최초 로그인 사용자 닉네임 설정, 기존 사용자 프로필/닉네임 수정
- 실시간 Room / 타임머신 Room 생성과 참여
- 같은 Room 채팅
- Room 모드 잠금: 실시간 Room은 실시간만, 타임머신 Room은 생성 시점 일자만 사용
- yfinance 우선 + 네이버 금융 백업 기반 한국 종목 차트
- KRX 상장법인 목록 기반 KOSPI/KOSDAQ 종목 검색
- 뉴스바 Search 페이지와 기사 뷰어
- Cloudflare Pages 배포용 `dist/` 빌드와 로컬 에이전트 설치 파일 제공

## 로컬 실행

```powershell
.\start-motu.ps1
```

또는:

```powershell
npm start
```

프론트: `http://127.0.0.1:5174/index.html`

백엔드 헬스 체크: `http://127.0.0.1:8000/api/health`

## Supabase 설정

운영자가 한 번만 설정합니다. 일반 사용자는 키를 입력하지 않습니다.

1. Supabase 프로젝트 생성
2. Authentication > Providers > Google 활성화
3. Authentication > URL Configuration에 서비스 주소 추가
   - 개발: `http://localhost:5174`
   - 배포: `https://motu-hts.pages.dev`
4. SQL Editor에서 `supabase/schema.sql` 실행
5. Project Settings > API에서 Project URL과 anon public key 확인
6. 설정 파일 작성

```powershell
.\scripts\write-supabase-config.ps1 `
  -Url "https://YOUR_PROJECT_REF.supabase.co" `
  -AnonKey "YOUR_SUPABASE_ANON_KEY"
```

Supabase CLI를 쓰는 경우:

```powershell
npm run login:supabase
npx supabase link --project-ref YOUR_PROJECT_REF
npm run db:supabase
```

## Cloudflare Pages 배포

Cloudflare 무료 `*.pages.dev` 주소로 공개 웹서비스를 만들 수 있습니다. 별도 도메인을 구매하지 않아도 `https://motu-hts.pages.dev` 같은 주소를 바로 쓸 수 있습니다.

빌드:

```powershell
npm run build:cloudflare
```

로그인:

```powershell
npm run login:cloudflare
```

배포:

```powershell
npm run deploy:cloudflare
```

성공하면 `service-url.txt`에 공개 주소가 저장됩니다. 그 주소를 Supabase Authentication > URL Configuration의 Site URL 및 Redirect URLs에 추가해야 Google 로그인이 정상 동작합니다.

자동 배포 토큰을 쓰는 경우:

```powershell
$env:CLOUDFLARE_API_TOKEN = "<Cloudflare API Token>"
$env:CLOUDFLARE_ACCOUNT_ID = "<Cloudflare Account ID>"
$env:CLOUDFLARE_PAGES_PROJECT_NAME = "motu-hts"
npm run deploy:cloudflare
```

필요 권한: Account > Cloudflare Pages > Edit

## 로컬 데이터 에이전트

Cloudflare에는 정적 프론트와 설치 파일만 올라갑니다. 주가/뉴스 데이터를 빠르게 가져오는 Python 백엔드는 각 사용자 PC에서 로컬 에이전트로 실행됩니다.

배포 빌드 시 `motu-agent.zip`이 함께 생성됩니다. 웹앱의 데이터 연결 버튼에서 설치 파일을 받을 수 있고, 설치 후에는 웹앱에서 데이터 에이전트를 켤 수 있습니다.

## 파일 구조

- `index.html`, `main.js`, `styles.css`: HTS 프론트
- `past-news.html`, `past-news.js`, `past-news.css`: 뉴스 검색/기사 뷰어
- `backend/app.py`: FastAPI 로컬 에이전트
- `backend/market.py`: 시세 데이터 수집
- `backend/news.py`, `backend/news_reader.py`: 뉴스 검색/기사 프레임 처리
- `supabase/schema.sql`: 사용자, Room, 채팅 DB 스키마와 RLS 정책
- `scripts/build-cloudflare.ps1`: Cloudflare Pages 배포 파일 생성
- `scripts/deploy-cloudflare-pages.ps1`: Cloudflare Pages 배포
- `scripts/write-supabase-config.ps1`: Supabase 설정 파일 작성

## 참고

- Room과 채팅은 Supabase 로그인 사용자를 기준으로 동작합니다.
- `supabase.config.js`가 비어 있으면 로그인/Room 온라인 기능은 비활성화됩니다.
- 뉴스와 주가 데이터 속도는 로컬 에이전트 연결 상태에 가장 크게 좌우됩니다.
