chore: Phase 3.3 세션 핸드오프 — SaaS 인프라 완결
This commit is contained in:
parent
3ef971e0fd
commit
1439ed3c7a
1 changed files with 70 additions and 112 deletions
|
|
@ -1,148 +1,106 @@
|
||||||
# Session Handoff — 2026-04-12 21:00 (Phase 3.2-B Payple 결제 + 대시보드 Premium)
|
# Session Handoff — 2026-04-12 22:00 (Phase 3.3 SaaS 인프라 완결)
|
||||||
|
|
||||||
> From: macOS (yunchan-ui-MacBookPro)
|
> From: macOS (yunchan-ui-MacBookPro)
|
||||||
> Last commit: `c9baf03` — feat(server+web+desktop): Phase 3.2-B Payple 결제 연동 + 대시보드 Premium 상태 표시
|
> Last commit: `3ef971e` — chore: project_status 갱신 — Admin CRM 독립 프로젝트 완료
|
||||||
> Branch: `main`
|
> Branch: `main`
|
||||||
> Remote: `https://gitlab.twentyoz.kr:8443/d3r0/voice.git`
|
> Remote: `https://gitlab.twentyoz.kr:8443/d3r0/voice.git`
|
||||||
> Working tree: clean (push 필요)
|
> Working tree: clean (pushed)
|
||||||
|
|
||||||
## ✅ 이번 세션에서 한 일
|
## 이번 세션에서 한 일 (12 커밋)
|
||||||
|
|
||||||
### `c9baf03` — Phase 3.2-B (27파일, +1318/-98)
|
### Phase 3.2-B 배포 + 버그 수정
|
||||||
|
- Payple Edge Functions 3개 (`payple-checkout/webhook/manage`) 배포 ACTIVE
|
||||||
|
- DB migration `20260412000002_payple_billing.sql` 적용
|
||||||
|
- Electron `OPEN_BILLING`: dev/prod URL 분기 (`app.isPackaged`)
|
||||||
|
- CloudSyncService: stored token 없을 때 `auth-changed null` emit 누락 수정
|
||||||
|
|
||||||
**A. Payple 결제 연동 (Stripe → Payple 전면 교체)**
|
### 라이선스 UI 빅뱅
|
||||||
- `_shared/payple.ts` — Payple REST API 래퍼 (auth, billing, cancel, deleteBillingKey, 유틸리티)
|
- LicenseTab/LicenseModal: LemonSqueezy 키 입력 제거 → Payple 구독 UI
|
||||||
- `payple-checkout/index.ts` — 빌링키로 첫 결제 실행 + subscriptions/profiles 업데이트
|
- `useLicenseState` 훅: 공용 상태 관리 추출
|
||||||
- `payple-webhook/index.ts` — 결제완료/취소 이벤트 수신 + DB 반영
|
- `PREMIUM_MODEL_LIMITS`: 3곳 중복 → `@d3ro/core/constants` 단일 소스
|
||||||
- `payple-manage/index.ts` — 구독 취소 (빌링키 해지 + cancel_at 설정)
|
- i18n: LS 키 18개 삭제, 구독 키 13개 추가 (12 locale)
|
||||||
- DB migration: `payment_provider`, `payple_payer_id`, `payple_pay_oid` 컬럼
|
|
||||||
- `config.toml`: payple-* 3개 함수 verify_jwt=false
|
|
||||||
- 웹 `billing/page.tsx`: 티어 통일(team→pro_plus), Payple 컴포넌트로 교체
|
|
||||||
- `payple-checkout-button.tsx`: Payple JS SDK 결제창 + callbackFunction 패턴
|
|
||||||
- `payple-manage-button.tsx`: 구독 취소 확인 다이얼로그
|
|
||||||
- Electron `LicenseModal`: alert 스텁 → `shell.openExternal(billingUrl)`
|
|
||||||
- IPC: `LICENSE.OPEN_BILLING` + preload `license.openBilling()` + 핸들러
|
|
||||||
|
|
||||||
**B. 대시보드 Premium 상태 표시**
|
### 마스터플랜 4개 작업
|
||||||
- DashboardPage services 배열에 PREMIUM LLM LED 추가
|
1. **LemonSqueezy 코드 제거** — LicenseService ~150줄 삭제
|
||||||
- 백엔드 인디케이터 카드 (Local/Premium LED) + 티어 카드
|
2. **Payple 정기 갱신 크론** — `payple-renew` Edge Function + GitHub Actions (매일 01:00 UTC)
|
||||||
- 사용량 섹션: 전 티어에서 표시 + Premium 모델별(Haiku/Sonnet/Opus) 쿼터
|
3. **관리자 CRM** — `apps/admin` 독립 Next.js 앱 (포트 3001)
|
||||||
- 12개 locale × 14개 i18n 키
|
4. **SSE 스트리밍** — `sse-parser.ts` + `invokeFunctionStream()` + `chatStream()` 업그레이드
|
||||||
|
|
||||||
## 🚧 미해결 / 미테스트
|
### Admin CRM 독립화 + 버그 수정
|
||||||
|
- `apps/admin` 독립 프로젝트로 분리 (apps/web에서 제거)
|
||||||
|
- RLS 재귀 참조 수정 → `app_metadata` 기반
|
||||||
|
- OAuth 콜백 쿠키 설정 수정
|
||||||
|
- middleware 추가 (Supabase 세션 갱신)
|
||||||
|
|
||||||
### 1. Payple 테스트 미완 (선행 필요)
|
## 현재 배포 상태
|
||||||
- Payple 가맹점 등록 → CST_ID/CUST_KEY/REFUND_KEY/CLIENT_KEY 발급
|
|
||||||
- Supabase Secrets: `supabase secrets set PAYPLE_CST_ID=... PAYPLE_CUST_KEY=... PAYPLE_REFUND_KEY=... PAYPLE_CLIENT_KEY=...`
|
|
||||||
- DB migration 배포: `supabase db push` (20260412000002_payple_billing.sql)
|
|
||||||
- Payple 관리자에서 webhook URL 등록: `https://{project-ref}.supabase.co/functions/v1/payple-webhook`
|
|
||||||
- 웹 환경변수: `NEXT_PUBLIC_PAYPLE_CLIENT_KEY` (없으면 테스트 키 폴백)
|
|
||||||
|
|
||||||
### 2. 대시보드 시각 확인 미완
|
| 게이트 | 결과 |
|
||||||
- 앱에서 직접 대시보드 UI 확인 필요 (Premium LED, 쿼터 바 등)
|
|---|---|
|
||||||
|
| desktop `tsc --noEmit` | ✅ |
|
||||||
|
| web `tsc --noEmit` | ✅ |
|
||||||
|
| admin `tsc --noEmit` | ✅ |
|
||||||
|
| Payple Edge Functions 4개 | ✅ ACTIVE |
|
||||||
|
| DB migrations 4개 | ✅ 적용 |
|
||||||
|
| git push | ✅ |
|
||||||
|
|
||||||
### 3. 세션 만료 렌더러 미동기화 (기존 이슈)
|
## 서비스 현황
|
||||||
|
|
||||||
### 4. LemonSqueezy 코드 잔존
|
| 서비스 | 포트 | 상태 |
|
||||||
- LicenseService.ts에 deprecated 코드. 다음 사이클에서 정리
|
|--------|------|------|
|
||||||
|
| Electron + Vite | :5173 | 실행 중 |
|
||||||
|
| Web (Next.js) | :3000 | 실행 중 |
|
||||||
|
| Admin CRM (Next.js) | :3001 | 실행 중 |
|
||||||
|
| Ollama | :11434 | gemma4:e4b + qwen3:4b |
|
||||||
|
| Supabase | remote | Edge Functions 배포 |
|
||||||
|
|
||||||
### 5. Payple 정기 갱신 크론 미구현
|
## 다음 세션 우선순위
|
||||||
- `payple-renew` Edge Function + pg_cron 필요
|
|
||||||
|
|
||||||
## 🧭 다음 사이클 계획
|
### A) Admin CRM 기능 강화
|
||||||
|
- 유저 role 변경 기능 (admin → user / user → admin)
|
||||||
|
- 구독 수동 변경 (tier 변경, 기간 연장)
|
||||||
|
- 사용량 차트 (recharts)
|
||||||
|
- 결제 이력 조회
|
||||||
|
|
||||||
1. **Payple 가맹점 등록 + 테스트**
|
### B) SSE 스트리밍 E2E 테스트
|
||||||
- 테스트 키로 E2E: 웹 결제창 → 빌링키 발급 → 첫 결제 → DB 확인
|
- Voice Conversation에서 Premium 모델 선택 → 토큰 단위 실시간 표시 확인
|
||||||
- Electron: 업그레이드 버튼 → 웹 열림 → 결제 후 CloudSync tier 갱신
|
- TTS 파이프라인과 연결 확인
|
||||||
- 대시보드 시각 확인
|
|
||||||
|
|
||||||
2. **Payple 정기 갱신 크론** (payple-renew)
|
### C) Payple 라이브 전환 준비
|
||||||
|
- 테스트 키 → 라이브 키 교체
|
||||||
|
- Webhook URL 등록 (Payple 관리자)
|
||||||
|
- PAYPLE_SITE_URL 프로덕션 값 설정
|
||||||
|
|
||||||
3. **세션 만료 버그 수정** (CloudSyncService auth-changed emit)
|
### D) 랜딩 페이지 (site/) 업데이트
|
||||||
|
- 결제 섹션 Payple로 업데이트
|
||||||
|
- 가격 정책 반영
|
||||||
|
|
||||||
4. **LemonSqueezy 코드 정리**
|
### E) 코드 정리 백로그
|
||||||
|
- `supabase-server.ts` / `supabase-browser.ts` 공통 패키지 추출
|
||||||
|
- LicenseService의 오프라인 유예/재검증 로직 (LS 제거 후 불필요할 수 있음)
|
||||||
|
- `ActivateLicenseParams`/`Result` 타입 정리
|
||||||
|
|
||||||
5. **관리자 백엔드 서비스 웹페이지** (백로그)
|
## 다음 세션 시작 시 확인
|
||||||
- 사용자 관리 CRM, 구독 현황 대시보드, 쿼터 관리, 결제 이력 조회
|
|
||||||
- 별도 admin/ 앱 또는 apps/web 내 admin 라우트 그룹
|
|
||||||
|
|
||||||
## 🔑 다음 세션 시작 시 확인
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git pull origin main # HEAD = c9baf03
|
git pull origin main # HEAD = 3ef971e
|
||||||
pgrep -lf "Electron\.app|next dev"
|
pgrep -lf "Electron\.app|next dev"
|
||||||
lsof -i :5173 -sTCP:LISTEN
|
lsof -i :5173 -sTCP:LISTEN
|
||||||
lsof -i :3000 -sTCP:LISTEN
|
lsof -i :3000 -sTCP:LISTEN
|
||||||
|
lsof -i :3001 -sTCP:LISTEN
|
||||||
# 죽어있으면
|
# 죽어있으면
|
||||||
nohup npm run dev > /tmp/d3ro-desktop.log 2>&1 & disown
|
nohup npm run dev > /tmp/d3ro-desktop.log 2>&1 & disown
|
||||||
nohup npm --workspace=@d3ro/web run dev > /tmp/d3ro-web.log 2>&1 & disown
|
nohup npm --workspace=@d3ro/web run dev > /tmp/d3ro-web.log 2>&1 & disown
|
||||||
|
nohup npm --workspace=@d3ro/admin run dev > /tmp/d3ro-admin.log 2>&1 & disown
|
||||||
```
|
```
|
||||||
|
|
||||||
## ⚠️ Payple 연동 핵심 포인트
|
## Admin CRM 접속 방법
|
||||||
|
1. `http://localhost:3001` → Google OAuth 로그인
|
||||||
|
2. admin 권한 필요: `UPDATE auth.users SET raw_app_meta_data = raw_app_meta_data || '{"role":"admin"}' WHERE id = '...'`
|
||||||
|
3. JWT 갱신을 위해 로그아웃 → 재로그인 필요
|
||||||
|
|
||||||
- **Payple JS SDK**: 브라우저 전용 → Electron에서는 웹 페이지 경유
|
## 의존성 / 도구
|
||||||
- **테스트 키**: `cst_id: test`, `custKey: abcd1234567890`, `clientKey: test_DF55F29DA654A8CBC0F0A9DD4B556486`
|
|
||||||
- **테스트 서버**: `democpay.payple.kr` (라이브: `cpay.payple.kr`)
|
|
||||||
- **Referer 검증**: Payple이 Referer 헤더로 도메인 확인 → `PAYPLE_SITE_URL` 환경변수 설정 필수
|
|
||||||
- **결제 흐름**: JS SDK → callbackFunction → Edge Function(payple-checkout) → DB 업데이트
|
|
||||||
- **빌링 결제는 서버→서버**: Edge Function이 `paypleAuth()` → `paypleBilling()` 호출
|
|
||||||
|
|
||||||
## 📦 의존성 / 도구
|
|
||||||
|
|
||||||
- Node 22.22.2 / Python 3.13.13 / Supabase CLI 2.84.2
|
- Node 22.22.2 / Python 3.13.13 / Supabase CLI 2.84.2
|
||||||
- Ollama 0.20.5 (gemma4:e4b 기본)
|
- Ollama 0.20.5 (gemma4:e4b 기본)
|
||||||
- Electron 33.4.11 / Next.js 15.5.14
|
- Electron 33.4.11 / Next.js 15.5.14
|
||||||
- SoX 14.4.2 / faster-whisper base (CPU int8)
|
- SoX 14.4.2 / faster-whisper base (CPU int8)
|
||||||
|
|
||||||
## 🧪 마지막 검증 상태
|
|
||||||
|
|
||||||
| 게이트 | 결과 |
|
|
||||||
|---|---|
|
|
||||||
| desktop `tsc --noEmit` | ✅ EXIT 0 |
|
|
||||||
| web `tsc --noEmit` | ✅ EXIT 0 |
|
|
||||||
| Payple Edge Functions | 🔲 미배포 |
|
|
||||||
| DB migration | 🔲 미배포 |
|
|
||||||
| 웹 결제 E2E | 🔲 미테스트 |
|
|
||||||
| 대시보드 시각 확인 | 🔲 미확인 |
|
|
||||||
| git push | ⏳ 미완 |
|
|
||||||
|
|
||||||
## 🎯 다음 세션 시작 프롬프트
|
|
||||||
|
|
||||||
```
|
|
||||||
D3RO-VOICE Phase 3.2-B Payple 결제 연동 테스트 + 대시보드 확인.
|
|
||||||
|
|
||||||
지난 세션에서 Payple 결제 연동 코드 구현 완료 (27파일 커밋).
|
|
||||||
아직 테스트/배포 미완.
|
|
||||||
|
|
||||||
## 시작 전 반드시
|
|
||||||
1. /session-handoff resume
|
|
||||||
2. memory/handoff-latest.md
|
|
||||||
3. memory/project_status.md
|
|
||||||
|
|
||||||
## 첫 액션 — dev 서버 기동
|
|
||||||
pgrep + lsof로 생존 확인, 죽어있으면 nohup 기동.
|
|
||||||
|
|
||||||
## 우선순위
|
|
||||||
A) Payple 테스트 (가맹점 등록 완료 시)
|
|
||||||
- supabase db push (migration)
|
|
||||||
- supabase secrets set PAYPLE_*
|
|
||||||
- supabase functions deploy payple-checkout payple-webhook payple-manage
|
|
||||||
- 웹 billing 페이지에서 테스트 결제
|
|
||||||
- Electron 업그레이드 버튼 → 웹 열기 확인
|
|
||||||
|
|
||||||
B) 대시보드 시각 확인
|
|
||||||
- Premium LLM LED, 백엔드 카드, 쿼터 바
|
|
||||||
|
|
||||||
C) 세션 만료 버그 수정
|
|
||||||
|
|
||||||
D) 관리자 백엔드 CRM (백로그)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔗 참고 문서
|
|
||||||
|
|
||||||
- `memory/project_status.md` — 전체 현황
|
|
||||||
- `server/supabase/functions/_shared/payple.ts` — Payple API 래퍼
|
|
||||||
- `server/supabase/functions/payple-checkout/index.ts` — 결제 Edge Function
|
|
||||||
- `apps/web/src/components/billing/payple-checkout-button.tsx` — 웹 결제 컴포넌트
|
|
||||||
- `apps/desktop/src/renderer/pages/DashboardPage.tsx` — 대시보드 Premium UI
|
|
||||||
- https://docs.payple.kr/ — Payple 개발자 문서
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue