feat: 대역폭 추정 및 DAU 표시 기능 추가
- 동시접속자 기반 월간 대역폭 자동 추정 - DAU(일일활성사용자) 추정치 표시 (동접 × 10-14) - 대역폭 기반 Linode/Vultr 자동 선택 로직 - 비용 분석에 대역폭 비용 포함 - 지역 미선택시 서울/도쿄/오사카/싱가포르 기본 표시 - 지역별 서버 분리 표시 (GROUP BY instance + region) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
422
DEPLOYMENT.md
Normal file
422
DEPLOYMENT.md
Normal file
@@ -0,0 +1,422 @@
|
||||
# Deployment Checklist
|
||||
|
||||
Complete checklist for deploying the Server Recommendation System to Cloudflare Workers.
|
||||
|
||||
---
|
||||
|
||||
## Pre-Deployment Checklist
|
||||
|
||||
### Development Environment ✅
|
||||
- [x] Node.js 18+ installed
|
||||
- [x] Dependencies installed (`npm install`)
|
||||
- [x] TypeScript compilation passes (`npm run typecheck`)
|
||||
- [x] Code structure verified
|
||||
|
||||
### Cloudflare Account
|
||||
- [ ] Cloudflare account created/logged in
|
||||
- [ ] Wrangler CLI authenticated (`npx wrangler login`)
|
||||
|
||||
---
|
||||
|
||||
## Step-by-Step Deployment
|
||||
|
||||
### Step 1: Create D1 Database (2 minutes)
|
||||
|
||||
```bash
|
||||
# Create database
|
||||
npx wrangler d1 create server-recommend-db
|
||||
```
|
||||
|
||||
**Expected Output:**
|
||||
```
|
||||
✅ Successfully created DB 'server-recommend-db'!
|
||||
|
||||
[[d1_databases]]
|
||||
binding = "DB"
|
||||
database_name = "server-recommend-db"
|
||||
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
```
|
||||
|
||||
**Action Required:**
|
||||
- [ ] Copy the `database_id` value
|
||||
- [ ] Open `wrangler.toml`
|
||||
- [ ] Replace empty `database_id = ""` with your actual ID
|
||||
- [ ] Save file
|
||||
|
||||
---
|
||||
|
||||
### Step 2: Create KV Namespace (1 minute)
|
||||
|
||||
```bash
|
||||
# Create KV namespace
|
||||
npx wrangler kv:namespace create CACHE
|
||||
```
|
||||
|
||||
**Expected Output:**
|
||||
```
|
||||
🌀 Creating namespace with title "server-recommend-CACHE"
|
||||
✨ Success!
|
||||
Add the following to your configuration file:
|
||||
|
||||
[[kv_namespaces]]
|
||||
binding = "CACHE"
|
||||
id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
||||
```
|
||||
|
||||
**Action Required:**
|
||||
- [ ] Copy the `id` value
|
||||
- [ ] Open `wrangler.toml`
|
||||
- [ ] Replace empty `id = ""` with your actual ID
|
||||
- [ ] Save file
|
||||
|
||||
**Verify wrangler.toml:**
|
||||
```toml
|
||||
[[d1_databases]]
|
||||
binding = "DB"
|
||||
database_name = "server-recommend-db"
|
||||
database_id = "YOUR_ACTUAL_DATABASE_ID" # ← Should be filled
|
||||
|
||||
[[kv_namespaces]]
|
||||
binding = "CACHE"
|
||||
id = "YOUR_ACTUAL_KV_ID" # ← Should be filled
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: Initialize Database (2 minutes)
|
||||
|
||||
```bash
|
||||
# Create tables and indexes
|
||||
npx wrangler d1 execute server-recommend-db --file=schema.sql
|
||||
```
|
||||
|
||||
**Expected Output:**
|
||||
```
|
||||
🌀 Mapping SQL input into an array of statements
|
||||
🌀 Executing on server-recommend-db (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx):
|
||||
🚣 Executed 7 commands in X.XXXs
|
||||
```
|
||||
|
||||
**Checklist:**
|
||||
- [ ] Command executed successfully
|
||||
- [ ] No errors in output
|
||||
- [ ] Tables created (providers, servers, server_regions)
|
||||
- [ ] Indexes created
|
||||
|
||||
**Verify:**
|
||||
```bash
|
||||
# Check tables
|
||||
npx wrangler d1 execute server-recommend-db --command "SELECT name FROM sqlite_master WHERE type='table'"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: Seed Sample Data (1 minute)
|
||||
|
||||
```bash
|
||||
# Insert sample server data
|
||||
npx wrangler d1 execute server-recommend-db --file=seed.sql
|
||||
```
|
||||
|
||||
**Expected Output:**
|
||||
```
|
||||
🌀 Mapping SQL input into an array of statements
|
||||
🌀 Executing on server-recommend-db (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx):
|
||||
🚣 Executed XX commands in X.XXXs
|
||||
```
|
||||
|
||||
**Verify:**
|
||||
```bash
|
||||
# Check row counts
|
||||
npx wrangler d1 execute server-recommend-db --command "SELECT COUNT(*) as count FROM servers"
|
||||
```
|
||||
|
||||
**Expected:** `count = 13` (sample data includes 13 servers)
|
||||
|
||||
**Checklist:**
|
||||
- [ ] Command executed successfully
|
||||
- [ ] 4 providers inserted
|
||||
- [ ] 13 servers inserted
|
||||
- [ ] Regional data inserted
|
||||
|
||||
---
|
||||
|
||||
### Step 5: Local Testing (2 minutes)
|
||||
|
||||
```bash
|
||||
# Start development server
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**Expected Output:**
|
||||
```
|
||||
⛅️ wrangler 4.60.0
|
||||
-------------------
|
||||
⎔ Starting local server...
|
||||
[wrangler:inf] Ready on http://localhost:8787
|
||||
```
|
||||
|
||||
**In another terminal:**
|
||||
```bash
|
||||
# Run test suite
|
||||
./test.sh
|
||||
```
|
||||
|
||||
**Or manual tests:**
|
||||
```bash
|
||||
# Health check
|
||||
curl http://localhost:8787/api/health
|
||||
|
||||
# List servers
|
||||
curl http://localhost:8787/api/servers | jq .
|
||||
|
||||
# Get recommendation
|
||||
curl -X POST http://localhost:8787/api/recommend \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"cpu_cores": 2,
|
||||
"memory_gb": 4,
|
||||
"storage_gb": 80
|
||||
}' | jq .
|
||||
```
|
||||
|
||||
**Checklist:**
|
||||
- [ ] Health endpoint returns 200
|
||||
- [ ] Servers endpoint returns data
|
||||
- [ ] Recommend endpoint works
|
||||
- [ ] AI generates recommendations
|
||||
- [ ] Cache works (second request faster)
|
||||
- [ ] No errors in console
|
||||
|
||||
---
|
||||
|
||||
### Step 6: Deploy to Production (1 minute)
|
||||
|
||||
```bash
|
||||
# Deploy to Cloudflare Workers
|
||||
npm run deploy
|
||||
```
|
||||
|
||||
**Expected Output:**
|
||||
```
|
||||
⛅️ wrangler 4.60.0
|
||||
-------------------
|
||||
Total Upload: XX.XX KiB / gzip: XX.XX KiB
|
||||
Uploaded server-recommend (X.XX sec)
|
||||
Published server-recommend (X.XX sec)
|
||||
https://server-recommend.YOUR_SUBDOMAIN.workers.dev
|
||||
Current Deployment ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
```
|
||||
|
||||
**Action Required:**
|
||||
- [ ] Copy the deployed worker URL
|
||||
- [ ] Save it for testing
|
||||
|
||||
**Checklist:**
|
||||
- [ ] Deployment successful
|
||||
- [ ] Worker URL obtained
|
||||
- [ ] No deployment errors
|
||||
|
||||
---
|
||||
|
||||
### Step 7: Production Testing (2 minutes)
|
||||
|
||||
**Replace with your actual worker URL:**
|
||||
```bash
|
||||
export WORKER_URL="https://server-recommend.YOUR_SUBDOMAIN.workers.dev"
|
||||
```
|
||||
|
||||
**Run tests:**
|
||||
```bash
|
||||
# Test with your URL
|
||||
./test.sh $WORKER_URL
|
||||
|
||||
# Or manual tests
|
||||
curl $WORKER_URL/api/health
|
||||
|
||||
curl "$WORKER_URL/api/servers?minCpu=4"
|
||||
|
||||
curl -X POST $WORKER_URL/api/recommend \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @test-request.json | jq .
|
||||
```
|
||||
|
||||
**Checklist:**
|
||||
- [ ] Health check works
|
||||
- [ ] Server listing works
|
||||
- [ ] Recommendations work
|
||||
- [ ] Response times acceptable
|
||||
- [ ] No 500 errors
|
||||
|
||||
---
|
||||
|
||||
### Step 8: Monitor Deployment (Ongoing)
|
||||
|
||||
```bash
|
||||
# View real-time logs
|
||||
npx wrangler tail
|
||||
```
|
||||
|
||||
**Cloudflare Dashboard:**
|
||||
1. Go to https://dash.cloudflare.com/
|
||||
2. Navigate to Workers & Pages
|
||||
3. Click on `server-recommend`
|
||||
4. View metrics:
|
||||
- [ ] Request rate
|
||||
- [ ] Success rate
|
||||
- [ ] Errors
|
||||
- [ ] Invocation duration
|
||||
|
||||
---
|
||||
|
||||
## Post-Deployment Verification
|
||||
|
||||
### Functional Tests
|
||||
- [ ] ✅ Health endpoint: `GET /api/health`
|
||||
- [ ] ✅ Server list: `GET /api/servers`
|
||||
- [ ] ✅ Server filtering: `GET /api/servers?minCpu=4&minMemory=8`
|
||||
- [ ] ✅ Recommendations: `POST /api/recommend`
|
||||
- [ ] ✅ Cache working (second request faster)
|
||||
- [ ] ✅ CORS headers present
|
||||
- [ ] ✅ Error handling works
|
||||
|
||||
### Performance Tests
|
||||
- [ ] Cold start: < 100ms
|
||||
- [ ] Cached response: < 100ms
|
||||
- [ ] AI response: 2-5s (first request)
|
||||
- [ ] Database query: < 50ms
|
||||
|
||||
### Security Tests
|
||||
- [ ] Input validation working
|
||||
- [ ] SQL injection protected
|
||||
- [ ] Error messages safe
|
||||
- [ ] CORS properly configured
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Issue: "Database not found"
|
||||
**Solution:**
|
||||
1. Verify `database_id` in `wrangler.toml`
|
||||
2. List databases: `npx wrangler d1 list`
|
||||
3. Re-create if needed: `npx wrangler d1 create server-recommend-db`
|
||||
|
||||
### Issue: "KV namespace not found"
|
||||
**Solution:**
|
||||
1. Verify `id` in `wrangler.toml`
|
||||
2. List namespaces: `npx wrangler kv:namespace list`
|
||||
3. Re-create if needed: `npx wrangler kv:namespace create CACHE`
|
||||
|
||||
### Issue: "No servers found"
|
||||
**Solution:**
|
||||
1. Verify seed data: `npx wrangler d1 execute server-recommend-db --command "SELECT COUNT(*) FROM servers"`
|
||||
2. Re-seed if needed: `npx wrangler d1 execute server-recommend-db --file=seed.sql`
|
||||
|
||||
### Issue: "Workers AI error"
|
||||
**Solution:**
|
||||
1. Workers AI is automatic, no configuration needed
|
||||
2. Check quota in Cloudflare dashboard
|
||||
3. Verify model name: `@cf/meta/llama-3.1-8b-instruct`
|
||||
|
||||
### Issue: "Deployment fails"
|
||||
**Solution:**
|
||||
1. Check `wrangler.toml` syntax
|
||||
2. Verify all IDs filled
|
||||
3. Run `npm run typecheck`
|
||||
4. Check authentication: `npx wrangler whoami`
|
||||
|
||||
---
|
||||
|
||||
## Rollback Procedure
|
||||
|
||||
If deployment has issues:
|
||||
|
||||
```bash
|
||||
# Rollback to previous deployment
|
||||
npx wrangler rollback
|
||||
|
||||
# Or deploy specific version
|
||||
npx wrangler rollback --deployment-id <DEPLOYMENT_ID>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria
|
||||
|
||||
Deployment is successful when:
|
||||
|
||||
✅ All 3 API endpoints return 200 status
|
||||
✅ AI recommendations generated correctly
|
||||
✅ Cache hit rate > 0% after multiple requests
|
||||
✅ No 500 errors in logs
|
||||
✅ Response times within targets
|
||||
✅ Database queries working
|
||||
✅ Sample data accessible
|
||||
|
||||
---
|
||||
|
||||
## Next Steps After Deployment
|
||||
|
||||
### Immediate
|
||||
1. [ ] Test all endpoints thoroughly
|
||||
2. [ ] Monitor logs for errors
|
||||
3. [ ] Verify cache working
|
||||
4. [ ] Document worker URL
|
||||
|
||||
### Short Term (1 week)
|
||||
1. [ ] Add production server data
|
||||
2. [ ] Monitor usage and performance
|
||||
3. [ ] Set up alerts for errors
|
||||
4. [ ] Adjust cache TTL if needed
|
||||
|
||||
### Long Term (1 month)
|
||||
1. [ ] Implement rate limiting
|
||||
2. [ ] Add authentication
|
||||
3. [ ] Set up custom domain
|
||||
4. [ ] Enhance AI prompts
|
||||
5. [ ] Add analytics
|
||||
6. [ ] Create admin interface
|
||||
|
||||
---
|
||||
|
||||
## Resource Limits Checklist
|
||||
|
||||
### Free Tier (Daily Limits)
|
||||
- [ ] Workers: < 100,000 requests/day
|
||||
- [ ] Workers AI: < 10,000 neurons/day
|
||||
- [ ] D1: < 5M reads/day, < 100K writes/day
|
||||
- [ ] KV: < 100,000 reads/day, < 1,000 writes/day
|
||||
|
||||
### Monitoring Alerts
|
||||
Set up alerts for:
|
||||
- [ ] Request rate > 80% of limit
|
||||
- [ ] Error rate > 1%
|
||||
- [ ] Response time > 5s (95th percentile)
|
||||
- [ ] AI quota > 80% usage
|
||||
|
||||
---
|
||||
|
||||
## Support Resources
|
||||
|
||||
- **Cloudflare Workers Docs:** https://developers.cloudflare.com/workers/
|
||||
- **Workers AI Docs:** https://developers.cloudflare.com/workers-ai/
|
||||
- **D1 Docs:** https://developers.cloudflare.com/d1/
|
||||
- **Community Discord:** https://discord.gg/cloudflaredev
|
||||
- **Status Page:** https://www.cloudflarestatus.com/
|
||||
|
||||
---
|
||||
|
||||
## Deployment Complete! 🎉
|
||||
|
||||
When all checkboxes are marked:
|
||||
- ✅ Worker deployed successfully
|
||||
- ✅ All endpoints tested
|
||||
- ✅ Monitoring in place
|
||||
- ✅ No errors detected
|
||||
|
||||
**Your Server Recommendation System is now LIVE!**
|
||||
|
||||
Worker URL: `https://server-recommend.YOUR_SUBDOMAIN.workers.dev`
|
||||
|
||||
Share this URL with users to start receiving recommendations!
|
||||
Reference in New Issue
Block a user