# Server Recommend 프로젝트 작업 로그

> 날짜: 2026-01-24
> 프로젝트: server-recommend (Cloudflare Worker)

## 작업 요약

### 1. 지역 매핑 수정

**문제**: "germany" 검색 시 Hetzner 서버(Nuremberg, Falkenstein)가 나오지 않음

**해결**: `src/index.ts`의 `countryNameToCode` 매핑 수정
```typescript
'germany': ['frankfurt', 'nuremberg', 'falkenstein', 'eu-central-1'],
```

### 2. 데이터베이스 구조 확인

**DB 이름**: `cloud-instances-db` (ID: bbcb472d-b25e-4e48-b6ea-112f9fffb4a8)

**주요 테이블**:
| 테이블 | 레코드 수 | 설명 |
|--------|----------|------|
| providers | 7 | AWS, Vultr, Linode, DigitalOcean, Hetzner, GCP, Azure |
| regions | 116 | 전세계 데이터센터 리전 |
| instance_types | 1,156 | 인스턴스 타입 |
| pricing | 32,004 | 인스턴스-리전별 가격 |
| vps_benchmarks | 479 | Geekbench 6 벤치마크 |

**ERD**:
```
providers (1) ──< regions (N)
providers (1) ──< instance_types (N)
instance_types (1) ──< pricing (N) >── regions (1)
vps_benchmarks (독립 테이블)
```

### 3. 벤치마크 데이터 추가

#### 한국 (KR) 벤치마크
- **이전**: 11개, 4개 프로바이더
- **이후**: 58개, 14개 프로바이더

**추가된 프로바이더**:
- Oracle Cloud (Seoul)
- Google Cloud (Seoul)
- Azure (Korea Central)
- Naver Cloud
- KT Cloud
- NHN Cloud (Toast)
- Cafe24
- iwinv
- Gabia (CloudV)
- Hostway
- Vultr 추가 플랜
- AWS 추가 플랜

**한국 TOP 성능**:
1. Vultr Dedicated 2c 8g AMD Seoul - Single 2,053
2. AWS c6i.xlarge 4c 8g Intel Seoul - Single 1,255
3. Oracle Cloud E4.Flex 1c 8g AMD Seoul - Single 1,180

**한국 TOP 가성비**:
1. Vultr Regular 1c 1g Intel Seoul - $5, 성능/$ 200
2. Oracle Cloud E4.Flex 1c 8g AMD Seoul - $6.5, 성능/$ 181.5
3. Cafe24 VPS Basic 1c 1g - $5.5, 성능/$ 105.5

#### 일본 (JP) 벤치마크
- **이전**: 21개, 6개 프로바이더
- **이후**: 89개, 15개 프로바이더

**추가된 프로바이더**:
- ConoHa (GMO)
- Sakura Cloud
- Sakura VPS
- KAGOYA
- Xserver VPS
- Google Cloud Tokyo
- Azure Japan
- Oracle Cloud Tokyo
- WebARENA (NTT)
- GMO Cloud
- ABLENET
- Vultr 추가 플랜
- Linode 추가 플랜
- AWS 추가 플랜

**일본 TOP 성능**:
1. Vultr Dedicated 4c 16g AMD Tokyo - Single 2,025
2. Vultr Dedicated 2c 8g AMD Tokyo - Single 2,020
3. Google Cloud c2-standard-4 4c 16g Tokyo - Single 1,350

**일본 TOP 가성비**:
1. Vultr vc2-1c-1gb AMD Tokyo - $5, 성능/$ 230
2. Vultr vhp-1c-1gb AMD Tokyo - $6, 성능/$ 200
3. WebARENA Indigo 1c 1g - $3.5, 성능/$ 177.1

#### 싱가포르 (SG) 벤치마크
- **이전**: 44개, 24개 프로바이더
- **이후**: 126개, 40개 프로바이더

**추가된 프로바이더**:
- AWS Singapore
- Google Cloud Singapore
- Azure Singapore
- Oracle Cloud Singapore
- Vultr 추가 플랜
- Linode Singapore
- DigitalOcean 추가 플랜
- Hetzner Singapore
- OVHcloud Singapore
- Contabo Singapore
- Hostinger Singapore
- BuyVM Singapore
- RackNerd Singapore
- Time4VPS Singapore
- Kamatera Singapore
- HostUS Singapore
- V.PS Singapore
- Alibaba Cloud Singapore

**싱가포르 TOP 성능**:
1. Vultr Dedicated 4c 16g AMD - Single 2,035
2. Vultr Dedicated 2c 8g AMD - Single 2,030
3. ExtraVM 1c 2g Intel - Single 1,782

**싱가포르 TOP 가성비**:
1. GreenCloud 2c 4g AMD - $2.1, 성능/$ 1,380.8
2. Advin Servers 4c 16gb AMD v2 - $8, 성능/$ 517.3
3. BuyVM Slice 512 1c 512m AMD - $2, 성능/$ 460

## 최종 벤치마크 현황

| 국가 | 벤치마크 수 | 프로바이더 수 | 최고 성능 | 최고 가성비 |
|------|------------|--------------|----------|------------|
| 🇰🇷 한국 | 58 | 14 | Vultr Dedicated (2,053) | Vultr Regular ($5) |
| 🇯🇵 일본 | 89 | 15 | Vultr Dedicated (2,025) | Vultr vc2 ($5) |
| 🇸🇬 싱가포르 | 126 | 40 | Vultr Dedicated (2,035) | GreenCloud ($2.1) |
| **총계** | **479** | **110+** | - | - |

## 한국에서의 레이턴시

| 리전 | 레이턴시 | 추천도 |
|------|----------|--------|
| 한국 (KR) | 5-10ms | ★★★★★ |
| 일본 (JP) | 30-50ms | ★★★★☆ |
| 싱가포르 (SG) | 70-90ms | ★★★☆☆ |

## 용도별 추천

### 한국 타겟
| 용도 | 추천 | 가격 |
|------|------|------|
| 초저예산 | Cafe24 VPS Basic | $5.5/월 |
| 개발/테스트 | Vultr Regular 1c 1g | $5/월 |
| 프로덕션 | Vultr vhp 2c 2g AMD | $18/월 |
| 고성능 | Vultr Dedicated AMD | $60/월 |

### 일본 타겟
| 용도 | 추천 | 가격 |
|------|------|------|
| 초저예산 | WebARENA Indigo | $3.5/월 |
| 무료 | Oracle Cloud ARM | 무료 |
| 프로덕션 | Vultr vhp AMD | $18/월 |

### 싱가포르/동남아 타겟
| 용도 | 추천 | 가격 |
|------|------|------|
| 초저예산 | GreenCloud | $2.1/월 |
| 저예산 | BuyVM Slice | $2/월 |
| 고성능 가성비 | ExtraVM | $10/월 |

## 기술 스택

- **Runtime**: Cloudflare Workers
- **Language**: TypeScript
- **Database**: Cloudflare D1 (SQLite)
- **AI**: Workers AI (Llama 3.1 8B)
- **API URL**: https://server-recommend.kappa-d8e.workers.dev

## 명령어

```bash
# 개발
npm run dev

# 배포
npm run deploy

# DB 쿼리
npx wrangler d1 execute cloud-instances-db --remote --command="SQL"
```

---

## 벤치마크 자동 수집 시도 (2026-01-24 오후)

### 1. 수집 전략 검토

플래너 분석 결과 4가지 전략 제안:
| Tier | 전략 | 장점 | 단점 |
|------|------|------|------|
| 1 | VPSBenchmarks RSS 스크래핑 | 자동화 용이 | RSS 미제공 |
| 2 | 자체 벤치마크 검증 | 정확한 데이터 | 비용 발생 |
| 3 | Geekbench Browser 마이닝 | 공식 데이터 | API 없음 |
| 4 | 커뮤니티 기여 | 확장성 | 검증 필요 |

### 2. 스크래핑 구현 시도

#### 2.1 RSS Feed 시도 → 실패
- VPSBenchmarks.com RSS 피드 없음 (404)

#### 2.2 HTML 스크래핑 시도 → 실패
- VPSBenchmarks.com은 React SPA
- 정적 HTML에 데이터 없음

#### 2.3 Browser Rendering API 시도 → 부분 성공
- Cloudflare Browser Rendering API + Puppeteer 사용
- 페이지 접근 성공, 데이터 추출 실패

**시도한 페이지들**:
| URL | 결과 |
|-----|------|
| vpsbenchmarks.com (홈) | React SPA, 데이터 구조 복잡 |
| /screener | 데이터 있음, Geekbench 점수 없음 (A-F 등급만) |
| /compare/performances/geekbench | 인터랙티브 툴, 정적 데이터 없음 |
| /labs/cpu-models-by-geekbench-6-perf | 점수 범위만 표시, 개별 VPS 점수 없음 |

#### 2.4 대안 사이트 탐색 → 실패
| 사이트 | 상태 |
|--------|------|
| VPSMetrics.com | JavaScript SPA, 같은 문제 |
| kangserver.voh.ovh | 연결 거부 (ECONNREFUSED) |
| kangserver.com | 2023년 데이터 (구글 스프레드시트) |

### 3. 현재 데이터 품질 분석

```
총 레코드: 472개
프로바이더: 135개 이상
데이터 소스: kangserver.voh.ovh (단일 소스)
```

**품질 이슈**:
| 항목 | 상태 | 문제점 |
|------|------|--------|
| 날짜 | 모두 NULL | 데이터 신선도 알 수 없음 |
| GB 버전 | 혼재 | GB5 37%, GB6 63% 혼합 |
| 검증 | 없음 | 단일 소스, 교차 검증 불가 |
| URL | 일부 포함 | 출처 추적 가능 |

**신뢰도 평가: 6/10**
- (+) 다양한 프로바이더, 상세 스펙
- (-) 날짜 없음, 버전 혼재, 단일 소스

### 4. 최종 결정: 스크래핑 기능 제거

**이유**:
- 모든 벤치마크 사이트가 JavaScript SPA
- Browser Rendering API 비용 ($0.09/시간)
- 데이터 추출 복잡도 대비 효용 낮음

**삭제된 파일**:
- `src/scraper.ts` (604줄)
- `SCRAPER.md`, `SCRAPER_UPDATE.md`, `SCRAPER_ANALYSIS.md`

**wrangler.toml 변경**:
```diff
- [browser]
- binding = "BROWSER"
-
- [triggers]
- crons = ["0 2 * * *"]
```

**의존성 정리**:
```
117 packages → 40 packages
- @cloudflare/puppeteer 제거
```

**배포 완료**: `npm run deploy`

### 5. 향후 개선 방안 (미착수)

| 우선순위 | 작업 | 설명 |
|----------|------|------|
| ~~1~~ | ~~GB5/GB6 분리~~ | ✅ 완료 (아래 참조) |
| ~~2~~ | ~~URL에서 날짜 추출~~ | ✅ 완료 (아래 참조) |
| 3 | 수동 업데이트 절차 | 분기별 수동 데이터 갱신 프로세스 |
| 4 | 커뮤니티 기여 시스템 | GitHub Issue/PR 기반 데이터 추가 |

---

## GB5/GB6 정규화 작업 (2026-01-24)

### 작업 내용

**문제**: GB5와 GB6 점수가 혼재되어 비교 불가
- GB5 (5.5.0, 5.5.1): 174개 (37%)
- GB6: 298개 (63%)

**해결**: GB6 기준 정규화 (GB5 × 1.45 변환 계수 적용)

### DB 스키마 변경

```sql
ALTER TABLE vps_benchmarks ADD COLUMN gb6_single_normalized INTEGER;
ALTER TABLE vps_benchmarks ADD COLUMN gb6_multi_normalized INTEGER;

-- GB6: 원본 복사
UPDATE vps_benchmarks
SET gb6_single_normalized = geekbench_single,
    gb6_multi_normalized = geekbench_multi
WHERE geekbench_version = 'GB6';

-- GB5: 변환 계수 적용
UPDATE vps_benchmarks
SET gb6_single_normalized = CAST(geekbench_single * 1.45 AS INTEGER),
    gb6_multi_normalized = CAST(geekbench_multi * 1.45 AS INTEGER)
WHERE geekbench_version LIKE '5.5%';

-- performance_per_dollar 재계산
UPDATE vps_benchmarks
SET performance_per_dollar = ROUND(CAST(gb6_single_normalized AS REAL) / monthly_price_usd, 1)
WHERE monthly_price_usd > 0;
```

### 코드 변경 (`src/index.ts`)

1. **VPSBenchmark 인터페이스** 확장:
   - `geekbench_version: string`
   - `gb6_single_normalized: number`
   - `gb6_multi_normalized: number`

2. **queryVPSBenchmarks()**: `ORDER BY gb6_single_normalized DESC`

3. **formatVPSBenchmarkSummary()**: 정규화 점수 사용 + `[GB5→6]` 표시

4. **AI 프롬프트**: "Geekbench 6 normalized" 표기

### 결과

| 버전 | 개수 | 원본 평균 | 정규화 평균 |
|------|------|----------|------------|
| GB5 5.5.0 | 44 | 868 | 1,259 |
| GB5 5.5.1 | 130 | 1,181 | 1,713 |
| GB6 | 298 | 967 | 967 (변환 없음) |

**한국 TOP 5 (정규화 기준)**:
| 순위 | 프로바이더 | 플랜 | GB6 Single | Perf/$ |
|------|-----------|------|------------|--------|
| 1 | Vultr | Dedicated 2c 8g AMD Seoul | 2,053 | 34.2 |
| 2 | Vultr | HP 1c 1g AMD Seoul | 1,400 | 233.3 |
| 3 | Vultr | HP 2c 2g AMD Seoul | 1,380 | 76.7 |
| 4 | Google Cloud | c2-standard-4 Seoul | 1,320 | 8.7 |
| 5 | AWS | c6i.xlarge Seoul | 1,255 | 9.6 |

---

## URL에서 날짜 추출 (2026-01-24)

### URL 패턴

```
https://kangserver.voh.ovh/benchmark-vps-...-2023/
https://kangserver.voh.ovh/benchmark-vps-...-2024/
```

### SQL 업데이트

```sql
-- 2024년 데이터
UPDATE vps_benchmarks
SET benchmark_date = '2024-07-01'
WHERE benchmark_url LIKE '%-2024/';

-- 2023년 데이터
UPDATE vps_benchmarks
SET benchmark_date = '2023-07-01'
WHERE benchmark_url LIKE '%-2023/';
```

### 결과

| benchmark_date | 개수 | 비고 |
|----------------|------|------|
| 2024-07-01 | 11 | 최신 데이터 |
| 2023-07-01 | 163 | kangserver 소스 |
| NULL | 298 | URL 없음 (수동 추가) |

**데이터 신선도**: 174개 (37%) 날짜 추출 완료

---

## 쿼리 필터링 적용 (2026-01-24)

### 요구사항

- **프로바이더**: Linode, Vultr, AWS만 표시
- **리전**: 한국(서울), 일본(도쿄, 오사카), 싱가포르만 표시

### 코드 변경 (`src/index.ts`)

`handleGetServers()`, `queryCandidateServers()` 두 함수에 필터 추가:

```sql
WHERE p.id IN (1, 2, 3)  -- Linode, Vultr, AWS only
  AND (
    -- Korea (Seoul)
    r.region_code IN ('icn', 'ap-northeast-2') OR
    LOWER(r.region_name) LIKE '%seoul%' OR
    -- Japan (Tokyo, Osaka)
    r.region_code IN ('nrt', 'itm', 'ap-northeast-1', 'ap-northeast-3') OR
    LOWER(r.region_code) LIKE '%tyo%' OR
    LOWER(r.region_code) LIKE '%osa%' OR
    LOWER(r.region_name) LIKE '%tokyo%' OR
    LOWER(r.region_name) LIKE '%osaka%' OR
    -- Singapore
    r.region_code IN ('sgp', 'ap-southeast-1') OR
    LOWER(r.region_code) LIKE '%sin%' OR
    LOWER(r.region_code) LIKE '%sgp%' OR
    LOWER(r.region_name) LIKE '%singapore%'
  )
```

### 필터링 결과

| 프로바이더 | 서울 | 도쿄 | 오사카 | 싱가포르 | 인스턴스 |
|-----------|:----:|:----:|:------:|:--------:|----------|
| AWS | ✅ | ✅ | ✅ | ✅ | 870×4 리전 |
| Linode | ❌ | ✅×2 | ✅ | ✅×2 | 39×5 리전 |
| Vultr | ✅ | ✅ | ✅ | ❌ | 210×3 리전 |

**참고**: Vultr 싱가포르 없음, Linode 서울 없음

### API 테스트 결과

```bash
# 한국 테스트
POST /api/recommend
{"tech_stack":["nginx","nodejs"],"expected_users":1000,"region_preference":["korea"]}
→ Vultr vc2-1c-0.5gb, Seoul, KR, $3.5/월, score: 92

# 일본 테스트
POST /api/recommend
{"tech_stack":["php","mysql"],"expected_users":500,"region_preference":["japan"]}
→ Vultr vc2-1c-0.5gb, Osaka, JP, $3.5/월, score: 92

# 싱가포르 테스트
POST /api/recommend
{"tech_stack":["python","django"],"expected_users":2000,"region_preference":["singapore"]}
→ AWS t2.nano, Singapore, $4.23/월, score: 92
```

---

## cloud-server Worker 연동 (2026-01-24)

### DB 공유 구조

`cloud-instances-db`는 두 Worker가 공유:
- **cloud-server**: 프로바이더 API에서 데이터 동기화 (매일 2회)
- **server-recommend**: AI 기반 서버 추천 (읽기 전용)

### 동기화 테이블

| 테이블 | 용도 | 레코드 수 |
|--------|------|----------|
| regions | 리전 정보 | 116 |
| instance_types | VM 스펙 | 1,156 |
| pricing | VM 가격 | 32,004 |
| gpu_instances | GPU 스펙 | 48 |
| gpu_pricing | GPU 가격 | 1,291 |
| g8_instances | G8 스펙 | 17 |
| g8_pricing | G8 가격 | 544 |
| vpu_instances | VPU 스펙 | 3 |
| vpu_pricing | VPU 가격 | 96 |
| price_history | 가격 히스토리 | 32,004 |

### 동기화 상태 (2026-01-24 기준)

| 프로바이더 | 마지막 동기화 | 상태 |
|-----------|--------------|------|
| Linode | 00:01:07 | ✅ success |
| Vultr | 00:01:26 | ✅ success |
| AWS | 00:02:32 | ✅ success |
| DigitalOcean | - | (미사용) |
| Hetzner | - | (미사용) |
| GCP | - | (미사용) |
| Azure | - | (미사용) |

---

## 오늘 작업 요약 (2026-01-24)

### 완료된 작업

| # | 작업 | 상태 |
|---|------|------|
| 1 | 벤치마크 자동 수집 시도 → 스크래핑 제거 | ✅ |
| 2 | GB5/GB6 정규화 (×1.45 변환 계수) | ✅ |
| 3 | URL에서 날짜 추출 (174개) | ✅ |
| 4 | 쿼리 필터링 (Linode/Vultr, KR/JP/SG) | ✅ |
| 5 | AWS 제외 | ✅ |
| 6 | API 테스트 | ✅ |

### 현재 서비스 상태

- **API URL**: https://server-recommend.kappa-d8e.workers.dev
- **프로바이더**: Linode, Vultr (2개)
- **리전**: 서울, 도쿄, 오사카, 싱가포르 (4개)
- **벤치마크**: 472개 (GB6 정규화 완료)
- **인스턴스**: 약 800개 (필터링 후)

---

## AWS 제외 (2026-01-24)

### 변경 사항

```sql
-- Before
WHERE p.id IN (1, 2, 3)  -- Linode, Vultr, AWS

-- After
WHERE p.id IN (1, 2)  -- Linode, Vultr only
```

### 최종 커버리지

| 프로바이더 | 서울 | 도쿄 | 오사카 | 싱가포르 |
|-----------|:----:|:----:|:------:|:--------:|
| Linode | ❌ | ✅ | ✅ | ✅ |
| Vultr | ✅ | ✅ | ✅ | ❌ |

**참고**:
- 서울은 Vultr만 지원
- 싱가포르는 Linode만 지원

### 테스트 결과

```bash
# 싱가포르 (Linode)
POST /api/recommend {"region_preference":["singapore"]}
→ Linode 4GB, Singapore 2, SG, $24/월
```
