# 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/월 ```